TCP拥塞控制策略
拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。
拥塞控制跟流量控制的区别
- 拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。
- 流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(cwnd, congestion window)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接收窗口中较小的一个。
发送方窗口的上线值 = Min(rwnd, cwnd)
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值;
当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值
TCP的拥塞控制采用四种算法:即慢开始(slow start)、拥塞避免(Congestion Avoidance)、快重传(fast retransmit)和快恢复(fast recovery)
为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd < ssthresh时,使用慢开始算法;
当cwnd > ssthresh时,改用拥塞避免算法;
当cwnd = ssthresh时,慢开始与拥塞避免算法任意;
- 慢开始:慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络拥塞,因为现在还不知道网络的实际情况。经验表明,较好的方法是先试探一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,cwnd加倍。
- 拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1.
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。
乘法减小和加法减小增大
乘法减小:是指不论在慢开始阶段还是拥塞避免阶段,只要出现超时,就把慢开始门限减半,即设置为当前拥塞窗口的一半(与此同时,执行慢开始算法)。当网络出现频繁拥塞时,ssthresh值就下降得很快,以大大减小注入到网络中的分组数;
加法增大:是指执行拥塞避免算法后使拥塞窗口缓慢增大,以防止网络过早出现拥塞。 - 快重传:
在TCP/IP中,快速重传和恢复(fast retransmit and recovery, FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包。
快速重传(Fast retransmit)要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。
快重传算法规定,发送方只要连续收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计数器时间到期; - 快恢复(Fast Recovery)
- 当发送方连续发送三个重复确认,就执行“乘法减小“算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法;
- 由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地先行增大。