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