理解HTTP消息頭 1

但凡搞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”表示消息體的長度,從空行以後的內容算起,以字節爲單位,瀏覽器接收到它所指定的字節數的內容以後就會認爲這個消息已經被完整接收了。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章