天天看點

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

http://blog.csdn.net/sjhuangx/article/details/52299726

http://blog.csdn.net/sjhuangx/article/details/52299726

http://blog.csdn.net/sjhuangx/article/details/52299726

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幀裡面。

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

然後,HTTP 2.0 通信都在一個連接配接上完成,這個連接配接可以承載任意數量的雙向資料流。相應地,每個資料流以消息的形式發送,而消息由一或多個幀組成,這些幀可以亂序發送,然後再根據每個幀首部的流辨別符重新組裝。

HTTP2.0 首部壓縮

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

如果首部發生變化了,那麼隻需要發送變化了資料在Headers幀裡面,新增或修改的首部幀會被追加到“首部表”。首部表在 HTTP 2.0 的連接配接存續期内始終存在,由用戶端和伺服器共同漸進地更新 。

有的HTTP2.0的請求都在一個TCP連結上

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,也可以一邊接收者伺服器的響應,而伺服器那端同理。

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

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

可以并行交錯地發送請求,請求之間互不影響;

可以并行交錯地發送響應,響應之間互不幹擾;

隻使用一個連接配接即可并行發送多個請求和響應;

消除不必要的延遲,進而減少頁面加載的時間;

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

HTTP2.0的請求優先級

每個HTTP2.0流裡面有個優先值,這個優先值确定着用戶端和伺服器處理不同的流采取不同的優先級政策,高優先級的流都應該優先發送,但又不會絕對的。絕對地準守,可能又會引入首隊阻塞的問題:高優先級的請求慢導緻阻塞其他資源傳遞。配置設定處理資源和用戶端與伺服器間的帶寬,不同優先級的混合也是必須的。

HTTP2.0的伺服器推送

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

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

本文永久更新連結位址:http://www.linuxidc.com/Linux/2015-08/122287.htm