http 協議是屬於應用層協議,以可靠連接TCP套接字的基礎上設計的應用協議。http1.1默認是開啓長連接的。
http request部分報文結構
http 協議規定,http request部分報文分三部分。第一部分是請求行,第二部分是請求頭,第三部分是請求實體。
以下爲通過wireshark抓包後,整理的http 一次request發送的數據信息
測試環境的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很老了(建議趕緊升級吧)。
最後以兩個字節\r\n(13和10也就是回車+換行結束)做爲請求行的標示結束。
注意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包含兩部分,一個是headerName,一個是headerValue,headerName和headerValue間用一個“:”冒號和” ”一個空格分開,比如
http body的結束,是通過head中的Content-length指定的,以conten-length的大小,計算body的長度。(當然有些是以傳輸塊指定的body,content-length無法指定,則會按相應的規則解析body中字節流,拿到每塊的大小,然後再解析)
http response 部分報文結構
http response報文協議結構和http request報文協議結構幾乎相同,第一部分爲應答狀態行,第二部分爲應答頭,第三部分爲應答實體
以下爲通過wireshare抓包後,一次http response返回結果,是上圖,淘寶某js http 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爲準)