拥塞窗口是TCP在发送端维护的一个可滑动窗口,用于限制可能在端对端间传输的未确认分组总数量。它的大小取决于网络的拥塞程度,并且动态地在变化。
快重传和快恢复
1) 如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。
2)当收到对一个报文的三个重复的 ACK 时,认为这个报文的下一个报文丢失了,进入快重传阶段,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提高网络吞吐量约20%)而不要等到自己发送数据时捎带确认;
与快重传配合使用的还有快恢复算法,其过程有以下两个要点:
<1>. 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。
<2>. 由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
也有的快重传实现是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3 X MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络 的资源而是停留在接收方的缓存中。可见现在网络中并不是堆积了分组而是减少了三个分组。因此可以适当把拥塞窗口扩大了些。
在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。
采用这样的拥塞控制方法使得TCP的性能有明显的改进。
接收方根据自己的接收能力设定了接收窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。因此,接收窗口又称为通知窗口。因此,从接收方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收窗口rwnd 。
发送方窗口的上限值 = Min [ rwnd, cwnd ]
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。
当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。
拥塞窗口的作用是限制发送方发送数据的速率,以防止过多的数据注入网络而导致拥塞。通过动态调整拥塞窗口的大小,TCP可以在保证数据传输效率的同时,避免网络拥塞的发生。
假设初始的拥塞窗口大小为1个MSS,ssthresh为65536字节。在慢启动阶段,每收到一个ACK,拥塞窗口大小就变为原来的两倍。当拥塞窗口大小达到16个MSS(等于ssthresh的初始值)时,TCP进入拥塞避免阶段。在这个阶段,拥塞窗口每次在RTT内只增加1个MSS。如果发生拥塞,拥塞窗口被设置为1个MSS,ssthresh被调整为当前拥塞窗口大小的一半(即8个MSS),并重新进入慢启动阶段。
拥塞窗口是TCP协议中用于防止网络拥塞的关键机制之一。它通过动态调整发送方发送数据的速率来避免过多的数据注入网络而导致拥塞。拥塞窗口的大小由慢启动和拥塞避免算法共同控制,根据网络的实际拥塞情况进行动态调整。