HTTP協(xié)議用于在Internet上發(fā)送和接收消息。HTTP協(xié)議是一種請求-應答式的協(xié)議 ——客戶(hù)端發(fā)送一個(gè)請求,服務(wù)器返回該請求的應答,所有的請求與應答都是HTTP包。HTTP協(xié)議使用可靠的TCP連接,默認端口是80。HTTP的第一 個(gè)版本是HTTP/0.9,后來(lái)發(fā)展到了HTTP/1.0,現在最新的版本是HTTP/1.1。HTTP/1.1由RFC 2616 定義。
在HTTP 中,Client/Server之間的會(huì )話(huà)總是由客戶(hù)端通過(guò)建立連接和發(fā)送HTTP請求包初始化,服務(wù)器不會(huì )主動(dòng)聯(lián)系客戶(hù)端或要求與客戶(hù)端建立連接。瀏覽 器和服務(wù)器都可以隨時(shí)中斷連接,例如,在瀏覽網(wǎng)頁(yè)時(shí)你可以隨時(shí)點(diǎn)擊"停止"按鈕中斷當前的文件下載過(guò)程,關(guān)閉與Web服務(wù)器的HTTP連接。
1 HTTP請求包
HTTP請求包(GET、POST等請求方法)由三個(gè)部分構成,分別是:方法-URI-協(xié)議/版本,請求頭,請求正文。下面是一個(gè)HTTP請求包(GET)的例子:
GET /index.jsp HTTP/1.1
Accept-Language: zh-cn
Connection: Keep-Alive
Host: 192.168.0.106
Content-Length: 37
userName=new_andy&password=new_andy
請求包的第一行是方法-URI-協(xié)議/版本:
GET就是請求方法,根據HTTP標準,HTTP請求可以使用多種請求方法。HTTP 1.1支持七種請求方法:GET、POST、HEAD、OPTIONS、PUT、delete和TRACE等,常用的為請求方法是GET和POST。
/index.jsp表示URI。URI指定了要訪(fǎng)問(wèn)的網(wǎng)絡(luò )資源。
HTTP/1.1是協(xié)議和協(xié)議的版本。
最 后一行userName=new_andy&password=new_andy為正文,正文與HTTP頭部有一個(gè)空行(\r\n)分隔。這里需 要說(shuō)明的一點(diǎn),其中Content-Length說(shuō)明正文的長(cháng)度,有的正文長(cháng)度沒(méi)有在頭部說(shuō)明,只是標明Transfer-Encoding: chunked。關(guān)于chunked類(lèi)型的長(cháng)度計算方法,見(jiàn)RFC 1626。
請求包的頭部還會(huì )包含許多有關(guān)客戶(hù)端環(huán)境和請求正文的有用信息,這里不再描述。
2 HTTP應答包
和HTTP請求包相似,由三個(gè)部分構成,分別是:協(xié)議-狀態(tài)代碼-描述,應答頭,應答正文。下面是一個(gè)HTTP應答的例子:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 2005 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 2004 13:23:42 GMT
Content-Length: 90
<html>
<head>
<title>解讀HTTP包示例</title></head><body>
Hello WORLD!
</body>
</html>
HTTP應答包的第一行類(lèi)似于HTTP請求的第一行,表示所用的協(xié)議是HTTP 1.1,服務(wù)器處理請求的狀態(tài)碼200。
應答頭也和請求頭一樣包含許多有用的信息,例如服務(wù)器類(lèi)型、日期時(shí)間、內容類(lèi)型和長(cháng)度等。應答的正文就是服務(wù)器返回的HTML頁(yè)面。應答頭和正文之間也用CRLF分隔。
wiki中的解釋
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應用最為廣泛的一種網(wǎng)絡(luò )傳輸協(xié)議。所有的WWW文件都必須遵守這個(gè)標準。設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法。
HTTP的發(fā)展是萬(wàn)維網(wǎng)協(xié)會(huì )和Internet工作小組合作的結果,在一系列的RFC發(fā)布中確定了最終版本,其中最著(zhù)名的是RFC 2616。在RFC 2616中定義了HTTP/1.1這個(gè)今天普遍使用的版本。
HTTP是一個(gè)用于在客戶(hù)端和服務(wù)器間請求和應答的協(xié)議。一個(gè)HTTP的客戶(hù)端,諸如一個(gè)web瀏覽器,通過(guò)建立一個(gè)到遠程主機特殊端口(默認端口為80)的連接,初始化一個(gè)請求。一個(gè)HTTP服務(wù)器通過(guò)監聽(tīng)特殊端口等待客戶(hù)端發(fā)送一個(gè)請求序列, 就像“GET / HTTP/1.1”(用來(lái)請求網(wǎng)頁(yè)服務(wù)器的默認頁(yè)面),有選擇的接收像email一樣的MIME消 息,此消息中包含了大量用來(lái)描述請求各個(gè)方面的信息頭序列,響應一個(gè)選擇的保留數據主體。接收到一個(gè)請求序列后(如果要的話(huà),還有消息),服務(wù)器會(huì )發(fā)回一 個(gè)應答消息,諸如“200 OK”,同時(shí)發(fā)回一個(gè)它自己的消息,此消息的主體可能是被請求的文件、錯誤消息或者其他的一些信息。
HTTP不同于其他基于TCP的協(xié)議,諸如FTP。 在HTTP中,一旦一個(gè)特殊的請求(或者請求的相關(guān)序列)完成,連接通常被中斷。這個(gè)設計使得對于當前頁(yè)面有規則連接到另一臺服務(wù)器頁(yè)面的萬(wàn)維網(wǎng)來(lái)說(shuō), HTTP是完美的。當持久連接的缺乏成為保持用戶(hù)狀態(tài)的必需選擇的方法時(shí),對網(wǎng)頁(yè)設計者來(lái)說(shuō),會(huì )偶然產(chǎn)生一些問(wèn)題。而大部分這些方法包括了對“cookies”的使用。
這里有一個(gè)HTTP的安全版本稱(chēng)為HTTPS,HTTPS支持任何的加密算法,只要此加密算法能被頁(yè)面雙方所理解。
HTTP(和HTTPS)由唯一資源定位器或者簡(jiǎn)稱(chēng)URLs定位。創(chuàng )造這種地址定位的語(yǔ)法為了HTML的鏈接。
下面是一個(gè)HTTP客戶(hù)端與服務(wù)器之間會(huì )話(huà)的例子,運行于www.google.com,端口80
客戶(hù)端請求:
GET / HTTP/1.1
Host:www.google.com
(緊跟著(zhù)一個(gè)換行,通過(guò)敲入回車(chē)實(shí)現)
服務(wù)器應答:
HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqy
X9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Connection: keep-alive
(緊跟著(zhù)一個(gè)空行,并且由HTML格式的文本組成了Google的主頁(yè))
在HTTP1.0中,客戶(hù)端發(fā)送一個(gè)請求至服務(wù)器,服務(wù)器發(fā)送一個(gè)應答至客戶(hù)端。之后,連接將被釋放。另一方面,HTTP1.1支持持久連接。這使 得客戶(hù)端可以發(fā)送請求并且接收應答,然后迅速的發(fā)送另一個(gè)請求和接收另一個(gè)應答。因為多個(gè)額外的請求,TCP連接并沒(méi)有被釋放,而每個(gè)請求中關(guān)于TCP的 負載相對較少。同時(shí),在得到上一個(gè)請求的應答之前發(fā)送多個(gè)請求(通常是兩個(gè))也成為可能。這個(gè)技術(shù)被稱(chēng)為“流水線(xiàn)”。
聯(lián)系客服