HTTP(HyperTextTransferProtocol)是超文本傳輸協(xié)議的縮寫(xiě),它用于傳送WWW方式的數據,關(guān)于HTTP協(xié)議的詳細內容請參考RFC2616。HTTP是一個(gè)屬于應用層的面向對象的協(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展,得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進(jìn)行之中,而且HTTP-NG(NextGenerationofHTTP)的建議已經(jīng)提出。今天在實(shí)驗室把相關(guān)的RFC文檔仔細看了一下,對HTTP協(xié)議有了一個(gè)詳細的認識,本文將做一個(gè)詳細的介紹。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
1.支持客戶(hù)/服務(wù)器模式。
2.簡(jiǎn)單快速:客戶(hù)向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類(lèi)型的數據對象。正在傳輸的類(lèi)型由Content-Type加以標記。
4.無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶(hù)的請求,并收到客戶(hù)的應答后,即斷開(kāi)連接。采用這種方式可以節省傳輸時(shí)間。
5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著(zhù)如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應答就較快。
1.連接(Connection):一個(gè)傳輸層的實(shí)際環(huán)流,它是建立在兩個(gè)相互通訊的應用程序之間。
2.消息(Message):HTTP通訊的基本單位,包括一個(gè)結構化的八元組序列并通過(guò)連接傳輸。
3.請求(Request):一個(gè)從客戶(hù)端到服務(wù)器的請求信息包括應用于資源的方法、資源的標識符和協(xié)議的版本號
4.響應(Response):一個(gè)從服務(wù)器返回的信息包括HTTP協(xié)議的版本號、請求的狀態(tài)(例如“成功”或“沒(méi)找到”)和文檔的MIME類(lèi)型。
5.資源(Resource):由URI標識的網(wǎng)絡(luò )數據對象或服務(wù)。
6.實(shí)體(Entity):數據資源或來(lái)自服務(wù)資源的回映的一種特殊表示方法,它可能被包圍在一個(gè)請求或響應信息中。一個(gè)實(shí)體包括實(shí)體頭信息和實(shí)體的本身內容。
7.客戶(hù)機(Client):一個(gè)為發(fā)送請求目的而建立連接的應用程序。
8.用戶(hù)代理(Useragent):初始化一個(gè)請求的客戶(hù)機。它們是瀏覽器、編輯器或其它用戶(hù)工具。
9.服務(wù)器(Server):一個(gè)接受連接并對請求返回信息的應用程序。
10.源服務(wù)器(Originserver):是一個(gè)給定資源可以在其上駐留或被創(chuàng )建的服務(wù)器。
11.代理(Proxy):一個(gè)中間程序,它可以充當一個(gè)服務(wù)器,也可以充當一個(gè)客戶(hù)機,為其它客戶(hù)機建立請求。請求是通過(guò)可能的翻譯在內部或經(jīng)過(guò)傳遞到其它的服務(wù)器中。一個(gè)代理在發(fā)送請求信息之前,必須解釋并且如果可能重寫(xiě)它。代理經(jīng)常作為通過(guò)防火墻的客戶(hù)機端的門(mén)戶(hù),代理還可以作為一個(gè)幫助應用來(lái)通過(guò)協(xié)議處理沒(méi)有被用戶(hù)代理完成的請求。
12.網(wǎng)關(guān)(Gateway):一個(gè)作為其它服務(wù)器中間媒介的服務(wù)器。與代理不同的是,網(wǎng)關(guān)接受請求就好象對被請求的資源來(lái)說(shuō)它就是源服務(wù)器;發(fā)出請求的客戶(hù)機并沒(méi)有意識到它在同網(wǎng)關(guān)打交道。網(wǎng)關(guān)經(jīng)常作為通過(guò)防火墻的服務(wù)器端的門(mén)戶(hù),網(wǎng)關(guān)還可以作為一個(gè)協(xié)議翻譯器以便存取那些存儲在非HTTP系統中的資源。
13.通道(Tunnel):是作為兩個(gè)連接中繼的中介程序。一旦激活,通道便被認為不屬于HTTP通訊,盡管通道可能是被一個(gè)HTTP請求初始化的。當被中繼的連接兩端關(guān)閉時(shí),通道便消失。當一個(gè)門(mén)戶(hù)(Portal)必須存在或中介(Intermediary)不能解釋中繼的通訊時(shí)通道被經(jīng)常使用。
14.緩存(Cache):反應信息的局域存儲。
HTTP協(xié)議是基于請求/響應范式的。一個(gè)客戶(hù)機與服務(wù)器建立連接后,發(fā)送一個(gè)請求給服務(wù)器,請求方式的格式為,統一資源標識符、協(xié)議版本號,后邊是MIME信息包括請求修飾符、客戶(hù)機信息和可能的內容。服務(wù)器接到請求后,給予相應的響應信息,其格式為一個(gè)狀態(tài)行包括信息的協(xié)議版本號、一個(gè)成功或錯誤的代碼,后邊是MIME信息包括服務(wù)器信息、實(shí)體信息和可能的內容。 在Internet上,HTTP通訊通常發(fā)生在TCP/IP連接之上。缺省端口是TCP80,但其它的端口也是可用的。但這并不預示著(zhù)HTTP協(xié)議在Internet或其它網(wǎng)絡(luò )的其它協(xié)議之上才能完成。HTTP只預示著(zhù)一個(gè)可靠的傳輸。
首先,簡(jiǎn)單介紹基于HTTP協(xié)議的客戶(hù)/服務(wù)器模式的信息交換過(guò)程,它分四個(gè)過(guò)程,建立連接、發(fā)送請求信息、發(fā)送響應信息、關(guān)閉連接。在WWW中,“客戶(hù)”與“服務(wù)器”是一個(gè)相對的概念,只存在于一個(gè)特定的連接期間,即在某個(gè)連接中的客戶(hù)在另一個(gè)連接中可能作為服務(wù)器。WWW服務(wù)器運行時(shí),一直在TCP80端口(WWW的缺省端口)監聽(tīng),等待連接的出現。
1.建立連接 連接的建立是通過(guò)申請套接字(Socket)實(shí)現的??蛻?hù)打開(kāi)一個(gè)套接字并把它約束在一個(gè)端口上,如果成功,就相當于建立了一個(gè)虛擬文件。以后就可以在該虛擬文件上寫(xiě)數據并通過(guò)網(wǎng)絡(luò )向外傳送。
2.發(fā)送請求 打開(kāi)一個(gè)連接后,客戶(hù)機把請求消息送到服務(wù)器的停留端口上,完成提出請求動(dòng)作。
HTTP/1.0 請求消息的格式為:
請求消息=請求行(通用信息|請求頭|實(shí)體頭)CRLF[實(shí)體內容]
請求 行=方法 請求URL HTTP版本號 CRLF
方 法=GET|HEAD|POST|擴展方法
U R L=協(xié)議名稱(chēng)+宿主名+目錄與文件名
請求行中的方法描述指定資源中應該執行的動(dòng)作,常用的方法有GET、HEAD和POST。不同的請求對象對應GET的結果是不同的,對應關(guān)系如下:
對象 GET的結果
文件 文件的內容
程序 該程序的執行結果
數據庫查詢(xún) 查詢(xún)結果
HEAD——要求服務(wù)器查找某對象的元信息,而不是對象本身。
POST——從客戶(hù)機向服務(wù)器傳送數據,在要求服務(wù)器和CGI做進(jìn)一步處理時(shí)會(huì )用到POST方法。POST主要用于發(fā)送HTML文本中FORM的內容,讓CGI程序處理。
一個(gè)請求的例子為:
GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0
頭信息又稱(chēng)為元信息,即信息的信息,利用元信息可以實(shí)現有條件的請求或應答。
請求頭——告訴服務(wù)器怎樣解釋本次請求,主要包括用戶(hù)可以接受的數據類(lèi)型、壓縮方法和語(yǔ)言等。
實(shí)體頭——實(shí)體信息類(lèi)型、長(cháng)度、壓縮方法、最后一次修改時(shí)間、數據有效期等。
實(shí)體——請求或應答對象本身。
3.發(fā)送響應
服務(wù)器在處理完客戶(hù)的請求之后,要向客戶(hù)機發(fā)送響應消息。
HTTP/1.0的響應消息格式如下:
響應消息=狀態(tài)行(通用信息頭|響應頭|實(shí)體頭) CRLF 〔實(shí)體內容〕
狀態(tài)行=HTTP版本號 狀態(tài)碼 原因敘述
響應頭的信息包括:服務(wù)程序名,通知客戶(hù)請求的URL需要認證,請求的資源何時(shí)能使用。
4.關(guān)閉連接 客戶(hù)和服務(wù)器雙方都可以通過(guò)關(guān)閉套接字來(lái)結束TCP/IP對話(huà)
通常HTTP消息包括客戶(hù)機向服務(wù)器的請求消息和服務(wù)器向客戶(hù)機的響應消息。這兩種類(lèi)型的消息由一個(gè)起始行,一個(gè)或者多個(gè)頭域,一個(gè)只是頭域結束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應頭和實(shí)體頭四個(gè)部分。每個(gè)頭域由一個(gè)域名,冒號(:)和域值三部分組成。域名是大小寫(xiě)無(wú)關(guān)的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開(kāi)始處,使用至少一個(gè)空格或制表符。
通用頭域 通用頭域包含請求和響應消息都支持的頭域,通用頭域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴展要求通訊雙方都支持此擴展,如果存在不支持的通用頭域,一般將會(huì )作為實(shí)體頭域處理。下面簡(jiǎn)單介紹幾個(gè)在UPnP消息中使用的通用頭域。
Cache-Control頭域 Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control并不會(huì )修改另一個(gè)消息處理過(guò)程中的緩存處理過(guò)程。請求時(shí)的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各個(gè)消息中的指令含義如下:
Public指示響應可被任何緩存區緩存。
Private指示對于單個(gè)用戶(hù)的整個(gè)或部分響應消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當用戶(hù)的部分響應消息,此響應消息對于其他用戶(hù)的請求無(wú)效。
no-cache指示請求或響應消息不能緩存
no-store用于防止重要的信息被無(wú)意的發(fā)布。在請求消息中發(fā)送將使得請求和響應消息都不使用緩存。
max-age指示客戶(hù)機可以接收生存期不大于指定時(shí)間(以秒為單位)的響應。
min-fresh指示客戶(hù)機可以接收響應時(shí)間小于當前時(shí)間加上指定時(shí)間的響應。
max-stale指示客戶(hù)機可以接收超出超時(shí)期間的響應消息。如果指定max-stale消息的值,那么客戶(hù)機可以接收超出超時(shí)期指定值之內的響應消息。
Date頭域
Date頭域表示消息發(fā)送的時(shí)間,時(shí)間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時(shí)間表示世界標準時(shí),換算成本地時(shí)間,需要知道用戶(hù)所在的時(shí)區。
Pragma頭域
Pragma頭域用來(lái)包含實(shí)現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協(xié)議中,它的含義和Cache-Control:no-cache相同。
請求消息
請求消息的第一行為下面的格式:
Method
SP
Request-URI
HTTP-Version
CRLF
Method表示對于Request-URI完成的方法,這個(gè)字段是大小寫(xiě)敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD應該被所有的通用WEB服務(wù)器支持,其他所有方法的實(shí)現是可選的。GET方法取回由Request-URI標識的信息。HEAD方法也是取回由Request-URI標識的信息,只是可以在響應時(shí),不返回消息體。POST方法可以請求服務(wù)器接收包含在請求中的實(shí)體信息,可以用于提交表單,向新聞組、BBS、郵件群組和數據庫發(fā)送消息。SP表示空格。Request-URI遵循URI格式,在此字段為星號(*)時(shí),說(shuō)明請求并不用于某個(gè)特定的資源地址,而是用于服務(wù)器本身。HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。CRLF表示換行回車(chē)符。請求頭域允許客戶(hù)端向服務(wù)器傳遞關(guān)于請求或者關(guān)于客戶(hù)機的附加信息。請求頭域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。對請求頭域的擴展要求通訊雙方都支持,如果存在不支持的請求頭域,一般將會(huì )作為實(shí)體頭域處理。
典型的請求消息 GEThttp://class/download.microtool.de:80/somedata.exe
Host:download.microtool.de
Accept:*/*
Pragma:no-cache
Cache-Control:no-cache
Referer:http://class/download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
Host頭域
Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務(wù)器或網(wǎng)關(guān)的位置。HTTP/1.1請求必須包含主機頭域,否則系統會(huì )以400狀態(tài)碼返回。
Referer頭域
Referer頭域允許客戶(hù)端指定請求uri的源資源地址,這可以允許服務(wù)器生成回退鏈表,可用來(lái)登陸、優(yōu)化cache等。他也允許廢除的或錯誤的連接由于維護的目的被追蹤。如果請求的uri沒(méi)有自己的uri地址,Referer不能被發(fā)送。如果指定的是部分uri地址,則此地址應該是一個(gè)相對地址。
Range頭域
Range頭域可以請求實(shí)體的一個(gè)或者多個(gè)子范圍。 但是服務(wù)器可以忽略此請求頭,如果無(wú)條件GET包含Range請求頭,響應會(huì )以狀態(tài)碼206(PartialContent)返回而不是以200(OK)。
User-Agent頭域User-Agent頭域的內容包含發(fā)出請求的用戶(hù)信息。
響應消息 響應消息的第一行為下面的格式:
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF,HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。Status-Code是一個(gè)三個(gè)數字的結果代碼。Reason-Phrase給Status-Code提供一個(gè)簡(jiǎn)單的文本描述。Status-Code主要用于機器自動(dòng)識別,Reason-Phrase主要用于幫助用戶(hù)理解。Status-Code的第一個(gè)數字定義響應的類(lèi)別,后兩個(gè)數字沒(méi)有分類(lèi)的作用。第一個(gè)數字可能取5個(gè)不同的值:
1xx:信息響應類(lèi),表示接收到請求并且繼續處理
2xx:處理成功響應類(lèi),表示動(dòng)作被成功接收、理解和接受
3xx:重定向響應類(lèi),為了完成指定的動(dòng)作,必須接受進(jìn)一步處理
4xx:客戶(hù)端錯誤,客戶(hù)請求包含語(yǔ)法錯誤或者是不能正確執行
5xx:服務(wù)端錯誤,服務(wù)器不能正確執行一個(gè)正確的請求
響應頭域允許服務(wù)器傳遞不能放在狀態(tài)行的附加信息,這些域主要描述服務(wù)器的信息和Request-URI進(jìn)一步的信息。響應頭域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。對響應頭域的擴展要求通訊雙方都支持,如果存在不支持的響應頭域,一般將會(huì )作為實(shí)體頭域處理。
聯(lián)系客服