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)
圖解