我们知道,对于发送方而言,窗口的大小取决于接收方的窗口大小,但是,我们却忽略了网络这个实体,因为我们必须要保证网络能够像发送方产生数据那样快地把数据交付给接收方。所以,对于发送方而言,不仅要考虑接收方的窗口,还要考虑网络中的情况,即发送方窗口=min(拥塞窗口,接收方窗口)
拥塞策略一般基于三个阶段:慢开始+拥塞避免+拥塞检测
慢开始:指数增大
即拥塞窗口从1个最大报文段长度开始,每当有1个报文段被确认,拥塞窗口就增大1个MSS。慢开始不能无限增加下去,因此需要设定一个门限,称之为ssthresh(慢开始门限)
拥塞避免:加法增大
当拥塞窗口增加到门限值,为了在拥塞发生之前避免它,以加法的形式增加拥塞窗口的大小,每当一整个“窗口”(1个RTT)中的报文段都被确认后,拥塞窗口大小才增加1。
拥塞检测:乘法减小
若拥塞发生了,拥塞窗口必须减小。让发送方能够猜测到拥塞已经发生的唯一现象就是它需要重传一个报文段,也就是说,出现该现在就表示路由器或者方法可能已变得超载或者拥塞了。
重传可以发生在以下2种情况:
一.RTO计时器超时,那么出现拥塞的可能性就很大。需要进行如下操作:
1.把门限值设置为当前窗口大小的一半
2.把拥塞窗口大小重新设置为1个报文段
3.再次从慢开始阶段开始
二.收到3个重复的ACK,那么出现拥塞的可能性比较小,因此需要进行“快重传”和“快恢复”
1.把门限值设置为当前窗口大小的一半
2.拥塞窗口设置为门限值(某些实现会在门限值上加上3个报文段)
3.启动拥塞避免阶段
image.png