慢开始阶段
发送方维持一个叫做拥塞窗口 cwnd (congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。如再考虑到接收方的接收能力,则发送窗口还可能小于拥塞窗口。
发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的数据发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的数据包。
慢开始算法的原理:
在主机刚刚开始发送报文段时可先设置拥塞窗口 cwnd = 1,即设置为一个最大报文段 MSS 的数值。
在每收到一个对新的报文段的确认后,将拥塞窗口加 1,即增加一个 MSS 的数值。 (最初始时窗口大小是1,然后发送一个报文,然后得到确认,于是窗口变成2,然后就可以一次发送2 个报文,然后这2个报文都得到确认,于是窗口+2等于4,然后就可以一次发送4个报文,然后这4个报文都得到接收方的确认,于是窗口+4等于8,依次类推)
用这样的方法逐步增大(
其实是以2的指数级增大
)发送端的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理
综上就是慢开始算法的原理
拥塞避免算法
当拥塞窗口cwnd超过了慢开始门限,则每次收到确认后,只让拥塞窗口+1
设置慢开始门限状态变量:
慢开始门限 ssthresh 的用法如下:
当 cwnd < ssthresh 时,使用慢开始算法。
当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个轮次就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
当网络出现拥塞时:
无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh设置为出现拥塞时的发送方窗口值cwnd 的一半(但不能小于2)。
然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。