HTTP/2 比 HTTP/1 快在哪里?
編者按:
HTTP/2 比 HTTP/1 快在哪里?其底層的技術(shù)原理是什么?本文和你簡單聊聊 HTTP/2 在一些技術(shù)細(xì)節(jié)上,是如何使其比 HTTP/1 更快。
1.?
HTTP/2 的來頭
HTTP/2 是 HTTP 協(xié)議第二個版本,其目標(biāo)是為了改進(jìn)HTTP/1存在的不足,讓應(yīng)用訪問網(wǎng)絡(luò)更快。
HTTP/2是如何使網(wǎng)絡(luò)訪問「更快」的呢?
我們先來看看?HTTP/2 的“野心”:
-
從基于文本的 HTTP/1.1 轉(zhuǎn)換為二進(jìn)制協(xié)議,數(shù)據(jù)傳輸效率更高
-
支持請求多路復(fù)用,提高數(shù)據(jù)的訪問速度
-
更高效的HTTP 頭部壓縮,提升數(shù)據(jù)傳輸速度
-
兼容 HTTP/1.1 標(biāo)準(zhǔn)定義的方法、狀態(tài)代碼、URI 和標(biāo)頭字段。客戶端無需進(jìn)行任何更改就可以像請求 HTTP/1 那樣請求服務(wù)端
-
支持設(shè)置請求優(yōu)先級,確保更重要的資源得到更快的加載,以獲得最佳用戶體驗
-
支持服務(wù)器端推送資源給客戶端,不需要客戶端再次發(fā)送請求
也就是說,HTTP/2 比 HTTP/1 更牛x。同時客戶端可以使用從 HTTP/1 遷移到 HTTP/2,無需做什么修改即可享受 HTTP/2 帶來的高效。
2.
HTTP/2 如何實現(xiàn)其“野心”?
2.1 多路復(fù)用:允許同時發(fā)送多個請求和響應(yīng)
HTTP/1 對每一個域名最多維護(hù)6個TCP連接,也就是說最多有六個TCP連接并發(fā)請求數(shù)據(jù)。但是TCP第一次啟動有一個慢啟動過程(這是我們無法避免的,為了減少TCP網(wǎng)絡(luò)擁塞)。雖然啟動了六個TCP連接請求數(shù)據(jù),但每一個TCP都有一個慢啟動過程,導(dǎo)致數(shù)據(jù)有一部分時間浪費(fèi)在了慢啟過程。
特別在帶寬資源不足的時候(比如請求很多資源,占用帶寬),TCP為了避免網(wǎng)絡(luò)擁塞會自動降低網(wǎng)絡(luò)請求速度,導(dǎo)致整體的數(shù)據(jù)請求速度都比較慢。
這些問題在 HTTP/2 中就不存在了。HTTP/2 使用多路復(fù)用技術(shù),每一個域名只開啟一個TCP連接,這樣浪費(fèi)在TCP慢啟動的事件就變少了,也避免了下載大量數(shù)據(jù)導(dǎo)帶寬資源不足從而降低TCP訪問速度。
還有,HTTP/2還只是并發(fā)發(fā)起多條網(wǎng)絡(luò)請求。在 HTTP/1 中,TCP連接雖然可以復(fù)用,但下一個請求需要排隊等待上一個請求結(jié)束,網(wǎng)絡(luò)請求速度必然造成擁堵。
下圖描繪HTTP/2多路復(fù)用流程:HTTP/2同一個TCP中可以不用等待上一個請求結(jié)束,直接發(fā)起請求,每一個請求都有一個ID唯一標(biāo)識。這樣服務(wù)端,就可以隨意處理而不用根據(jù)其請求的順序。比如圖中請求的順序是3->2->1,響應(yīng)順序是2->1->3。

圖2.1.1 HTTP/2 網(wǎng)絡(luò)多路復(fù)用流程圖
2.2 壓縮:壓縮請求/響應(yīng)頭,以提高工作效率
這點(diǎn)沒什么好說,就是運(yùn)用一些算法壓縮請求/響應(yīng)頭,這樣數(shù)據(jù)在網(wǎng)絡(luò)中傳輸速度會更快。在HTTP/2中用的是?HPACK 壓縮算法。
2.3?設(shè)置請求優(yōu)先級
客戶端請求可以設(shè)置優(yōu)先級。優(yōu)先級更高的請求會優(yōu)先得到服務(wù)端的處理。瀏覽器可以運(yùn)用這一特性,在渲染網(wǎng)頁時讓更核心的資源請求的優(yōu)先級更高。這樣網(wǎng)頁的渲染速度自然也得到提升,畢竟一些低優(yōu)先級的資源可以在網(wǎng)頁展示之后再加載也沒有關(guān)系。
2.4 服務(wù)器推送:服務(wù)器可以在請求之前發(fā)送請求所需的其他信息
比如客戶端訪問A資源,服務(wù)端也知道客戶端隨后也會訪問B資源,這樣服務(wù)端就可以把B資源和A資源一起返回給客戶端,客戶端就不用再發(fā)起請求了。這樣就提高了客戶端訪問的速度,比如網(wǎng)頁的渲染。
2.5?更安全
HTTP/2 使用二進(jìn)制傳輸數(shù)據(jù),這樣就減少攻擊的可能。比如在 HTTP/1 中響應(yīng)是文本格式,可能會被惡意插入一行文本來篡改響應(yīng)頭。
3.?
HTTP/2 的優(yōu)缺點(diǎn)
通過上面介紹,我們知道 HTTP/2 相比 HTTP/1:
-
支持設(shè)置請求優(yōu)先級:留給客戶端優(yōu)化請求的空間更多。
-
數(shù)據(jù)傳輸效率更高:HTTP/2 傳輸二進(jìn)制流,HTTP/1是傳輸文本。
-
多路復(fù)用:降低網(wǎng)絡(luò)資源的占用,提高帶寬使用率。
-
更好的安全性。
. .... .
誠然,沒有任何技術(shù)是銀彈,HTTP/2 也有它的缺點(diǎn)。
HTTP/2 使用一個TCP連接處理所有請求,如果某一個請求丟包重試,會導(dǎo)致后面的請求被阻塞。如圖,請求A重傳,阻塞了請求D。

圖3.1 HTTP/2?重傳導(dǎo)致包阻塞
當(dāng)然 HTTP/2 還有其他優(yōu)缺點(diǎn)點(diǎn),這里不繼續(xù)探討。讀者可以從其技術(shù)實現(xiàn)細(xì)節(jié)去思考。
參考資料:
1、李兵:HTTP/2:如何提升網(wǎng)絡(luò)速度?
2、https://www.upwork.com/resources/what-is-http2
