TCP的擁塞控制


一---導讀

想象一條雙向四車道的道路(帶寬),當其中只有10輛車通過同一路段的時候,行駛還比較通暢,若其中有100輛車通過同一路段的時候,那行駛會大大受限,速度可能只有10km/h。當其中有1000輛車同時進入這個路段通行,結果可想而知,直接堵死(這就是死鎖)。這個時候如果在開始有一個交警站在路口 ,控制進入的車輛數,道路就可暢通無阻。這就是TCP的擁塞控制。交警就相當於擁塞控制算法。

 

二---TCP的四種擁塞控制算法
在討論算法之前,先假定以下條件
1)數據是單方向傳送的,而另一方向只傳送確認(單向車道)
2)接收方總是有足夠大的緩存空間,因而發送方發送窗口的大小 由網絡的擁塞程度來決定。
3)以最大報文MSS的個數為討論單位,而不是以字節為單位。

重要的概念:擁塞窗口(cwnd--crowd window的縮寫),如果網路沒有出現擁堵,擁塞窗口就大一點,如果出現擁堵(判斷依據是沒有按時收到應當到達的確認報文,也就是發生了超時重傳),擁塞窗口就小一點。
發送方將擁塞窗口當做發送窗口。即swnd = cwnd;

A:慢開始算法--擁塞窗口值按指數增長方式變大(1,2,4,8,16)
 注:慢開始指的是一開始向網絡中發送的報文段少,而不是指擁塞窗口cwnd的增長速度慢

B:擁塞避免算法--擁塞窗口只按線性加一的方式增大(16,17,18,19)
注:擁塞避免並不是完全一定能夠避免擁塞,只是說通過每次讓cwnd加一的方式使網絡不容易出現擁塞

以上兩個算法是88年提出來的(Tahoe版本)。


發送方維護一個慢開始門限(閾值)ssthresh狀態變量。(這里也就是算法切換的依據)
當cwnd < ssthresh時,使用慢開始算法
當cwnd > ssthresh時,使用擁塞避免算法
當cwnd = ssthresh時,即可用慢開始算法也可用擁塞避免算法

圖解(最開始擁塞窗口的值為1)



90年出現了新的兩個加強版(Reno版本)算法(快重傳算法和快恢復算法),用於改進TCP的性能,與時俱進。

有時候,只是個別報文段丟失,而網絡並未發生擁塞,發送方超時重傳,並且傻乎乎以為網絡擁塞了;然后把發送窗口減小為1,並錯誤啟動慢開始算法,大大降低傳輸效率。解決上面出現這種問題就出現了快重傳算法。

C:快重傳算法--快重傳,也就是讓個別丟失的報文段盡快重傳,而不是等超時重傳器重傳,這個要求接收方不要等到自己發送數據時才順帶發送確認,而是收到后立即發送確認。即使收到了失序的報文段也要立即發出對已收到的報文段的重復確認。發送方一旦收到3個連續的重復確認(重要的事情說三遍),就將相應的報文段重傳。使用快重傳,吞吐量提高20%。

D:快恢復算法--發送方一旦收到3個重復確認,就知道現在只是丟失了個別的報文段,於是不執行慢開始算法,而是執行快恢復算法:快恢復算法就是發送方將ssthresh值和擁塞窗口cwnd的值調為當前窗口的一半,開始執行擁塞避免算法。
也有的快恢復是把快恢復開始時的擁塞窗口cwnd的值增大一些,等於新的ssthresh + 3.(為什么加3?因為我收到了3個重復確認,也就是有3個報文段現在是達到接收方的接收緩存中了,於是我可以加3)

 圖解

 看一個考研題:

 


免責聲明!

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



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