http - 互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。1960年美國人Ted Nelson構(gòu)思了一種通過計(jì)算機(jī)處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同合作研究,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

協(xié)議基礎(chǔ)
HTTP(HyperText Transport Protocol)是超文本傳輸協(xié)議的縮寫,它用于傳送WWW方式的數(shù)據(jù),關(guān)于HTTP協(xié)議的詳細(xì)內(nèi)容請參考RFC2616。HTTP協(xié)議采用了請求/響應(yīng)模型??蛻舳讼蚍?wù)器發(fā)送一個(gè)請求,請求頭包含請求的方法、URL、協(xié)議版本、以及包含請求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結(jié)構(gòu)。服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括消息協(xié)議的版本,成功或者錯(cuò)誤編碼加上包含服務(wù)器信息、實(shí)體元信息以及可能的實(shí)體內(nèi)容。
通常HTTP消息包括客戶機(jī)向服務(wù)器的請求消息和服務(wù)器向客戶機(jī)的響應(yīng)消息。這兩種類型的消息由一個(gè)起始行,一個(gè)或者多個(gè)頭域,一個(gè)指示頭域結(jié)束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應(yīng)頭和實(shí)體頭四個(gè)部分。每個(gè)頭域由一個(gè)域名,冒號(:)和域值三部分組成。域名是大小寫無關(guān)的,域值前可以添加任何數(shù)量的空格符,頭域可以被擴(kuò)展為多行,在每行開始處,使用至少一個(gè)空格或制表符。
通用頭域
通用頭域包含請求和響應(yīng)消息都支持的頭域,通用頭域包含Cache-Contro
l、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴(kuò)展要求通訊雙方都支持此擴(kuò)展,如果存在不支持的通用頭域,一般將會(huì)作為實(shí)體頭域處理。下面簡單介紹幾個(gè)在UPnP消息中使用的通用頭域:
1.Cache-Control頭域
Cache-Control指定請求和響應(yīng)遵循的緩存機(jī)制。在請求消息或響應(yīng)消息中設(shè)置Cache-Control并不會(huì)修改另一個(gè)消息處理過程中的緩存處理過程。請求時(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指示對于單個(gè)用戶的整個(gè)或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)用戶
的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。
no-cache指示請求或響應(yīng)消息不能緩存
no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存。
max-age指示客戶機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)。
min-fresh指示客戶機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)。
max-stale指示客戶機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息。
HTTP Keep-Alive
Keep-Alive功能使客戶端到服務(wù)器端的連接持續(xù)有效,當(dāng)出現(xiàn)對服務(wù)器的后繼請求時(shí),Keep-Alive功能避免了建立或者重新建立連接。市場上的大部分Web服務(wù)器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。對于提供靜態(tài)內(nèi)容的網(wǎng)站來說,這個(gè)功能通常很有用。但是,對于負(fù)擔(dān)較重的網(wǎng)站來說,這里存在另外一個(gè)問題:雖然為客戶保留打開的連接有一定的好處,但它同樣影響了性能,因?yàn)樵谔幚頃和F陂g,本來可以釋放的資源仍舊被占用。當(dāng)Web服務(wù)器和應(yīng)用服務(wù)器在同一臺機(jī)器上運(yùn)行時(shí),Keep- Alive功能對資源利用的影響尤其突出。
KeepAliveTime 值控制 TCP/IP 嘗試驗(yàn)證空閑連接是否完好的頻率。如果這段時(shí)間內(nèi)沒有活動(dòng),則會(huì)發(fā)送保持活動(dòng)信號。如果網(wǎng)絡(luò)工作正常,而且接收方是活動(dòng)的,它就會(huì)響應(yīng)。如果需要對丟失接收方敏感,換句話說,需要更快地發(fā)現(xiàn)丟失了接收方,請考慮減小這個(gè)值。如果長期不活動(dòng)的空閑連接出現(xiàn)次數(shù)較多,而丟失接收方的情況出現(xiàn)較少,您可能會(huì)要提高該值以減少開銷。缺省情況下,如果空閑連接 7200000 毫秒(2 小時(shí))內(nèi)沒有活動(dòng),Windows 就發(fā)送保持活動(dòng)的消息。通常,1800000 毫秒是首選值,從而一半的已關(guān)閉連接會(huì)在 30 分鐘內(nèi)被檢測到。 KeepAliveInterval 值定義了如果未從接收方收到保持活動(dòng)消息的響應(yīng),TCP/IP 重復(fù)發(fā)送保持活動(dòng)信號的頻率。當(dāng)連續(xù)發(fā)送保持活動(dòng)信號、但未收到響應(yīng)的次數(shù)超出 TcpMaxDataRetransmissions 的值時(shí),會(huì)放棄該連接。如果期望較長的響應(yīng)時(shí)間,您可能需要提高該值以減少開銷。如果需要減少花在驗(yàn)證接收方是否已丟失上的時(shí)間,請考慮減小該值或 TcpMaxDataRetransmissions 值。缺省情況下,在未收到響應(yīng)而重新發(fā)送保持活動(dòng)的消息之前,Windows 會(huì)等待 1000 毫秒(1 秒)。 KeepAliveTime 根據(jù)你的需要設(shè)置就行,比如10分鐘,注意要轉(zhuǎn)換成MS。 XXX代表這個(gè)間隔值得大小。
2.Date頭域
Date頭域表示消息發(fā)送的時(shí)間,時(shí)間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時(shí)間表示世界標(biāo)準(zhǔn)時(shí),換算成本地時(shí)間,需要知道用戶所在的時(shí)區(qū)。
3.Pragma頭域
Pragma頭域用來包含實(shí)現(xiàn)特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協(xié)議中,它的含義和Cache-Control:no-cache相同。
請求消息
請求消息的第一行為下面的格式:
MethodSPRequest-URISPHTTP-VersionCRLFMethod表示對于Request-URI完成的方法,這個(gè)字段是大小寫敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD應(yīng)該被所有的通用WEB服務(wù)器支持,其他所有方法的實(shí)現(xiàn)是可選的。GET方法取回由Request-URI標(biāo)識的信息。HEAD方法也是取回由Request-URI標(biāo)識的信息,只是可以在響應(yīng)時(shí),不返回消息體。POST方法可以請求服務(wù)器接收包含在請求中的實(shí)體信息,可以用于提交表單,向新聞組、BBS、郵件群組和數(shù)據(jù)庫發(fā)送消息。
SP表示空格。Request-URI遵循URI格式,在此字段為星號(*)時(shí),說明請求并不用于某個(gè)特定的資源地址,而是用于服務(wù)器本身。HTTP-Version表示支持的HTTP版本,例如為HTTP/1.1。CRLF表示換行回車符。請求頭域允許客戶端向服務(wù)器傳遞關(guān)于請求或者關(guān)于客戶機(jī)的附加信
息。請求頭域可能包含下列字段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。對請求頭域的擴(kuò)展要求通訊雙方都支持,如果存在不支持的請求頭域,一般將會(huì)作為實(shí)體頭域處理。
典型的請求消息:
Host: download.*******.de
Accept: */*
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/4.04[en] - Win95;I;Nav
Range: bytes=554554-
上例第一行表示HTTP客戶端(可能是瀏覽器、下載程序)通過GET方法獲得指定URL下的文件。棕色的部分表示請求頭域的信息,綠色的部分表示通用頭部分。
1.Host頭域
Host頭域指定請求資源的Intenet主機(jī)和端口號,必須表示請求url的原始服務(wù)器或網(wǎng)關(guān)的位置。HTTP/1.1請求必須包含主機(jī)頭域,否則系統(tǒng)會(huì)以400狀態(tài)碼返回。
2.Referer頭域
Referer頭域允許客戶端指定請求uri的源資源地址,這可以允許服務(wù)器生成回退鏈表,可用來登陸、優(yōu)化cache等。他也允許廢除的或錯(cuò)誤的連接由于維護(hù)的目的被追蹤。如果請求的uri沒有自己的uri地址,Referer不能被發(fā)送。如果指定的是部分uri地址,則此地址應(yīng)該是一個(gè)相對地址。
3.Range頭域
Range頭域可以請求實(shí)體的一個(gè)或者多個(gè)子范圍。例如,
表示頭500個(gè)字節(jié):bytes=0-499
表示第二個(gè)500字節(jié):bytes=500-999
表示最后500個(gè)字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請求頭,如果無條件GET包含Range請求頭,響應(yīng)會(huì)以狀態(tài)碼206(PartialContent)返回而不是以200(OK)。
4.User-Agent頭域
User-Agent頭域的內(nèi)容包含發(fā)出請求的用戶信息。
響應(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è)簡單的文本描述。Status-Code主要用于機(jī)器自動(dòng)識別,Reason-Phrase主要用于幫助用戶理解。Status-Code的第一個(gè)數(shù)字定義響應(yīng)的類別,后兩個(gè)數(shù)字沒有分類的作用。第一個(gè)數(shù)字可能取5個(gè)不同的值:
1xx:信息響應(yīng)類,表示接收到請求并且繼續(xù)處理
2xx:處理成功響應(yīng)類,表示動(dòng)作被成功接收、理解和接受
3xx:重定向響應(yīng)類,為了完成指定的動(dòng)作,必須接受進(jìn)一步處理
4xx:客戶端錯(cuò)誤,客戶請求包含語法錯(cuò)誤或者是不能正確執(zhí)行
5xx:服務(wù)端錯(cuò)誤,服務(wù)器不能正確執(zhí)行一個(gè)正確的請求
響應(yīng)頭域允許服務(wù)器傳遞不能放在狀態(tài)行的附加信息,這些域主要描述服務(wù)器的信息和Request-URI進(jìn)一步的信息。響應(yīng)頭域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。對響應(yīng)頭域的擴(kuò)展要求通訊雙方都支持,如果存在不支持的響應(yīng)頭域,一般將會(huì)作為實(shí)體頭域處理。
典型的響應(yīng)消息:
HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14 - Unix
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes55******/40279980
上例第一行表示HTTP服務(wù)端響應(yīng)一個(gè)GET方法。棕色的部分表示響應(yīng)頭域的信息,綠色的部分表示通用頭部分,紅色的部分表示實(shí)體頭域的信息。
1.Location響應(yīng)頭
Location響應(yīng)頭用于重定向接收者到一個(gè)新URI地址。
2.Server響應(yīng)頭
Server響應(yīng)頭包含處理請求的原始服務(wù)器的軟件信息。此域能包含多個(gè)產(chǎn)品標(biāo)識和注釋,產(chǎn)品標(biāo)識一般按照重要性排序。
實(shí)體信息
請求消息和響應(yīng)消息都可以包含實(shí)體信息,實(shí)體信息一般由實(shí)體頭域和實(shí)體組成。實(shí)體頭域包含關(guān)于實(shí)體的原信息,實(shí)體頭包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實(shí)體頭,但是這些域可能無法被接受方識別。實(shí)體可以是一個(gè)經(jīng)過編碼的字節(jié)流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。
1.Content-Type實(shí)體頭
Content-Type實(shí)體頭用于向接收方指示實(shí)體的介質(zhì)類型,指定HEAD方法送到接收方的實(shí)體介質(zhì)類型,或GET方法發(fā)送的請求介質(zhì)類型
2.Content-Range實(shí)體頭
Content-Range實(shí)體頭用于指定整個(gè)實(shí)體中的一部分的插入位置,他也指示了整個(gè)實(shí)體的長度。在服務(wù)器向客戶返回一個(gè)部分響應(yīng),它必須描述響應(yīng)復(fù)蓋的范圍和整個(gè)實(shí)體長度。一般格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如,傳送頭500個(gè)字節(jié)次字段的形式:Content-Range:bytes0-499/1234如果一個(gè)http消息包含此節(jié)(例如,對范圍請求的響應(yīng)或?qū)σ幌盗蟹秶闹丿B請求),Content-Range表示傳送的范圍,Content-Length表示實(shí)際傳送的字節(jié)數(shù)。
3.Last-modified實(shí)體頭
Last-modified實(shí)體頭指定服務(wù)器上保存內(nèi)容的最后修訂時(shí)間。
例如,傳送頭500個(gè)字節(jié)次字段的形式:Content-Range:bytes0-499/1234如果一個(gè)http消息包含此節(jié)(例如,對范圍請求的響應(yīng)或?qū)σ幌盗蟹秶闹丿B請求),Content-Range表示傳送的范圍,Content-Length表示實(shí)際傳送的字節(jié)數(shù)。
發(fā)展簡史
理論提出
超文本傳輸協(xié)議的前身是世外桃源 - Xanadu項(xiàng)目,超文本的概念是泰德˙納爾森 - Ted Nelson在1960年代提出的。進(jìn)入哈佛大學(xué)后,納爾森一直致力于超文本協(xié)議和該項(xiàng)目的研究,但他從未公開發(fā)表過資料。
程序開發(fā)
1989年,蒂姆˙伯納斯˙李 - Tim Berners Lee在CERN - 歐洲原子核研究委員會(huì) = European Organization for Nuclear Research擔(dān)任軟件咨詢師的時(shí)候,開發(fā)了一套程序,奠定了萬維網(wǎng)的基礎(chǔ)。1990年12月,超文本在CERN首次上線。1991年夏天,繼Telnet等協(xié)議之后,超文本轉(zhuǎn)移協(xié)議成為互聯(lián)網(wǎng)諸多協(xié)議的一分子。
發(fā)展?fàn)顩r
當(dāng)時(shí),Telnet協(xié)議解決了一臺計(jì)算機(jī)和另外一臺計(jì)算機(jī)之間一對一的控制型通信的要求。郵件協(xié)議解決了一個(gè)發(fā)件人向少量人員發(fā)送信息的通信要求。文件傳輸協(xié)議解決一臺計(jì)算機(jī)從另外一臺計(jì)算機(jī)批量獲取文件的通信要求,但是它不具備一邊獲取文件一邊顯示文件或?qū)ξ募M(jìn)行某種處理的功能。新聞傳輸協(xié)議解決了一對多新聞廣播的通信要求。而超文本要解決的通信要求是:在一臺計(jì)算機(jī)上獲取并顯示存放在多臺計(jì)算機(jī)里的文本、數(shù)據(jù)、圖片和其他類型的文件;它包含兩大部分:超文本轉(zhuǎn)移協(xié)議和超文本標(biāo)記語言 - HTML。HTTP、HTML以及瀏覽器的誕生給互聯(lián)網(wǎng)的普及帶來了飛躍。
萬維網(wǎng)的工作過程
超文本傳輸協(xié)議,是我們?yōu)g覽網(wǎng)頁、看在線視頻、聽在線音樂等必須遵循的規(guī)則。正是在這樣的規(guī)則下,瀏覽器 - 萬維網(wǎng)客戶才能向萬維網(wǎng)服務(wù)器發(fā)送萬維網(wǎng)文檔請求,然后服務(wù)器會(huì)將請求的文檔發(fā)送回瀏覽器。在瀏覽器和服務(wù)器之間的請求和響應(yīng)的交互,必須按照規(guī)定的格式和規(guī)則,這些格式和規(guī)則就構(gòu)成了超文本傳輸協(xié)議。
萬維網(wǎng)的工作過程
計(jì)算機(jī)系統(tǒng)中有一個(gè)專門為HTTP開放的80端口,主要用于萬維網(wǎng)傳輸信息的協(xié)議。每個(gè)萬維網(wǎng)網(wǎng)點(diǎn) - 可以是計(jì)算機(jī)都有一個(gè)服務(wù)器進(jìn)程來監(jiān)聽TCP的80端口,一旦發(fā)現(xiàn)瀏覽器向它發(fā)出連接建立請求,繼而建立TCP連接,瀏覽器就向萬維網(wǎng)服務(wù)器發(fā)出瀏覽某個(gè)網(wǎng)頁的請求,服務(wù)器就接著返回所請求的頁面作為響應(yīng)。最后,TCP連接被釋放。
需要說明的是,HTTP協(xié)議是無狀態(tài)的,也就是說同一個(gè)客戶第二次訪問同一個(gè)服務(wù)器上面的頁面時(shí),服務(wù)器的響應(yīng)與第一次訪問時(shí)的相同。服務(wù)器并不知道曾經(jīng)訪問過此客戶,更不會(huì)記得此客戶曾經(jīng)被服務(wù)過多少次了。但是,在實(shí)際工作中一些萬維網(wǎng)站點(diǎn)還是希望能夠識別用戶的。比如,你在某個(gè)購物網(wǎng)站上將某個(gè)產(chǎn)品加入購物車后,希望繼續(xù)瀏覽并選購其它商品,這時(shí)服務(wù)器就需要記住用戶的身份以便所有的商品可以一起結(jié)賬。
HTTP中的Cookie提供了這種功能。Cookie是這樣工作的:當(dāng)用戶 - 代號為User訪問某個(gè)使用Cookie的網(wǎng)站時(shí),該網(wǎng)站就會(huì)為User產(chǎn)生一個(gè)唯一的識別碼并以此作為索引在服務(wù)器的后端數(shù)據(jù)庫中產(chǎn)生一個(gè)項(xiàng)目。接著在給User的HTTP響應(yīng)報(bào)文 - 關(guān)于HTTP的報(bào)文結(jié)構(gòu)附錄會(huì)有介紹,讀者可以先看那部分內(nèi)容中添加Set-cookie的首部行。這里的"首部字段名"為"Set-cookie",后面的"值"就是賦予該用戶的"識別碼"。例如這個(gè)首部行為:Set-cookie:09876543。
當(dāng)User收到這個(gè)響應(yīng)時(shí),其瀏覽器就在它管理的特定Cookie文件中添加一行,其中包括這個(gè)服務(wù)器的主機(jī)名和Set-cookie后面給出的識別碼。當(dāng)User繼續(xù)瀏覽這個(gè)網(wǎng)站時(shí),每發(fā)送一個(gè)HTTP請求報(bào)文,其瀏覽器就會(huì)從其Cookie文件中取出這個(gè)網(wǎng)站的識別碼并放到HTTP請求報(bào)文的Cookie首部行中:Cookie:09876543。于是這個(gè)網(wǎng)站就能夠跟蹤User在這個(gè)網(wǎng)站的活動(dòng),也就能夠?qū)崿F(xiàn)購買的商品一起付費(fèi)了。服務(wù)器和用戶的交集僅僅在于這個(gè)識別碼,服務(wù)器不知道User的其它任何信息。
簡介
超文本傳輸協(xié)議 - HTTP-Hypertext transfer protocol 是分布式,協(xié)作式,超媒體系統(tǒng)應(yīng)用之間的通信協(xié)議。是萬維網(wǎng)(world wide web)交換信息的基礎(chǔ)。
它允許將 超文本標(biāo)記語言 - HTML 文檔從 Web 服務(wù)器傳送到 Web 瀏覽器。HTML 是一種用于創(chuàng)建文檔的標(biāo)記語言,這些文檔包含到相關(guān)信息的鏈接。您可以單擊一個(gè)鏈接來訪問其它文檔、圖像或多媒體對象,并獲得關(guān)于鏈接項(xiàng)的附加信息。
HTTP工作在 TCP/IP協(xié)議體系中的TCP協(xié)議上。
客戶機(jī)和服務(wù)器必須都支持 HTTP,才能在 萬維網(wǎng)上發(fā)送和接收 HTML 文檔并進(jìn)行交互。
現(xiàn)在WWW中使用的是HTTP/1.1,它是由RFCs - Requests for comments在1990年6月制定。目前交由IETF - Internet Engineering Task Force 和W3C - World Wide Web負(fù)責(zé)修改。但最終還是由RFCs對外發(fā)布。
