HTTP1.0/1.1/2.0的區別
一、彙總對比
HTTP1.0
無狀態、無連線
HTTP1.1
持久連線
請求管道化
增加快取處理(新的欄位如cache-control)
增加Host欄位、支援斷點傳輸等(把檔案分成幾部分)
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,減少傳送包的數量從而降低延遲。
伺服器推送:
伺服器除了對最初請求的響應外,伺服器還可以額外的向客戶端推送資源,而無需客戶端明確的請求。