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 OKHTTP返回代碼,200就表示操作成功,還有其他常見的如404表示對象未找到,500表示服務器錯誤,403表示不能瀏覽目錄等等。

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

消息頭最后一行“Content-Length表示消息體的長度,從空行以后的內容算起,以字節為單位,瀏覽器接收到它所指定的字節數的內容以后就會認為這個消息已經被完整接收了。

原文:

http://www.cnblogs.com/jiahaohk/archive/2009/08/19/1550248.html

http://hi.baidu.com/karab/item/b7533b57096c4f948d12ed24

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM