HTTP2.0新特性

HTTP2.0的標準總體目標是爲了改善用戶在使用web時候的速度體驗(這些改進都是HTTP1.1中的痛點或者說是所遇到的瓶頸)。實現上主要是有7項技術:多路複用,流量控制,客戶拖拽,服務器推送,WebSocket以及協商和TLS義務化。不過具體到平時的使用體驗上,體現在如下幾個方面:

HTTP2.0性能增強的核心:二進制分幀

HTTP 2.0最大的特點: 不會改動HTTP 的語義,HTTP 方法、狀態碼、URI 及首部字段,等等這些核心概念上一如往常,卻能致力於突破上一代標準的性能限制,改進傳輸性能,實現低延遲和高吞吐量。而之所以叫2.0,是在於新增的二進制分幀層。 
既然又要保證HTTP的各種動詞,方法,首部都不受影響,那就需要在應用層(HTTP2.0)和傳輸層(TCP or UDP)之間增加一個二進制分幀層。 
在二進制分幀層上, HTTP 2.0 會將所有傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼 ,其中HTTP1.x的首部信息會被封裝到Headers幀,而我們的request body則封裝到Data幀裏面。 
HTTP 2.0 通信都在一個連接上完成,這個連接可以承載任意數量的雙向數據流。相應地,每個數據流以消息的形式發送,而消息由一或多個幀組成,這些幀可以亂序發送,然後再根據每個幀首部的流標識符重新組裝。

HTTP2.0 首部壓縮

HTTP 2.0 在客戶端和服務器端使用“首部表”來跟蹤和存儲之前發送的鍵-值對,對於相同的數據,不再通過每次請求和響應發送;通信期間幾乎不會改變的通用鍵-值對(用戶代理、可接受的媒體類型,等等)只 需發送一次。事實上,如果請求中不包含首部(例如對同一資源的輪詢請求),那麼 首部開銷就是零字節。此時所有首部都自動使用之前請求發送的首部。

如果首部發生變化了,那麼只需要發送變化了數據在Headers幀裏面,新增或修改的首部幀會被追加到“首部表”。首部表在 HTTP 2.0 的連接存續期內始終存在,由客戶端和服務器共同漸進地更新 。

所有的HTTP2.0的請求都在一個TCP鏈接上

HTTP 2.0 把 HTTP 協議通信的基本單位縮小爲一個一個的幀,這些幀對應 着邏輯流中的消息。並行地在同一個 TCP 連接上雙向交換消息。就好比,我請求一個頁面http://www.qq.com。頁面上所有的資源請求都是客戶端與服務器上的一條TCP上請求和響應的!

有關注TCP性能的同學就會知道,HTTP性能瓶頸關鍵在於低延遲而不是高帶寬!大多數HTTP 連接的時間都很短,而且是突發性的,但TCP 只在長時間連接傳輸大塊數據時效率才最高。HTTP 2.0 通過讓所有數據流共用同一個連接,可以更有效地使用TCP 連接,讓高帶寬也能真正的服務於HTTP的性能提升。

同時,單鏈接多資源的方式,使到至上而下的層面都得到了好處: 
1. 可以減少服務鏈接壓力,內存佔用少了,連接吞吐量大了 
2. 由於 TCP 連接減少而使網絡擁塞狀況得以改觀; 
3. 慢啓動時間減少,擁塞和丟包恢復速度更快。

也就是說,“資源合併減少請求”的優化手段對於HTTP2.0來說是沒有效果的,只會增大無用的工作量而已。

並行雙向字節流的請求和響應

在HTTP2.0上,客戶端和服務器可以把HTTP 消息分解爲互不依賴的幀,然後亂序發送,最後再在另一端把它們重新組合起來。注意,同一鏈接上有多個不同方向的數據流在傳輸。客戶端可以一邊亂序發送stream,也可以一邊接收服務器的響應,而服務器那端同理。

把 HTTP 消息分解爲獨立的幀,交錯發送,然後在另一端重新組裝是 HTTP 2.0 最 重要的一項增強。事實上,這個機制會在整個 Web 技術棧中引發一系列連鎖反應, 從而帶來巨大的性能提升,因爲:

  1. 可以並行交錯地發送請求,請求之間互不影響;
  2. 可以並行交錯地發送響應,響應之間互不干擾;
  3. 只使用一個連接即可並行發送多個請求和響應;
  4. 消除不必要的延遲,從而減少頁面加載的時間;

那麼也就是說“域名分區”這種優化手段對於HTTP2.0是無用的,因爲資源都是並行交錯發送,且沒有限制,不需要額外的多域名並行下載。

HTTP2.0的請求優先級

每個HTTP2.0流裏面有個優先值,這個優先值確定着客戶端和服務器處理不同的流採取不同的優先級策略,高優先級的流都應該優先發送,但又不會絕對的。絕對地準守,可能又會引入首隊阻塞的問題:高優先級的請求慢導致阻塞其他資源交付。分配處理資源和客戶端與服務器間的帶寬,不同優先級的混合也是必須的。

HTTP2.0的服務器推送

HTTP 2.0 新增的一個強大的新功能,就是服務器可以對一個客戶端請求發送多個響應。換句話說,服務器除了對最初請求的響應外,還可以額外向客戶端推送資源,而無需客戶端明確地請求。

當瀏覽器請求一個html,服務器其實大概知道你是接下來要請求資源了,而不需要等待瀏覽器得到html後解析頁面再發送資源請求。我們常用的內嵌圖片也可以理解爲一種強制的服務器推送:我請求html,卻內嵌了張圖。

有了HTTP2.0的服務器推送,HTTP1.x時代的內嵌資源的優化手段也變得沒有意義了。而且使用服務器推送的資源的方式更加高效,因爲客戶端還可以緩存起來,甚至可以由不同的頁面共享(依舊遵循同源策略)。當然,瀏覽器是可以決絕服務器推送的資源的。

發佈了103 篇原創文章 · 獲贊 71 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章