1. 程式人生 > >[置頂] http協議初探------http request和response報文格式

[置頂] http協議初探------http request和response報文格式

    搞web的程式猿,應該都知道http協議。http協議有三個版本。http 0.9版本,http 1.0版本,和現在一直在使用的http 1.1版本。RFC 2616 http 1.1 版本的官方規範文件。另外《http 權威指南》也對http協議進行了很好的闡述。

http 協議是屬於應用層協議,以可靠連線TCP套接字的基礎上設計的應用協議。http1.1預設是開啟長連線的。

http request部分報文結構

http 協議規定,http request部分報文分三部分。第一部分是請求行,第二部分是請求頭,第三部分是請求實體。

以下為通過wireshark抓包後,整理的http

一次request傳送的資料資訊



 

測試環境的http request



 

淘寶某個jshttp request

http request中規定第一行為請求行,請求行中第一個單詞為請求的方法。比如GET(請求服務端資料)post(更新資料到服務端)DELETE(刪除服務端資料)PUT(新增資料到服務端) OPTIONTRACE等等。

第二個單詞為請求的相對路徑

第三個單詞為http版本。目前有HTTP/1.1 HTTP/1.0 HTTP/0.9。目前幾乎所有的瀏覽器和httpClient客戶端都是HTTT/1.1。除非你的瀏覽器或者HttClient很老了(建議趕緊升級吧)。

最後以兩個位元組

\r\n1310也就是回車+換行結束)做為請求行的標示結束。

注意http規定請求行中,第一個,第二個,第三個單詞間必須要有一個空格

大家都知道,通過網路傳輸,傳輸的都是bit位(由Byte位元組轉換),服務端接受到http request部分後,讀出來的資料也是Byte流。服務端是怎樣擷取Byte流的,比如什麼時候header結束,http body開始。

通過兩個連續的位元組1310(也就是\r\n)。表示http header結束,http body開始,可以檢視上圖

http header中通過兩個位元組13 10區分每個header。看上圖每個http頭部都是以\r\n結束。Header

包含兩部分,一個是headerName,一個是headerValueheaderNameheaderValue間用一個“:”冒號和” ”一個空格分開,比如   
 

http body的結束,是通過head中的Content-length指定的,以conten-length的大小,計算body的長度。(當然有些是以傳輸塊指定的bodycontent-length無法指定,則會按相應的規則解析body中位元組流,拿到每塊的大小,然後再解析)

http response 部分報文結構

http response報文協議結構和http request報文協議結構幾乎相同,第一部分為應答狀態行,第二部分為應答頭,第三部分為應答實體

以下為通過wireshare抓包後,一次http response返回結果,是上圖,淘寶某jshttp request對應的response 部分。



 

http response報文規定第一行為響應狀態行,第一個單詞為http協議值,比如http/0.9 http/1.0 htpp/1.1 第二個單詞為響應的狀態碼。比如 200表示服務端處理該請求成功,4XX開頭是客戶端發的http resquest有問題,5XX為服務端內部處理出錯。3XX為頁面轉發

http response 頭部欄位和http response 實體部分也是通過兩個連續的回車(13)換行(10)符進行分割的。

http response header之間和header內容中的結構和分割和http request header規則一樣。

http response結束,也是通過http response header中的Content-length欄位的值確認的(有時,服務端生成動態內容,body的大小無法計算,有時以header中的Transfer-Encoding為準,http協議規定有Transfer-Encoding,以Transfer-Encoding為準,沒有Transfer-EncodingContent-length為準)