1. 程式人生 > 其它 >TCP 的擁塞控制?

TCP 的擁塞控制?

1.什麼是擁塞控制? 擁塞控制是一種用來調整傳輸控制協議(TCP)連線單次傳送的分組數量的演算法。它通過增減單次傳送量逐步調整,使之逼近當前網路的承載量。 簡單易懂的話來說,所謂的擁塞控制,從字面的意思來講,網路通訊就像是一個水管裡的水,如果水突然因為水管的贓物阻塞了,那麼我們就應該採取一定的策略,讓其在阻塞的時候如何處理。 2.為什麼進行擁塞控制? 如果傳送端要給接收端傳送資料,只有當接收端接收到資料時,才會給傳送端返回應答資訊。如果接收端沒有傳送應答資訊,傳送端則認為該資料已經丟失,則進行重新發送。 其實我們也不知道接收端有沒有接收,資料包到底在哪一步出現了問題呢?分為兩種情況,如下: 2.1. 資料包真的在半路丟失了 2.2 網路通訊處於擁擠狀態,資料包還沒有到達接收方。 我們的擁塞控制是主要針對於第二種情況的。如果網路通道中一直處於擁擠狀態,那麼傳送端一直進行傳送,就會變得更加的阻塞,而且同時白白浪費掉了網路的資源。 3.測試網路狀況
我們進行擁塞控制之前,首先要判斷網路通道是否阻塞了,當判斷出網路阻塞時,我們才能進行擁塞控制。我們一般通過向網路中連續傳送多個數據包來進行測試,測試過程中,如果傳送資料包到達了一定的程度,網路通訊就會阻塞。 有以下兩種探測網路的情況,第一種就是逐漸遞增傳送資料包,一次只發送一個數據包,第二次傳送兩個,第三次傳送三個,以此類推,總會在一個點發送網路擁堵情況 第二種情況就是指數型的增長,顧名思義,就是傳送資料包以指數的形式進行增長,第一次發生一個,第二次傳送兩個,第三次傳送四個...也會在某一時刻網路進行擁堵。 但是第一種方法有一個問題就是增長的太慢,當到達到擁塞時,需要經歷很長的時間,這種探測的方式效率太低。 當我們使用第二種方法時,指數增長就會出現增長的太快,會錯過增長的點。 既然兩種方式各有所長,我們就結合兩種方式,首先我們進行指數增長,我們設定一定的閥值,然後到達閥值之後,然後進行逐次遞增,直到出現網路擁塞為止。 指數增長階段稱為慢啟動 逐次增長稱之為擁塞避免 4.什麼是擁塞視窗?
我們把一次效能夠傳送的資料包多少的視窗稱之為擁塞視窗。 我們通過控制傳送視窗的大小,也就是傳送資料包的多少來進行擁塞控制。 5.阻塞超時 當資料包增長到一定程度就會出現超時事件(阻塞),出現超時事件就認為網路擁塞了,不能再繼續增長了,此時標記為一個最大值 M。 如果超時了之後,我們開始進行擁塞控制,怎麼做呢?我們將增長的閥值進行降低,降低到 M 的一半大小,也就是 M/2。如下圖所示,最大值為 24,此時發生擁塞,所以將閥值降為 12。 有的小夥伴就說了,你那超時不一定發生阻塞了,上邊你也提到了,可能出現了資料包的丟失,那怎麼判斷這種情況呢? 6.判斷髮送超時的情況 我們上邊也說了,超時存在兩種情況,我們就採用連續傳送 ACK 的方式來進行判斷到底是網路阻塞了還是網路資料包丟失了。 如下圖所示,如果傳送一個數據包,接收端成功接收之後,就會返回一個響應資料包,然後傳送端再次傳送下一個資料包。 一旦傳送端在傳送資料包的時候中途丟失了,接收端會返回上一次接收的資料包的確認響應資料包,當傳送端連續接收到三個相同的響應資料包時,就說明該資料包丟失了,然後快速重傳該資料包。 然後會把我們的閥值設定為擁塞最大值 M 的一半,這時候的擁塞視窗的大小為 1,當擁塞視窗的大小等於閥值時,再進行線性增長。我們也把上邊這種情況稱之為快速恢復。 小結 今天主要分享了 TCP 的擁塞控制,為什麼會有擁塞控制?如何進行擁塞控制以及如何判斷網路中的情況。 通過擁塞控制,我們能夠更好地進行資料高效的傳輸,除此之外,我們後邊的文章還會更新 TCP 的流量控制,為了能夠使得網路中的流量得到充分的利用。 作者:小鹿 轉載:https://network.51cto.com/art/201911/606666.htm