【計算機網絡】TCP的擁塞控制

原文鏈接:https://blog.csdn.net/m0_37962600/article/details/79993310
僅做個人學習自用,不做商用

擁塞基本知識

1 概念

在某段時間內,如果對網絡中的某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就會變化,這種情況叫擁塞

2 擁塞控制

防止過多的數據注入到網絡當中,這樣可以使網絡中的路由器或鏈路不致過載(通過擁塞窗口處理網絡擁塞現象的一種機制)

  • a. 前提 :網絡能夠承受現有的網絡負荷
  • b.擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網絡傳輸性能有關的所有因素。
  • c. 與流量控制的區別:流量控制往往是指點對點通信量的控制,是個端到端的問題。流量控制所要做的就是控制發送端發送數據的速率,以便使接收端來得及接收。
  • d. 代價:需要獲得網絡內部流量分佈的信息。在實施擁塞控制之前,還需要在結點之間交換信息和各種命令,以便選擇控制的策略和實施控制。這樣就產生了額外的開銷。擁塞控制還需要將一些資源分配給各個用戶單獨使用,使得網絡資源能更好的實現共享。

3 擁塞控制的幾種方法

慢開始 擁塞避免 快重傳 快恢復

擁塞控制方法詳解

1 慢啓動

  • a.算法原理:

當主機開始發送數據時,如果立即將大量數據字節注入到網絡,那麼就有可能因爲不清楚當前網絡的負荷情況而引起網絡阻塞。所以最好的方法是先探測一下,即由小到大逐漸增大發送窗口,也就是說,由小到大逐漸增大擁塞窗口數值。
通常在剛剛發送報文段時,先把擁塞窗口cwnd設置爲一個最大報文段MSS的數值。而在每收到一個新的報文段的確認後,把擁塞窗口增加至多一個MSS的數值。用這樣的方法逐步增大發送方的擁塞窗口cwnd,可以使分組注入到網絡的速率更加合理。(慢開始當中的“慢”並不是指cwnd的增長速率慢,而是在TCP開始發送報文段時先設置cwnd = 1,使得發送方在開始時只發送一一個報文段)
當rwnd足夠大的時候,爲了防止擁塞窗口cwnd的增長引起網絡阻塞,還需要另外一個變量------慢開始門限ssthresh.

i.當cwnd < ssthresh時,使用上述慢啓動算法;

ii.當cwnd >ssthresh時,停止使用慢啓動算法,改用擁塞避免算法;

b.慢開始的侷限性

i.需要獲得網絡內部流量分佈的信息,浪費可用的網絡容量,額外開銷;

ii.估算合理的ssthresh值並不容易,可能耗時較長

2 擁塞避免

a. 算法思路
讓擁塞窗口cwnd緩慢的增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍,這樣擁塞窗口cwnd按線性規律緩慢的增長,比慢開始算法的擁塞窗口的增長速率緩慢的多。

無論是慢啓動算法還是擁塞避免算法,只要判斷網絡出現阻塞,就要把慢啓動開始門限(ssthresh)設置爲發送窗口的一半(>= 2),cwnd設置爲1,然後再使用慢啓動算法,這樣做的目的能迅速的減少網絡當中的數據傳輸,使發生擁塞的路由器能夠把隊列中堆積的分組處理完畢。擁塞窗口使按照線性的規律增長。

b. 控制過程

TCP連接初始化,將擁塞窗口cwnd設置爲1個報文段,即cwnd = 1
執行慢開始算法,cwnd按指數規律增長,直到cwnd == ssthresh時,開始執行擁塞避免算法,cwnd開始按照線性規律增長
當網絡發生擁塞,把ssthresh更新爲擁塞前ssthresh值的一半,cwnd重新設置爲1,再按照2執行

例如:
a. 在TCP 連接進行初始化的時候,cwnd = 1, ssthresh = 16
b. 在慢啓動算法開始時,cwnd初始值是1,每次發送方收到一個ACK阻塞窗口就增加1,當cwnd == ssthresh時,啓動擁塞控制算法,擁塞窗口按照線性規律增長
c. 當cwnd = 24時,網絡出現超時,發送方收不到確認ACK,此時設置ssthresh = 12,設置cwnd = 1,然後開始慢啓動算法,當cwnd == ssthresh = 12,慢啓動算法變爲擁塞控制算法,cwnd按照線性速度增長

在這裏插入圖片描述

AIMD(加法增大乘法減小)
a.乘法減小:無論在慢啓動階段還是在擁塞控制階段,只要網絡出現超時,就是將cwnd置爲1,ssthresh置爲cwnd的一半,然後開始執行慢啓動算法
b. 加法增大:當網絡頻發出現超時情況時,ssthresh就下降的很快,爲了減少注入到網絡當中的分組數,而加法增大是執行擁塞避免算法後,使擁塞窗口緩慢的增大,以防止網絡過早出現擁塞

這兩個結合起來就是AIMD算法,是使用最廣泛的算法。 擁塞避免算法不能夠完全的避免網絡擁塞,通過控制擁塞窗口的大小隻能使網絡不易出現擁塞

3 快重傳

一條TCP連接有時會因爲等待重傳計時的超時而空閒較長時間,慢開始和擁塞避免無法解決這類問題,因此提出了快重傳和快恢復的擁塞控制方法。

  • a. 算法過程
    快重傳算法要求在接收方收到一個失序的報文段後立即發出重複確認,而不要等待自己發送數據時才進行捎帶確認
    在這裏插入圖片描述
    在上圖中,接收方成功的接受了發送方發來的M1,M2並且分別發送了ACK,現在接收方沒有收到M3,而收到了M4,顯然接收方不能確認M4,因爲M4是失序的報文段。
    如果根據可靠性傳輸原理接收方什麼都不做,但是按照快速重傳算法,在收到M4, M5等報文段的時候,不斷重複的向發送方發送M2的ACK,如果接收方一連收到三個重複的ACK,就應當立即重傳對方尚未收到的報文段,而不必等待重傳計時器到期。

4 快恢復

a. 當發送方連續收到三個重複確認時,執行“乘法減小” 算法,慢啓動門限減(爲了預防網絡發生阻塞)

b. 由於發送方現在認爲網絡很可能沒有發生阻塞,因此現在不執行慢啓動算法,而是把cwnd值設置爲慢啓動門限減半後的值,然後開始執行擁塞避免算法,擁塞窗口cwnd值線性增大

在這裏插入圖片描述

原文鏈接:https://blog.csdn.net/m0_37962600/article/details/79993310

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章