拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
当吞吐量随输入负载增大而减小时,网络进入拥塞。为0时,死锁。
TCP控制拥塞,需要解决这三个问题:
1、TCP发送方如何限制发送速度?(拥塞窗口(cwnd)),发送窗口上限值=Min[rwnd,cwnd]。rwnd是TCP流量控制利用接收方通告给发送方的接受窗口。
2、TCP发送方如何感知发送路径上发生拥塞?
当重传计时器超时或者接受到三个重复确认(默认因传输出错而丢弃分组概率很小,检测到分组丢失即是拥塞)
3、感知到拥塞后,怎么改变发送速度?
四种算法:慢开始、拥塞避免、快速重传和快速回复。
A、慢开始和拥塞避免
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。一次传输轮次之后拥塞窗口就加倍。这就是乘法增长,和后面的拥塞避免算法的加法增长比较。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1 ,而不是加倍。这样拥塞窗口按线性规律缓慢增长。无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。如下图:
B、快速恢复
考虑这么个问题:上述方法是将重传计时器与接受到三个重复确认两种分组丢失的情况采取了同样反应,这样对吗?可以,但是不聪明。因为接受到三个重复确认表明丢失一个分组的同时,另外三个分组已经接收了。可以说拥塞状况还不是很严重。直接将拥塞窗口降为1进行慢开始,有点反应过激。
因此有了快速恢复。
怎么做呢?
(1)当发送方连续收到三个重复确认时,重设开始门限ssthresh为当前发送窗口的一般;
(2)cwnd设置为新的ssthresh,开始拥塞避免算法。