淺談:HTTP 2.0 的二進制幀、流、多路複用

做者:林冠宏 / 指尖下的幽靈html

掘金:juejin.im/user/587f0d…git

博客:www.cnblogs.com/linguanh/github

GitHub : github.com/af913337456…服務器

騰訊雲專欄: cloud.tencent.com/developer/u…網絡

蟲洞區塊鏈專欄:www.chongdongshequ.com/article/153…併發


超文本傳輸協議 HTTP 的 2.0 版本的協議在 2015 年的時候已經發布了。相比於前面的 HTTP 1.1 版本。它多出了下面三個主要的新特性。區塊鏈

  • 在創建鏈接後,能夠多路複用
  • 在創建鏈接後,一次的請求與被響應,視爲
  • 數據傳輸分爲二進制幀片斷

HTTP 2.0 對 HTTP 的延遲問題起到了能夠說是一個巨大的優化。下面的連接是網上的一個直觀網站,它展現了一樣是 300 多張圖片,分別在 HTTP 1.1 和 HTTP 2.0 協議下加載的耗時。HTTP 2.0 的速度差很少是 HTTP 1.1 的6倍。優化

演示網站


下面咱們來直觀地認識下它們。spa

首先是二進制幀

在 TCP 協議中,數據的傳輸單位是數據報。數據分紅兩大部分。頭部(header) 和 實際數據部分(body)。

在 HTTP 2.0 中,它把數據報的兩大部分分紅了 header framedata frame。也就是頭部幀和數據體幀。幀的傳輸最終在流中進行,流中的幀,頭部(header)幀data 幀能夠分爲多個片斷幀,例如data幀便是能夠 data = data_1 + data_2 + ... + data_n

此外地,若是基於二進制幀總體來劃分,除了報文的幀分類。還有其它一些輔助幀類型,例如評論中提到的:SETTINGS、PING、GOWAY、WINDOW_UPDATE等控制幀。

其次是

表明了一個完整的請求-響應數據交互過程。它具備以下幾個特色:

  1. 雙向性:同一個流內,可同時發送和接受數據。
  2. 有序性:流中被傳輸的數據就是二進制幀 。幀在流上的被髮送與被接收都是按照順序進行的。
  3. 並行性:流中的 二進制幀 都是被並行傳輸的,無需按順序等待。但卻不會引發數據混亂,由於每一個幀都有順序標號。它們最終會被按照順序標號來合併。
  4. 流的建立:流能夠被客戶端或服務器單方面創建, 使用或共享。
  5. 流的關閉:流也能夠被任意一方關閉。

下圖來源於:https://blog.csdn.net/zqjflash/article/details/50179235 。它演示了流中的幀的有序性並行性 。例如數據報1data frame 就沒有連着一塊兒傳輸,而是分紅了2個。

總結一下流和幀的關係

幀是流中的數據單位。一個數據報的header 幀能夠分紅多個 header 幀,data 幀能夠分紅多個data 幀。

多路複用

HTTP 2.0 的多路複用實際上是 HTTP 1.1 中長連接的升級版本。

在 HTTP 1.1 中,一次連接成功後,只要該連接還沒斷開,那麼 client 端能夠在這麼一個連接中有序地發起多個請求,並以此得到每一個請求對應的響應數據。它的缺點是,一次請求與響應的交互必需要等待前面的請求交互完成,不然後面的只能等待,這個就是線頭阻塞。下面舉個例子:

請求A 和 請求B。A 先被髮起,此時 server 端接收到了 A 請求,正在處理。同時 B 請求也發過來了。可是 A 請求還沒被返回,此時 B 請求只能等待。

在 HTTP 2.0 中,一次連接成功後,只要連接還沒斷開,那麼 client 端就能夠在一個連接中併發地發起多個請求,每一個請求及該請求的響應不須要等待其餘的請求,某個請求任務耗時嚴重,不會影響到其它鏈接的正常執行。

下面經過圖來看看:

由於這上述這三個特性,讓 HTTP 2.0 在數據的傳輸延遲上,起到了很大的優化做用。

那麼,在咱們的代碼中,如何指定使用 HTTP 2.0 協議呢?

最簡單的方法,代碼中,使用網絡請求,在構造請求參數的時候,在 http 請求頭部指定 protocol 版本便可,例以下面例子:

http 1.1 的

GET /index HTTP/1.1  
Host: www.xxx.com 
複製代碼

本文參考於:

相關文章
相關標籤/搜索