動畫:如何給面試官回答 TCP 的擁塞控制?
前邊我們分享了網絡分層協議、TCP 三次握手、TCP 四次分手。今天我們繼續深入分享一下 TCP 中的擁塞控制。
對于 TCP 的擁塞控制,里邊設計到很多細節,小鹿希望通過這一節能夠將這部分內容串通起來,能夠讓你更深刻的記憶這部分內容。
思維導圖
1. 什么是擁塞控制?
擁塞控制是一種用來調整傳輸控制協議(TCP)連接單次發送的分組數量的算法。它通過增減單次發送量逐步調整,使之逼近當前網絡的承載量。
簡單易懂的話來說,所謂的擁塞控制,從字面的意思來講,網絡通信就像是一個水管里的水,如果水突然因為水管的贓物阻塞了,那么我們就應該采取一定的策略,讓其在阻塞的時候如何處理。
2. 為什么進行擁塞控制?
如果發送端要給接收端發送數據,只有當接收端接收到數據時,才會給發送端返回應答信息。如果接收端沒有發送應答信息,發送端則認為該數據已經丟失,則進行重新發送。


其實我們也不知道接收端有沒有接收,數據包到底在哪一步出現了問題呢?分為兩種情況,如下:
1. 數據包真的在半路丟失了

2. 網絡通信處于擁擠狀態,數據包還沒有到達接收方。

我們的擁塞控制是主要針對于第二種情況的。如果網絡信道中一直處于擁擠狀態,那么發送端一直進行發送,就會變得更加的阻塞,而且同時白白浪費掉了網絡的資源。
3. 測試網絡狀況
我們進行擁塞控制之前,首先要判斷網絡信道是否阻塞了,當判斷出網絡阻塞時,我們才能進行擁塞控制。我們一般通過向網絡中連續發送多個數據包來進行測試,測試過程中,如果發送數據包到達了一定的程度,網絡通信就會阻塞。
有以下兩種探測網絡的情況,第一種就是逐漸遞增發送數據包,一次只發送一個數據包,第二次發送兩個,第三次發送三個,以此類推,總會在一個點發送網絡擁堵情況

第二種情況就是指數型的增長,顧名思義,就是發送數據包以指數的形式進行增長,第一次發生一個,第二次發送兩個,第三次發送四個...也會在某一時刻網絡進行擁堵。
但是第一種方法有一個問題就是增長的太慢,當到達到擁塞時,需要經歷很長的時間,這種探測的方式效率太低。
當我們使用第二種方法時,指數增長就會出現增長的太快,會錯過增長的點。
既然兩種方式各有所長,我們就結合兩種方式,首先我們進行指數增長,我們設定一定的閥值,然后到達閥值之后,然后進行逐次遞增,直到出現網絡擁塞為止。
- 指數增長階段稱為慢啟動
- 逐次增長稱之為擁塞避免
4. 什么是擁塞窗口?
我們把一次性能夠發送的數據包多少的窗口稱之為擁塞窗口。
我們通過控制發送窗口的大小,也就是發送數據包的多少來進行擁塞控制。
5. 阻塞超時
當數據包增長到一定程度就會出現超時事件(阻塞),出現超時事件就認為網絡擁塞了,不能再繼續增長了,此時標記為一個最大值 M。
如果超時了之后,我們開始進行擁塞控制,怎么做呢?我們將增長的閥值進行降低,降低到 M 的一半大小,也就是 M/2。如下圖所示,最大值為 24,此時發生擁塞,所以將閥值降為 12。
有的小伙伴就說了,你那超時不一定發生阻塞了,上邊你也提到了,可能出現了數據包的丟失,那怎么判斷這種情況呢?
6. 判斷發送超時的情況
我們上邊也說了,超時存在兩種情況,我們就采用連續發送 ACK 的方式來進行判斷到底是網絡阻塞了還是網絡數據包丟失了。
如下圖所示,如果發送一個數據包,接收端成功接收之后,就會返回一個響應數據包,然后發送端再次發送下一個數據包。
一旦發送端在發送數據包的時候中途丟失了,接收端會返回上一次接收的數據包的確認響應數據包,當發送端連續接收到三個相同的響應數據包時,就說明該數據包丟失了,然后快速重傳該數據包。
然后會把我們的閥值設置為擁塞最大值 M 的一半,這時候的擁塞窗口的大小為 1,當擁塞窗口的大小等于閥值時,再進行線性增長。我們也把上邊這種情況稱之為快速恢復。
小結
今天主要分享了 TCP 的擁塞控制,為什么會有擁塞控制?如何進行擁塞控制以及如何判斷網絡中的情況。
通過擁塞控制,我們能夠更好地進行數據高效的傳輸,除此之外,我們后邊的文章還會更新 TCP 的流量控制,為了能夠使得網絡中的流量得到充分的利用。































