溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

http2中多路復(fù)用的示例分析

發(fā)布時(shí)間:2022-01-19 09:25:13 來源:億速云 閱讀:143 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了http2中多路復(fù)用的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

回顧http1.1協(xié)議,我們了解到,雖然http1.1實(shí)現(xiàn)了tcp的長(zhǎng)連接,在一個(gè)tcp鏈接通道中,我們可以連續(xù)處理多個(gè)http請(qǐng)求響應(yīng),但是這個(gè)處理過程是半雙工模式,也就是同一時(shí)刻只能處理一個(gè)request的請(qǐng)求或者響應(yīng),后面的request必須等到前面的請(qǐng)求響應(yīng)之后才能進(jìn)行。

瀏覽器為了更加快速的加載頁面資源,于是針對(duì)同一域名設(shè)置了最大并發(fā)數(shù),這樣做能稍微加快速度,但是也帶了一些問題,參看上一篇文章http1.1相對(duì)http2有哪些不足。

http2完全摒棄http1.1半雙工通信的方式,實(shí)現(xiàn)了全雙工通信,具體表現(xiàn)為:瀏覽器針對(duì)同一個(gè)域名的資源,只建立一個(gè)tcp連接通道,所有的針對(duì)這個(gè)域名的請(qǐng)求全部在這個(gè)通道中完成,并且引入了流的機(jī)制,這條通道可以同時(shí)處理多個(gè)request,這不同于http1.1的pepeline,http2的多路復(fù)用,對(duì)于request的響應(yīng)并不會(huì)因?yàn)樯弦粋€(gè)request的響應(yīng)未完成而阻塞,http2徹底解決了http層面的隊(duì)頭阻塞。

http2中在一個(gè)tcp通道中的所有http請(qǐng)求不分先后,不會(huì)阻塞,同樣是一個(gè)頁面中多個(gè)資源同時(shí)去請(qǐng)求,用http2來實(shí)現(xiàn)的話,過程如圖:

http2中多路復(fù)用的示例分析

這張圖與上一篇文章中http1.1版本中的圖是有區(qū)別的,可以看到這里http請(qǐng)求并不會(huì)因?yàn)榍懊娴恼?qǐng)求未響應(yīng)而阻塞。

我們來通過幾張圖來演示一下http1.1到http1.1的pipeline在到http2的進(jìn)化。

先看第一張圖:

http2中多路復(fù)用的示例分析

仔細(xì)觀察上圖,發(fā)現(xiàn)在http1.1版本中的一個(gè)tcp通道中,這是一個(gè)單通道,同一時(shí)刻只能處理一個(gè)http請(qǐng)求,并且必須按照順序。

再看第二張圖:

http2中多路復(fù)用的示例分析

仔細(xì)觀察這張圖,雖然在一個(gè)tcp通道中實(shí)現(xiàn)了多個(gè)http并發(fā),但是返回的時(shí)候是會(huì)阻塞的,誰先到達(dá),誰先返回,順序絕對(duì)不能亂,這就是http1.1pipeline的弊端。還有另一個(gè)pipeline的限制,只能是冪等請(qǐng)求(get、head等)才能應(yīng)用pipeline,大部分瀏覽器默認(rèn)是關(guān)閉pipeline的。

再看第三張圖:

http2中多路復(fù)用的示例分析

這張圖中在一個(gè)tcp鏈接通道中,同時(shí)進(jìn)行多個(gè)http請(qǐng)求和響應(yīng),仔細(xì)觀察請(qǐng)求順序和響應(yīng)順序無關(guān),速度相對(duì)于上面兩張圖明顯變快,并且頁面中的資源請(qǐng)求都在一個(gè)tcp通道中完成,有效的避免了tcp競(jìng)速,慢啟動(dòng)等因素。

上面只是演示了http2的傳輸方式,那么他是如何實(shí)現(xiàn)的呢?

http1.1是明文協(xié)議,解析http1.1的明文是基于文本。http2.0的協(xié)議采用的是二進(jìn)制格式。

http2為什么要采用二進(jìn)制格式呢?

1、基于文本解析的話,文本的表現(xiàn)形式有多樣性,要做到健壯性考慮的場(chǎng)景必然很多。

2、二進(jìn)制則只認(rèn)0和1的組合,解析速度更快。

那么在不改動(dòng) HTTP/1.1 的語義、?法、狀態(tài)碼、URI 以及?部字段等等的情況下, HTTP/2 是如何過渡到http1.1呢? 

關(guān)鍵之?就是在應(yīng)?層(HTTP/2)和傳輸層(TCP or UDP)之間增加?個(gè)?進(jìn)制分幀層。如圖:

http2中多路復(fù)用的示例分析

在?進(jìn)制分幀層中, HTTP/2 會(huì)將所有傳輸?shù)男畔⒎指顬楦?的消息并封裝在幀(frame)中,并對(duì)它們采??進(jìn)制格式的編碼 ,其中 HTTP1.1的?部信息會(huì)被封裝到 HEADER frame,?相應(yīng)的 Request Body 則封裝到 DATA frame ??。如上圖的HEADER frame和DATA frame分別對(duì)應(yīng)http1.1的請(qǐng)求頭和請(qǐng)求體。

對(duì)比如圖:

http2中多路復(fù)用的示例分析

并且,HTTP/2 通信都在?個(gè)tcp連接上完成,這個(gè)連接會(huì)同時(shí)處理多個(gè)http的request,http2給每個(gè)http的request都分配唯一的streamId,而每個(gè)request切割出來的fram都共用這個(gè)streamId,這樣的話http2就可以基于這個(gè)streamid將切割的信息還原,http2通道中同時(shí)處理多個(gè)request的方式類似處理多個(gè)流,所以有些文章會(huì)指出http2實(shí)現(xiàn)了流方式傳遞信息。如圖:

http2中多路復(fù)用的示例分析

上圖中每個(gè)大的藍(lán)色方塊代表一個(gè)http的request,每個(gè)request被切割為多個(gè)fream,并且被編號(hào),我們用黃紅綠三種顏色分別代表三個(gè)stream流,不同的顏色代表不同的streamid,http2接收到數(shù)據(jù)會(huì)根據(jù)其streamid自動(dòng)還原數(shù)據(jù),這樣就實(shí)現(xiàn)了在一個(gè)TCP連接通道中的流式傳輸,多個(gè)request都會(huì)復(fù)用這個(gè)TCP通道,實(shí)現(xiàn)了高效的復(fù)用。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“http2中多路復(fù)用的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI