一---導讀算法
想象一條雙向四車道的道路(帶寬),當其中只有10輛車經過同一路段的時候,行駛還比較通暢,若其中有100輛車經過同一路段的時候,那行駛會大大受限,速度可能只有10km/h。當其中有1000輛車同時進入這個路段通行,結果可想而知,直接堵死(這就是死鎖)。這個時候若是在開始有一個交警站在路口 ,控制進入的車輛數,道路就可暢通無阻。這就是TCP的擁塞控制。交警就至關於擁塞控制算法。緩存
二---TCP的四種擁塞控制算法
在討論算法以前,先假定如下條件
1)數據是單方向傳送的,而另外一方向只傳送確認(單向車道)
2)接收方老是有足夠大的緩存空間,於是發送方發送窗口的大小 由網絡的擁塞程度來決定。
3)以最大報文MSS的個數爲討論單位,而不是以字節爲單位。網絡
重要的概念:擁塞窗口(cwnd--crowd window的縮寫),若是網路沒有出現擁堵,擁塞窗口就大一點,若是出現擁堵(判斷依據是沒有按時收到應當到達的確認報文,也就是發生了超時重傳),擁塞窗口就小一點。
發送方將擁塞窗口當作發送窗口。即swnd = cwnd;性能
A:慢開始算法--擁塞窗口值按指數增加方式變大(1,2,4,8,16)
注:慢開始指的是一開始向網絡中發送的報文段少,而不是指擁塞窗口cwnd的增加速度慢spa
B:擁塞避免算法--擁塞窗口只按線性加一的方式增大(16,17,18,19)
注:擁塞避免並非徹底必定可以避免擁塞,只是說經過每次讓cwnd加一的方式使網絡不容易出現擁塞blog
以上兩個算法是88年提出來的(Tahoe版本)。效率
發送方維護一個慢開始門限(閾值)ssthresh狀態變量。(這裏也就是算法切換的依據)
當cwnd < ssthresh時,使用慢開始算法
當cwnd > ssthresh時,使用擁塞避免算法
當cwnd = ssthresh時,便可用慢開始算法也可用擁塞避免算法變量
圖解(最開始擁塞窗口的值爲1)im
90年出現了新的兩個增強版(Reno版本)算法(快重傳算法和快恢復算法),用於改進TCP的性能,與時俱進。
有時候,只是個別報文段丟失,而網絡並未發生擁塞,發送方超時重傳,而且傻乎乎覺得網絡擁塞了;而後把發送窗口減少爲1,並錯誤啓動慢開始算法,大大下降傳輸效率。解決上面出現這種問題就出現了快重傳算法。數據
C:快重傳算法--快重傳,也就是讓個別丟失的報文段儘快重傳,而不是等超時重傳器重傳,這個要求接收方不要等到本身發送數據時才順帶發送確認,而是收到後當即發送確認。即便收到了失序的報文段也要當即發出對已收到的報文段的重複確認。發送方一旦收到3個連續的重複確認(重要的事情說三遍),就將相應的報文段重傳。使用快重傳,吞吐量提升20%。
D:快恢復算法--發送方一旦收到3個重複確認,就知道如今只是丟失了個別的報文段,因而不執行慢開始算法,而是執行快恢復算法:快恢復算法就是發送方將ssthresh值和擁塞窗口cwnd的值調爲當前窗口的一半,開始執行擁塞避免算法。
也有的快恢復是把快恢復開始時的擁塞窗口cwnd的值增大一些,等於新的ssthresh + 3.(爲何加3?由於我收到了3個重複確認,也就是有3個報文段如今是達到接收方的接收緩存中了,因而我能夠加3)
圖解