天天看點

一文讀懂 HTTP/2 特性

HTTP/2 是 HTTP 協定自 1999 年 HTTP 1.1 釋出後的首個更新,主要基于 SPDY 協定。由網際網路工程任務組(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小組進行開發。該組織于2014年12月将HTTP/2标準提議遞交至IESG進行讨論,于2015年2月17日被準許。HTTP/2标準于2015年5月以RFC 7540正式發表。

那 HTTP/2 到底有哪些具體變化呢?

先來了解幾個概念:

幀:HTTP/2 資料通信的最小機關消息:指 HTTP/2 中邏輯上的 HTTP 消息。例如請求和響應等,消息由一個或多個幀組成。

流:存在于連接配接中的一個虛拟通道。流可以承載雙向消息,每個流都有一個唯一的整數ID。

HTTP/2 采用二進制格式傳輸資料,而非 HTTP 1.x 的文本格式,二進制協定解析起來更高效。 HTTP / 1 的請求和響應封包,都是由起始行,首部和實體正文(可選)組成,各部分之間以文本換行符分隔。HTTP/2 将請求和響應資料分割為更小的幀,并且它們采用二進制編碼。

HTTP/2 中,同域名下所有通信都在單個連接配接上完成,該連接配接可以承載任意數量的雙向資料流。每個資料流都以消息的形式發送,而消息又由一個或多個幀組成。多個幀之間可以亂序發送,根據幀首部的流辨別可以重新組裝。

多路複用,代替原來的序列和阻塞機制。所有就是請求的都是通過一個 TCP連接配接并發完成。 HTTP 1.x 中,如果想并發多個請求,必須使用多個 TCP 連結,且浏覽器為了控制資源,還會對單個域名有 6-8個的TCP連結請求限制,如下圖,紅色圈出來的請求就因域名連結數已超過限制,而被挂起等待了一段時間:

一文讀懂 HTTP/2 特性

在 HTTP/2 中,有了二進制分幀之後,HTTP /2 不再依賴 TCP 連結去實作多流并行了,在 HTTP/2中:

同域名下所有通信都在單個連接配接上完成。 單個連接配接可以承載任意數量的雙向資料流。 資料流以消息的形式發送,而消息又由一個或多個幀組成,多個幀之間可以亂序發送,因為根據幀首部的流辨別可以重新組裝。

這一特性,使性能有了極大提升:

同個域名隻需要占用一個 TCP 連接配接,消除了因多個 TCP 連接配接而帶來的延時和記憶體消耗。 單個連接配接上可以并行交錯的請求和響應,之間互不幹擾。 在HTTP/2中,每個請求都可以帶一個31bit的優先值,0表示最高優先級, 數值越大優先級越低。有了這個優先值,用戶端和伺服器就可以在處理不同的流時采取不同的政策,以最優的方式發送流、消息和幀。

服務端可以在發送頁面HTML時主動推送其它資源,而不用等到浏覽器解析到相應位置,發起請求再響應。例如服務端可以主動把JS和CSS檔案推送給用戶端,而不需要用戶端解析HTML時再發送這些請求。

服務端可以主動推送,用戶端也有權利選擇是否接收。如果服務端推送的資源已經被浏覽器緩存過,浏覽器可以通過發送RST_STREAM幀來拒收。主動推送也遵守同源政策,伺服器不會随便推送第三方資源給用戶端。

HTTP 1.1請求的大小變得越來越大,有時甚至會大于TCP視窗的初始大小,因為它們需要等待帶着ACK的響應回來以後才能繼續被發送。HTTP/2對消息頭采用HPACK(專為http/2頭部設計的壓縮格式)進行壓縮傳輸,能夠節省消息頭占用的網絡的流量。而HTTP/1.x每次請求,都會攜帶大量備援頭資訊,浪費了很多帶寬資源。

HTTP每一次通信都會攜帶一組頭部,用于描述這次通信的的資源、浏覽器屬性、cookie等,例如

一文讀懂 HTTP/2 特性

為了減少這塊的資源消耗并提升性能, HTTP/2對這些首部采取了壓縮政策:

HTTP/2在用戶端和伺服器端使用“首部表”來跟蹤和存儲之前發送的鍵-值對,對于相同的資料,不再通過每次請求和響應發送; 首部表在HTTP/2的連接配接存續期内始終存在,由用戶端和伺服器共同漸進地更新; 每個新的首部鍵-值對要麼被追加到目前表的末尾,要麼替換表中之前的值。

例如:下圖中的兩個請求, 請求一發送了所有的頭部字段,第二個請求則隻需要發送差異資料,這樣可以減少備援資料,降低開銷。

一文讀懂 HTTP/2 特性

我們來看一個實際的例子,下面是用WireShark抓取的通路google首頁的包: 

一文讀懂 HTTP/2 特性

上圖是是通路 https://www.google.com/ 抓到的第一個請求的頭部,可以看到頭部的内容,總共占用了437 bytes,我們選中頭部的cookie,可以看到cookie總共占用了118 bytes。接下來我們看看第二個請求的頭部:

從上圖可以看到,得益于頭部壓縮,第二個請求中cookie隻占用了1個位元組,我們來看看變化了的Accept字段: 

一文讀懂 HTTP/2 特性

由于Accept字段與請求一中的内容不同,需要發送給伺服器,是以占用了29 bytes。

浏覽器和網絡服務支援情況:http2支援清單

如何快速啟用HTTP2: 又拍雲文檔中心

HTTP/2 和 HTTP/1 速度對比:HTTP/2: the Future of the Internet

結語

HTTP/2的通過支援請求與響應的多路複用來減少延遲,通過壓縮HTTP首部字段将協定開銷降至最低,同時增加對請求優先級和伺服器端推送的支援。

參考資料: Jerry Qu blog 中的HTTP/2專題; 維基百科:HTTP/2 RFC 7540 – 超文本傳輸協定第2版(HTTP / 2) FC 7541 – HPACK:HTTP / 2的頭壓縮 http2講解