http2是如何解決tcp的隊首阻塞的?

時間 2021-06-03 12:01:49

1樓:Liuyl

我想你說的是http2 over tcp。這個實現的http2確實可以解決應用層的頭部阻塞問題,原理很簡單,為每個frame標序傳送即可,接收回來的時候按序重組,自然知道收到的資料屬於哪個http傳送過去的,放在那個佇列即可。

不過你應該是理解錯了,這個方案只能解決上面提到的應用層,也就是http的隊首阻塞,,所以乾脆就阻塞住,或者開乙個新的tcp連線來傳送。

很顯然這無法解決tcp層面的隊頭阻塞,tcp一旦發生丟包,就要立即給傳送端訊號要求重發(ack不變)此後傳送端會根據策略進行gbn或者sq,此時接收端是完全阻塞住的,後續byte全部儲存在緩衝區(假設足夠大的話)上層也無法解析這些位元組,所以叫隊首阻塞。

並且你使用over tcp的http2很可能會加大這種隊首阻塞(因為現在同一條tcp的流量增大了很多,丟包更容易發生了)。不過這不影響它的優勢,丟包導致的傳輸層阻塞時間遠遠小於應用層阻塞http導致的延遲時間。

如果想要完全解決這個問題,可以使用http2 over quic/http3 後者其實是參照了前者的模式來設計的,但直接使用了udp,這樣按包傳送就再也沒有阻塞問題了。

2樓:給劍純道歉

HTTP/2 並沒有解決 TCP 的隊首阻塞問題,它僅僅是通過多路復用解決了以前 HTTP1.1管線化請求時的隊首阻塞。

比如 HTTP/1.1 時代建立乙個 TCP 連線,三個請求組成乙個佇列發出去,伺服器接收到這個佇列之後會依次響應,一旦前面的請求阻塞,後面的請求就會無法響應。

HTTP/2 是通過分幀並且給每個幀打上的 ID 去避免依次響應的問題,對方接收到幀之後根據 ID 拼接出流,這樣就可以做到亂序響應從而避免請求時的隊首阻塞問題。但是 TCP 層面的隊首阻塞是 HTTP/2 無法解決的(HTTP 只是應用層協議,TCP 是傳輸層協議),TCP 的阻塞問題是因為傳輸階段可能會丟包,一旦丟包就會等待重新發包,阻塞後續傳輸,這個問題雖然有滑動視窗(Sliding Window)這個方案,但是只能增強抗干擾,並沒有徹底解決。

3樓:絕望的祖父

這裡所說的HTTP 1.x 中存在的隊首阻塞和TCP協議的隊首阻塞是兩回事。

HTTP 1.x 協議只能嚴格序列地返回請求,不允許乙個連線上的多個響應資料交錯到達,因而乙個響應必須完全返回後,下乙個響應才會開始傳輸。你看的那本書11.

2節HTTP管道,詳細講解了這個事情。

當然,你也可以通過同時開啟多個TCP連線來繞過HTTP應用協議的這個限制。這在 11.3節使用多個TCP連線中也詳細講解了。

如何解決長城寬頻主動斷開tcp長連線的問題?

鶴83 你用長寬線路和你的伺服器傳輸資料,不超過5M頻寬說明該阿里雲IP沒有接入長城寬頻線路,換多幾個阿里雲IP,再不行可以換區域試試。 只能打長寬客服轉機房網管做白名單解決。TCP IP協議下,出口路由的埠只有65536個,長寬乙個出口路由下內網使用者太多,為了不讓高峰時長鏈結佔滿了出口路由埠,埠...

如何解決紅警2尤里的復仇在Windows 10下執行卡頓?

正青春 手機玩尤里的復仇豈不更爽啊 獨孤木人 建議雙系統,現在SSD的容量,拿來裝WIN10和WIN7的雙系統組合挺合適。如果你還有更多舊系統下的特性需求,這個方案會更加適合你。 Lison 水乙個,這個遊戲整整跨越了15年,從2000,xp,vista,win7,win8到win10,玩的時候仍舊...

你是如何解決失業期間的焦慮的?

肥兔兔 比較不幸也比較幸運,有兩次離職經歷,非常被動的離職。但是都在乙個月中找到工作。那種心中的焦躁和不安無法描述。熬著忍著,加強學習。為下次機會做準備。人生這條路不會第一次遇到挫折,也不會是最後一次遇到。明月掛夜空,萬載不變。處之坦然。 有個性的雪梨 運動,給自己做飯,寫日記,研究面試套路,修改簡...