TCP的拥塞控制

一---导读算法

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

 图解

相关文章
相关标签/搜索