概述
在某段时间,如果对网络中的某一资源的需求超过了该资源所能提供的可用部分,网络性能就要发生变化,这种情况叫阻塞
防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载(通过拥塞窗口处理网络拥塞现象的一种机制)
拥塞控制是一个全局性的过程,涉及到所有的主机,路由器,以及与降低拥塞中的网络传输的性能有关的所有因素
与流量控制的区别
- 流量控制往往是指点对点通信量的控制,是个端对端的问题
- 流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接收
拥塞控制的代价
- 需要获得网络内部流量分布的信息。在实施拥塞控制之前,还需要在结点之间交换信息和各种命令,以便选择控制的策略和实施控制
- 这样就产生了额外的开销。拥塞控制还需要将一些资源分配给各个用户单独使用,使得网络资源能更好的实现共享
拥塞控制的几种方法
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
拥塞控制方法的详解
慢开始
算法原理
当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么就有可能因为不清楚当前网络的负荷情况而引起网络阻塞
所以,最好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值
通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值
而在每收到一个新的报文的确认后,把拥塞窗口增加至多一个MSS的数值
用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理(慢开始当中的“慢”并不是值cwnd的增长速率慢,而是在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段)
当接收窗口(rwnd) 足够大的时候,为了防止拥塞窗口(cwnd)的增长引起网络阻塞,还需要另一个变量 — 慢开始门限(ssthresh)
- 当 cwnd < ssthresh ,使用上述慢启动算法
- 当 cwnd > ssthresh, 停止使用慢启动算法,改用拥塞避免算法
慢开始的局限性
需要获得网络内部流量分布的情况,浪费可用的网络容量,额外开销
估算合理的ssthresh值并不容易,可能耗时较长
- 接收端窗口(rwnd), 又称通知窗口(awnd), 是接收端根据目前的接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制
- 拥塞窗口(cwnd) 是发送端根据自己估计的网络阻塞程度而设置的窗口值,是来自发送端的流量控制
- MSS是TCP数据包每次能够传输的最大数据分段,其中不包括TCP首部,而MSS只出现在syn报文段当中。一般来说MSS的值在不分段的情况下越大越好(eg: 一个外出接口的MSS值时MTU减去IP和TCP首部长度)
拥塞避免
算法思路
让拥塞窗口cwnd 缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍
这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞窗口增长速率缓慢的多
无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为发送窗口的一半(>=2)
cwnd设置为1,然后再使用慢启动算法,这样做的目的能迅速的减少网络当中的数据传输,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长
控制过程
TCP连接初始化,将拥塞窗口cwnd设置为1个报文段,即cwnd = 1
执行慢开始算法,cwnd按指数规律增长,知道cwnd == ssthres时,开始执行拥塞算法,cwnd开始按照线性规律增长
当网络发送拥塞,把ssthresh值更新为拥塞钱ssthresh值的一半,cwnd重新设置为1,再按照2执行
- 在TCP连接进行初始化的时候,cwnd = 1, ssthresh = 16
- 在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh == cwnd 时,启动拥塞控制算法,拥塞窗口按线性规律增长
- 当cwnd = 24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh = 12, 设置cwnd = 1,然后开始慢启动算法,当cwnd = ssthresh = 12, 慢启动算法编变成拥塞控制算法,cwnd按照线性速度增长
AIMD (加法增大乘法减小)
乘法减小
无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd 设置为1,sthresh置为cwnd的一半
然后开始执行慢启动算法
加法增大
当网络频发出现超时的情况,ssthresh就下降得很快,为了减少注入到网络当中的分组数
而加法增大是执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞
总结
这两个结合起来就是AIMD算法,是使用最广泛的算法。拥塞避免算法不能够完全避免网络拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞
快重传
一条TCP连接有时会因为等待重传计时的超时而空闲较长时间,慢开始和拥塞避免无法解决这类问题,因此提出了快重传和快恢复的拥塞控制
算法过程
快重传算法要求首先接收方收到一个失序的报文段立刻发出重复确认,而不要等到自己发送数据时才进行捎带确认
在上图中,接收方成功的接受了发送方发来的M1,M2并且分别发送了ACK,现在接收方没有接收到M3,而收到了M4,显然接收方不能确认M4,因为M4是失序的报文
如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法
在收到M4,M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段
快恢复
当发送方连续收到三个重复确认时,执行“乘法减小”算法,慢启动门限减半,为了预防网络发生阻塞
由于发送方现在认为网络很可能没有发生阻塞,因此现在不执行慢启动算法,而是把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大