TCP隊頭阻塞和HTTP隊頭阻塞


1. TCP隊頭阻塞

TCP數據包是有序傳輸,中間一個數據包丟失,會等待該數據包重傳,造成后面的數據包的阻塞。

2. HTTP隊頭阻塞

http隊頭阻塞和TCP隊頭阻塞完全不是一回事。

http1.x采用長連接(Connection:keep-alive),可以在一個TCP請求上,發送多個http請求。

有非管道化和管道化,兩種方式。

非管道化,完全串行執行,請求->響應->請求->響應...,后一個請求必須在前一個響應之后發送。

管道化,請求可以並行發出,但是響應必須串行返回。后一個響應必須在前一個響應之后。原因是,沒有序號標明順序,只能串行接收。

管道化請求的致命弱點:

1. 會造成隊頭阻塞,前一個響應未及時返回,后面的響應被阻塞
2. 請求必須是冪等請求,不能修改資源。因為,意外中斷時候,客戶端需要把未收到響應的請求重發,非冪等請求,會造成資源破壞。

由於這個原因,目前大部分瀏覽器和Web服務器,都關閉了管道化,采用非管道化模式。

無論是非管道化還是管道化,都會造成隊頭阻塞(請求阻塞)。

解決http隊頭阻塞的方法:

1. 並發TCP連接(瀏覽器一個域名采用6-8個TCP連接,並發HTTP請求)
2. 域名分片(多個域名,可以建立更多的TCP連接,從而提高HTTP請求的並發)

2. HTTP2方式

http2使用一個域名單一TCP連接發送請求,請求包被二進制分幀,不同請求可以互相穿插,避免了http層面的請求隊頭阻塞。
但是不能避免TCP層面的隊頭阻塞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM