天天看點

http消息頭

http消息頭

但凡搞WEB開發的人都離不開HTTP(超文本傳輸協定),而要了解HTTP,除了HTML本身以外,還有一部分不可忽視的就是HTTP消息頭。

做過Socket程式設計的人都知道,當我們設計一個通信協定時,“消息頭/消息體”的分割方式是很常用的,消息頭告訴對方這個消息是幹什麼的,消息體告訴對方怎麼幹。HTTP傳輸的消息也是這樣規定的,每一個HTTP包都分為HTTP頭和HTTP體兩部分,後者是可選的,而前者是必須的。每當我們打開一個網頁,在上面點選右鍵,選擇“檢視源檔案”,這時看到的HTML代碼就是HTTP的消息體,那麼消息頭又在哪呢?IE浏覽器不讓我們看到這部分,但我們可以通過截取資料包等方法看到它。

下面就來看一個簡單的例子:

首先制作一個非常簡單的網頁,它的内容隻有一行:

<html><body>hello world</body></html>

把它放到WEB伺服器上,比如IIS,然後用IE浏覽器請求這個頁面(http://localhost:8080/simple.htm),當我們請求這個頁面時,浏覽器實際做了以下四項工作:

1 解析我們輸入的位址,從中分解出協定名、主機名、端口、對象路徑等部分,對于我們的這個位址,解析得到的結果如下:

協定名:http

主機名:localhost

端口:8080

對象路徑:/simple.htm

2 把以上部分結合本機自己的資訊,封裝成一個HTTP請求資料包

3 使用TCP協定連接配接到主機的指定端口(localhost, 8080),并發送已封裝好的資料包

4 等待伺服器傳回資料,并解析傳回資料,最後顯示出來

由截取到的資料包我們不難發現浏覽器生成的HTTP資料包的内容如下:

GET /simple.htm HTTP/1.1<CR>

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<CR>

Accept-Language: zh-cn<CR>

Accept-Encoding: gzip, deflate<CR>

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<CR>

Host: localhost:8080<CR>

Connection: Keep-Alive<CR>

<CR>

為了顯示清楚我把所有的回車的地方都加上了“<CR>”,注意最後還有一個空行加一個回車,這個空行正是HTTP規定的消息頭和消息體的分界線,第一個空行以下的内容就是消息體,這個請求資料包是沒有消息體的。

消息的第一行“GET”表示我們所使用的HTTP動作,其他可能的還有“POST”等,GET的消息沒有消息體,而POST消息是有消息體的,消息體的内容就是要POST的資料。後面/simple.htm就是我們要請求的對象,之後HTTP1.1表示使用的是HTTP1.1協定。

第二行表示我們所用的浏覽器能接受的Content-type,三四兩行則是語言和編碼資訊,第五行顯示出本機的相關系資訊,包括浏覽器類型、作業系統資訊等,很多網站可以顯示出你所使用的浏覽器和作業系統版本,就是因為可以從這裡擷取到這些資訊。

第六行表示我們所請求的主機和端口,第七行表示使用Keep-Alive方式,即資料傳遞完并不立即關閉連接配接。

伺服器接收到這樣的資料包以後會根據其内容做相應的處理,例如查找有沒有“/simple.htm”這個對象,如果有,根據伺服器的設定來決定如何處理,如果是HTM,則不需要什麼複雜的處理,直接傳回其内容即可。但在直接傳回之前,還需要加上HTTP消息頭。

伺服器發回的完整HTTP消息如下:

HTTP/1.1 200 OK<CR>

Server: Microsoft-IIS/5.1<CR>

X-Powered-By: ASP.NET<CR>

Date: Fri, 03 Mar 2006 06:34:03 GMT<CR>

Content-Type: text/html<CR>

Accept-Ranges: bytes<CR>

Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT<CR>

ETag: "5ca4f75b8c3ec61:9ee"<CR>

Content-Length: 37<CR>

同樣,我用“<CR>”來表示回車。可以看到,這個消息也是用空行切分成消息頭和消息體兩部分,消息體的部分正是我們前面寫好的HTML代碼。

消息頭第一行“HTTP/1.1”也是表示所使用的協定,後面的“200 OK”是HTTP傳回代碼,200就表示操作成功,還有其他常見的如404表示對象未找到,500表示伺服器錯誤,403表示不能浏覽目錄等等。

第二行表示這個伺服器使用的WEB伺服器軟體,這裡是IIS 5.1。第三行是ASP.Net的一個附加提示,沒什麼實際用處。第四行是處理此請求的時間。第五行就是所傳回的消息的content-type,浏覽器會根據它來決定如何處理消息體裡面的内容,例如這裡是text/html,那麼浏覽器就會啟用HTML解析器來處理它,如果是image/jpeg,那麼就會使用JPEG的解碼器來處理。

消息頭最後一行“Content-Length”表示消息體的長度,從空行以後的内容算起,以位元組為機關,浏覽器接收到它所指定的位元組數的内容以後就會認為這個消息已經被完整接收了。

原文:

<a href="http://www.cnblogs.com/jiahaohk/archive/2009/08/19/1550248.html">http://www.cnblogs.com/jiahaohk/archive/2009/08/19/1550248.html</a>

<a href="http://hi.baidu.com/karab/item/b7533b57096c4f948d12ed24">http://hi.baidu.com/karab/item/b7533b57096c4f948d12ed24</a>

http://www.cnblogs.com/li0803/archive/2008/11/04/1324747.html

繼續閱讀