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

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

2. 網(wǎng)絡通信處于擁擠狀態(tài),數(shù)據(jù)包還沒有到達接收方。

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