一---导读
想象一条双向四车道的道路(带宽),当其中只有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)
图解