理解HTTP/2的多路復(fù)用

什么是 HTTP/2
HTTP/2 就是超文本傳輸協(xié)議的第二個(gè)主要版本,是自1999年 HTTP 1.1 之后發(fā)布的首個(gè)更新,主要基于 SPDY 協(xié)議(是Google開發(fā)的基于TCP的應(yīng)用層協(xié)議,用以最小化網(wǎng)絡(luò)延遲,提升網(wǎng)絡(luò)速度,優(yōu)化用戶的網(wǎng)絡(luò)使用體驗(yàn))。
和 HTTP1.1 比起來有什么優(yōu)勢
1、HTTP/2采用二進(jìn)制格式而非文本格式
2、HTTP/2是完全多路復(fù)用的,而非有序并阻塞的——只需一個(gè)連接即可實(shí)現(xiàn)并行
3、使用報(bào)頭壓縮,HTTP/2降低了開銷
4、HTTP/2讓服務(wù)器可以將響應(yīng)主動(dòng)“推送”到客戶端緩存中
其中的多路復(fù)用對(duì)前端優(yōu)化性能有很大的幫助
什么是多路復(fù)用
在 HTTP 1.1 中,發(fā)起一個(gè)請(qǐng)求是這樣的:
瀏覽器請(qǐng)求 url -> 解析域名 -> 建立 HTTP 連接 -> 服務(wù)器處理文件 -> 返回?cái)?shù)據(jù) -> 瀏覽器解析、渲染文件
這個(gè)流程最大的問題是,每次請(qǐng)求都需要建立一次 HTTP 連接,也就是我們常說的3次握手4次揮手,這個(gè)過程在一次請(qǐng)求過程中占用了相當(dāng)長的時(shí)間,而且邏輯上是非必需的,因?yàn)椴婚g斷的請(qǐng)求數(shù)據(jù),第一次建立連接是正常的,以后就占用這個(gè)通道,下載其他文件,這樣效率多高啊!
為了解決這個(gè)問題, HTTP 1.1 中提供了 Keep-Alive,允許我們建立一次 HTTP 連接,來返回多次請(qǐng)求數(shù)據(jù)。
但是這里有兩個(gè)問題:
HTTP 1.1 基于串行文件傳輸數(shù)據(jù),因此這些請(qǐng)求必須是有序的,所以實(shí)際上我們只是節(jié)省了建立連接的時(shí)間,而獲取數(shù)據(jù)的時(shí)間并沒有減少。
而 HTTP/2 引入二進(jìn)制數(shù)據(jù)幀和流的概念,其中幀對(duì)數(shù)據(jù)進(jìn)行順序標(biāo)識(shí),這樣瀏覽器收到數(shù)據(jù)之后,就可以按照序列對(duì)數(shù)據(jù)進(jìn)行合并,而不會(huì)出現(xiàn)合并后數(shù)據(jù)錯(cuò)亂的情況。同樣是因?yàn)橛辛诵蛄?,服?wù)器就可以并行的傳輸數(shù)據(jù)。
HTTP/2 對(duì)同一域名下所有請(qǐng)求都是基于流,也就是說同一域名不管訪問多少文件,也只建立一路連接。
一個(gè)域名對(duì)應(yīng)一個(gè)連接,一個(gè)流代表了一個(gè)完整的請(qǐng)求-響應(yīng)過程。幀是最小的數(shù)據(jù)單位,每個(gè)幀會(huì)標(biāo)識(shí)出該幀屬于哪個(gè)流,流也就是多個(gè)幀組成的數(shù)據(jù)流。多路復(fù)用,就是在一個(gè) TCP 連接中可以存在多個(gè)流。

