當我們在談論HTTP隊頭阻塞時,我們在談論什麼?

2021-09-19 11:58:46 字數 1273 閱讀 1225

通過tcp多路復用降低延遲;

單個tcp連線上允許亂序request-response,解決隊頭堵塞問題;

實現層面上,大部分瀏覽器要求http/2必須開啟tls,一定程度上解決資料安全問題。

其中,隊頭阻塞問題真的被解決了嗎?

http/1.1為什麼會隊頭阻塞?

http/1.1通過pipelining管道技術實現一次性傳送多個請求,以期提高吞吐和效能,如上圖中的序列2。然而,這種技術在接收響應時,要求必須按照傳送請求的順序返回。如果,第乙個請求被堵塞了,則後面的請求即使處理完畢了,也需要等待,如上圖中的序列3。

那麼,http/2是怎麼解決這個問題的呢?那就是資料分幀:多個請求復用乙個tcp連線,然後每個request-response都被拆分為若干個frame傳送,這樣即使乙個請求被阻塞了,也不會影響其他請求,如上圖序列4所示。問題完美解決了?準確說,只解決了一部分。

如果隊頭阻塞的粒度是http request這個級別,那麼http/2 over tcp的確解決了http/1.1中的問題。但是,http/2目前實現層面上都是基於tcp(沒錯,http從來沒有說過必須通過tcp實現,你可以用它其他傳輸協議實現喲),因此http/2並沒有解決資料傳輸層的對頭(包)阻塞問題。

如上圖所示,當第乙個資料報發生丟包的時候,tcp協議會發生阻塞會進行資料重傳。雖然tcp有快速重傳等機制來緩解這個問題,但是只能是緩解。無法完全避免。

如何解決傳輸層的隊頭阻塞問題?

應用層無法解決傳輸層的問題。因此要完全解決隊頭阻塞問題,需要重新設計和實現傳輸層。目前而言,真正落地在應用的只看到google的quic. 它的原理簡單講,就是使用udp實現了乙個可靠的多路復用傳輸層。我們知道udp是面向資料報文的,資料報之間沒有阻塞約束,quic就是充分利用這個特性解決傳輸層的隊頭阻塞問題的。當然,quic的協議實現有非常多的細節,而這方面google確實做得非常好,如果你想進一步了解,可以關注他們的開源實現。

需要說明的是,當前的quic實現使用hpack壓縮http header, 受限於當前hpack演算法實現,在quic中的header幀也是受隊頭阻塞的。但是粒度已經降低到了幀這個級別,並且僅會在header幀**現。實際使用中,出現的概率已經非常低了。

小結http/2 over tcp(我們接觸最多的http/2)解決了http request級別的隊頭阻塞問題

http/2 over quic解決了傳輸層的隊頭阻塞問題(除去header frame),是我們理解的真正解決了該問題。

及cp含義 當我們談論CP時,我們在談論什麼?

其實早在2010年,晉江文學網的作者風舞輕影就投稿了伏黛向的同人文 來自遠方為你葬花 此文目前在晉江已經被鎖文 作者奇大的腦洞和拉郎配的行為讓這篇同人文被不少人扣上了雷文的帽子。但是crossover同人和跨界cp在歐美同人圈早已是見怪不怪的事。只是中國的同人圈興起較晚,國內的思想觀念也比較封閉,直...

當我們在談論Flink的時候,我們到底在談論些什麼

目前每當我們聊到當下熱門的計算引擎的時候,無一例外地會聊到apache flink 當下非常火熱的流處理計算框架。更是有人拿它和spark做對比,到底哪個才是現今最好的計算引擎。當然這個已經不是本文所要闡述的主題啦。老實話,筆者本人做的比較多的還是儲存領域,對計算領域的知識不敢說是內行。最近也是抽空...

第1章 當我們談論演算法的時候,我們在談論什麼?

無論是bat,還是flag,但凡有點兒水平的技術公司,面試都要面演算法。為什麼演算法這麼重要?在工作中,真的會使用演算法嗎?學了演算法到底有什麼用?當我們談論演算法的時候,我們在談論什麼?大話資料結構 第 1 章緒論結尾語 既然無數的人都已經掌握了 資料結構與演算法 你憑什麼不行?只有真正掌握技術的...