做者:林冠宏 / 指尖下的幽靈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 frame
和 data frame
。也就是頭部幀和數據體幀。幀的傳輸最終在流中進行,流中的幀,頭部(header)幀
和 data 幀
能夠分爲多個片斷幀,例如data
幀便是能夠 data = data_1 + data_2 + ... + data_n
。
此外地,若是基於二進制幀
總體來劃分,除了報文的幀分類。還有其它一些輔助幀類型,例如評論中提到的:SETTINGS、PING、GOWAY、WINDOW_UPDATE等控制幀。
流
流
表明了一個完整的請求-響應
數據交互過程。它具備以下幾個特色:
二進制幀
。幀在流上的被髮送與被接收都是按照順序進行的。二進制幀
都是被並行傳輸的,無需按順序等待。但卻不會引發數據混亂,由於每一個幀都有順序標號。它們最終會被按照順序標號來合併。下圖來源於:https://blog.csdn.net/zqjflash/article/details/50179235
。它演示了流中的幀的有序性
與並行性
。例如數據報1
的 data 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 請求頭部指定 protocol 版本便可,例以下面例子:
http 1.1 的
GET /index HTTP/1.1
Host: www.xxx.com
複製代碼
本文參考於: