1. 程式人生 > >理解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><body>hello world</body></html>
同樣,我用“<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”表示訊息體的長度,從空行以後的內容算起,以位元組為單位,瀏覽器接收到它所指定的位元組數的內容以後就會認為這個訊息已經被完整接收了。