[置頂] http協議初探------http request和response報文格式
http 協議是屬於應用層協議,以可靠連線TCP套接字的基礎上設計的應用協議。http1.1預設是開啟長連線的。
http request部分報文結構
http 協議規定,http request部分報文分三部分。第一部分是請求行,第二部分是請求頭,第三部分是請求實體。
以下為通過wireshark抓包後,整理的http
測試環境的http request包
淘寶某個js的http request包
http request中規定第一行為請求行,請求行中第一個單詞為請求的方法。比如GET(請求服務端資料),post(更新資料到服務端),DELETE(刪除服務端資料),PUT(新增資料到服務端) OPTION,TRACE等等。
第二個單詞為請求的相對路徑
第三個單詞為http版本。目前有HTTP/1.1 HTTP/1.0 HTTP/0.9。目前幾乎所有的瀏覽器和httpClient客戶端都是HTTT/1.1。除非你的瀏覽器或者HttClient很老了(建議趕緊升級吧)。
最後以兩個位元組
注意http規定請求行中,第一個,第二個,第三個單詞間必須要有一個空格
大家都知道,通過網路傳輸,傳輸的都是bit位(由Byte位元組轉換),服務端接受到http request部分後,讀出來的資料也是Byte流。服務端是怎樣擷取Byte流的,比如什麼時候header結束,http body開始。
通過兩個連續的位元組13和10(也就是\r\n)。表示http header結束,http body開始,可以檢視上圖
http header中通過兩個位元組13 10區分每個header。看上圖每個http頭部都是以\r\n結束。Header
http body的結束,是通過head中的Content-length指定的,以conten-length的大小,計算body的長度。(當然有些是以傳輸塊指定的body,content-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-Encoding以Content-length為準)