HTTP1.0、HTTP1.1、HTTP2.0的關系和區別
一、匯總對比
HTTP1.0 |
|
HTTP1.1 |
|
HTTP2.0 |
|
二、HTTP1.0
瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器處理完后立即斷開TCP連接(無連接),服務器不跟蹤每個客戶端也不記錄過去的請求(無狀態)。
二、HTTP1.1
HTTP/1.0中默認使用Connection:close。在HTTP/1.1中已經默認使用Connection:keep-alive,避免了連接建立和釋放地開銷,但服務器必須按照客戶端請求的先后順序依次送回相應的結果,以保證客戶端能夠區分出每次請求的響應內容。通過Content-Length字段來判斷當前請求的數據是否或已經全部接收。不允許同時存在兩個並行的響應。
二、HTTP2.0
HTTP/2引入二進制數據幀和流的概念,其中幀對數據進行順序標識,這樣瀏覽器收到數據之后,就可以按照序列對數據進行合並,而不會出現合並之后數據錯亂的情況。同樣是因為有了序列,服務器就可以並行的傳輸數據,這就是流所做的事情。
流(stream) |
已建立連接上的雙向字節流 |
消息 |
與邏輯消息對應的完整的一系列數據幀 |
幀 |
HTTP2.0通信的最小單位,每個幀包含幀頭部,至少會標識出當前幀所屬的流(stream id) |
多路復用:
1、所有的HTTP2.0通信都在一個TCP連接上完成,這個連接可以承載任意數量的雙向數據流。
2、每個數據流以消息的形式發送,而消息由一或多個幀組成。這些幀可以亂序發送,然后再根據每個幀頭部的流標識符(stream id)重新組裝。
舉個例子,每個請求是一個數據流,數據流以消息的方式發送,而消息又分為多個幀,幀頭部記錄着stream id用來標識所屬的數據流,不同屬的幀可以在連接中隨機混雜在一起。接收方可以根據stream id將幀再歸屬到各自不同的請求當中去。
3、另外,多路復用(連接共享)可能會導致關鍵請求被阻塞。HTTP2.0里每個數據流都可以設置優先級和依賴,優先級高的數據流會被服務器優先處理和返回給客戶端,數據流還可以依賴其他的子數據流。
4、可見,HTTP2.0實現了真正的並行傳輸,它能夠在一個TCP上進行任意數量HTTP請求。而這個強大的功能則是基於"二進制分幀"的特性。
頭部壓縮:
在HTTP1.x中,頭部元數據都是以純文本的形式發送的,通常會給每個請求增加500~800字節的負荷。
HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重復header的傳輸,又減小了需要傳輸的大小。高效的壓縮算法可以很大的壓縮header,減少發送包的數量從而降低延遲。
服務器推送:
服務器除了對最初請求的響應外,服務器還可以額外的向客戶端推送資源,而無需客戶端明確的請求。