計算機網絡——TCP擁塞控制


一、擁塞控制的一般原理

在某段時間,若對網絡中某資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變壞。這種現象稱為擁塞 (congestion)。
最壞結果:系統崩潰

擁塞產生的原因

網絡擁塞往往是由許多因素引起的。例如:
點緩存的容量太小;
鏈路的容量不足;
處理機處理的速率太慢;
擁塞本身會進一步加劇擁塞;
出現擁塞的原因:

增加資源能解決擁塞嗎?

不能。這是因為網絡擁塞是一個非常復雜的問題。簡單地采用上述做法,在許多情況下,不但不能解決擁塞問題,而且還可能使網絡的性能更壞。
網絡擁塞往往是由許多因素引起的。例如:
1.增大緩存,但未提高輸出鏈路的容量和處理機的速度,排隊等待時間將會大大增加,引起大量超時重傳,解決不了網絡擁塞;
2.提高處理機處理的速率會會將瓶頸轉移到其他地方;

擁塞控制與流量控制的區別

擁塞控制所起的作用

 

擁塞控制的前提:網絡能夠承受現有的網絡負荷。
實踐證明,擁塞控制是很難設計的,因為它是一個 動態問題
分組的丟失是網絡發生擁塞的 征兆而不是原因。
在許多情況下,甚至正是 擁塞控制本身成為引起網絡性能惡化、甚至發生死鎖的原因。

開環控制和閉環控制

 

 屬於閉環控制的有以下幾種措施:
(1) 監測網絡系統,以便檢測到擁塞在何時、何處發生。
(2) 將擁塞發生的信息傳送到可采取行動的地方。
(3) 調整網絡系統的運行以解決出現的問題。

監測網絡的擁塞

主要指標有:
由於缺少緩存空間而被丟棄的分組的百分數;
平均隊列長度;
超時重傳的分組數;
平均分組時延;
分組時延的標准差,等等。上述這些指標的上升都標志着擁塞的增長。

傳遞擁塞通知

發送通知擁塞發生的分組;
在分組中保留表示擁塞狀態的字段;
周期性地發出探測分組等。

采取行動的時機

過於頻繁,會使系統產生不穩定的振盪;
過於遲緩地采取行動又不具有任何實用價值。

解決擁塞的兩條思路

增加網絡可用資源;
減少用戶對資源的需求。

二、TCP 的擁塞控制方法

TCP 采用基於窗口的方法進行擁塞控制。該方法屬於閉環控制方法。
TCP發送方維持一個擁塞窗口 cwnd (Congestion Window)
發送端利用擁塞窗口根據網絡的擁塞情況調整發送的數據量。
發送窗口大小不僅取決於接收方窗口,還取決於網絡的擁塞狀況,所以真正的發送窗口值為:

控制擁塞窗口的原則

只要網絡沒有出現擁塞,擁塞窗口就可以再增大一些,以便把更多的分組發送出去,這樣就可以提高網絡的利用率。
但只要網絡出現擁塞或有可能出現擁塞,就必須把擁塞窗口減小一些,以減少注入到網絡中的分組數,以便緩解網絡出現的擁塞。

擁塞的判斷

 

四種擁塞控制算法( RFC 5681) :
慢開始 (slow-start)
擁塞避免 (congestion avoidance)
快重傳 (fast retransmit)
快恢復 (fast recovery)

慢開始

目的:用來確定網絡的負載能力或擁塞程度。
算法的思路:由小到大逐漸增大擁塞窗口數值。

主機開發發送數據報時,如果立即將大量的數據注入到網絡中,可能會出現網絡的擁塞。慢啟動算法就是在主機剛開始發送數據報的時候先探測一下網絡的狀況,如果網絡狀況良好,發送方每發送一次文段都能正確的接受確認報文段。那么就從小到大的增加擁塞窗口的大小,即增加發送窗口的大小。

例子:開始發送方先設置cwnd(擁塞窗口)=1,發送第一個報文段M1,接收方接收到M1后,發送方接收到接收方的確認后,把cwnd增加到2,接着發送方發送M2、M3,發送方接收到接收方發送的確認后cwnd增加到4,慢啟動算法每經過一個傳輸輪次(認為發送方都成功接收接收方的確認),擁塞窗口cwnd就加倍。

擁塞避免

為了防止cwnd增加過快而導致網絡擁塞,所以需要設置一個慢開始門限ssthresh狀態變量,它的用法:

  1. 當cwnd < ssthresh,使用慢啟動算法,
  2. 當cwnd > ssthresh,使用擁塞控制算法,停用慢啟動算法。
  3. 當cwnd = ssthresh,這兩個算法都可以。

擁塞避免的思路:是讓cwnd緩慢的增加而不是加倍的增長,每經歷過一次往返時間就使cwnd增加1,而不是加倍,這樣使cwnd緩慢的增長,比慢啟動要慢的多。

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

實例:
1.TCP連接進行初始化的時候,cwnd=1,ssthresh=16。
2.在慢啟動算法開始時,cwnd的初始值是1,每次發送方收到一個ACK擁塞窗口就增加1,當ssthresh =cwnd時,就啟動擁塞控制算法,擁塞窗口按照規律增長,
3.當cwnd=24時,網絡出現超時,發送方收不到確認ACK,此時設置ssthresh=12,(二分之一cwnd),設置cwnd=1,然后開始慢啟動算法,當cwnd=ssthresh=12,慢啟動算法變為擁塞控制算法,cwnd按照線性的速度進行增長。

AIMD(加法增大乘法減小)

  1. 乘法減小:無論在慢啟動階段還是在擁塞控制階段,只要網絡出現超時,就是將cwnd置為1,ssthresh置為cwnd的一半,然后開始執行慢啟動算法(cwnd<ssthresh)。
  2. 加法增大:當網絡頻發出現超時情況時,ssthresh就下降的很快,為了減少注入到網絡中的分組數,而加法增大是指執行擁塞避免算法后,是擁塞窗口緩慢的增大,以防止網絡過早出現擁塞。
    這兩個結合起來就是AIMD算法,是使用最廣泛的算法。擁塞避免算法不能夠完全的避免網絡擁塞,通過控制擁塞窗口的大小只能使網絡不易出現擁塞。

快重傳

快重傳算法要求首先接收方收到一個失序的報文段后就立刻發出重復確認,而不要等待自己發送數據時才進行捎帶確認。接收方成功的接受了發送方發送來的M1、M2並且分別給發送了ACK,現在接收方沒有收到M3,而接收到了M4,顯然接收方不能確認M4,因為M4是失序的報文段。如果根據可靠性傳輸原理接收方什么都不做,但是按照快速重傳算法,在收到M4、M5等報文段的時候,不斷重復的向發送方發送M2的ACK,如果接收方一連收到三個重復的ACK,那么發送方不必等待重傳計時器到期,由於發送方盡早重傳未被確認的報文段。

快恢復

  1. 當發送發連續接收到三個確認時,就執行乘法減小算法,把慢啟動開始門限(ssthresh)減半,但是接下來並不執行慢開始算法。
  2. 此時不執行慢啟動算法,而是把cwnd設置為ssthresh的一半, 然后執行擁塞避免算法,使擁塞窗口緩慢增大

三、例題

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM