# TCP隊頭阻塞
## TCP隊頭阻塞(head of line blocking)
HTTP/2是基于TCP實現的。相比之前的版本,HTTP/2使用的TCP連接數少了很多。TCP是一個可靠的傳輸協議,基本上,你可以將它視為在兩臺計算機間建立的一個虛擬鏈路,由一端放到網絡上的內容,最終總會以相同的順序出現在另一端。(或者遭遇連接中斷)

采用HTTP/2時,瀏覽器一般會在單個TCP連接中創建并行的幾十個乃至上百個傳輸。
如果HTTP/2連接雙方的網絡中有一個數據包丟失,或者任何一方的網絡出現中斷,整個TCP連接就會暫停,丟失的數據包需要被重新傳輸。因為TCP是一個按序傳輸的鏈條,因此如果其中一個點丟失了,鏈路上之后的內容就都需要等待。
如下圖所示,我們一個用鏈條來表現一個連接上發送的兩個流(傳輸),紅色的與綠色的數據流:

這種單個數據包造成的阻塞,就是TCP上的隊頭阻塞(head of line blocking)。
隨著丟包率的增加,HTTP/2的表現越來越差。在2%的丟包率(一個很差的網絡質量)中,測試結果表明HTTP/1用戶的性能更好,因為HTTP/1一般有六個TCP連接,哪怕其中一個連接阻塞了,其他沒有丟包的連接仍然可以繼續傳輸。
在限定的條件下,在TCP下解決這個問題相當困難。
## 獨立的數據流避免阻塞問題
使用QUIC時,兩端間仍然建立一個連接,該連接也經過協商使得數據得到安全且可靠的傳輸。

但是,當我們在這個連接上建立兩個不同的數據流時,它們互相獨立。也就是說,如果一個數據流丟包了,只有那個數據流必須停下來,等待重傳。
下面是兩個端點間的示意圖,黃色與藍色是兩個獨立的數據流。
