1.请简述一下拥塞窗口
定义
拥塞窗口是TCP在发送端维护的一个可滑动窗口,用于限制可能在端对端间传输的未确认分组总数量。它的大小取决于网络的拥塞程度,并且动态地在变化。
工作原理
- 初始化:在TCP连接建立之初,拥塞窗口的大小通常被设置为一个较小的值,例如一个最大报文段(MSS)的长度。
- 增长机制
- 慢启动(Slow Start):在连接建立后,每收到一个来自接收端的确认(ACK),拥塞窗口的大小就会增加一个MSS值。这样,拥塞窗口的大小会按指数规则增长,直到达到一个预设的阈值(ssthresh)。这个阈值通常是固定的,或者基于过去的网络性能进行动态调整。
- 拥塞避免(Congestion Avoidance):当拥塞窗口的大小达到ssthresh后,拥塞窗口的增长速度会放缓,进入拥塞避免阶段。在这个阶段,拥塞窗口的大小会在每次往返时间(RTT)内线性增加一个MSS值,而不是像慢启动阶段那样指数增长。
-
快重传和快恢复
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协议中用于防止网络拥塞的关键机制之一。它通过动态调整发送方发送数据的速率来避免过多的数据注入网络而导致拥塞。拥塞窗口的大小由慢启动和拥塞避免算法共同控制,根据网络的实际拥塞情况进行动态调整。
2.拥塞窗口和滑动窗口的区别
- 定义与目的:
- 滑动窗口:滑动窗口是一种流量控制技术,用于控制发送方和接收方之间的数据传输速率。它通过动态调整发送和接收窗口的大小,实现了发送和接收端之间的流量控制。其主要目的是确保接收方能够及时处理接收到的数据,避免数据丢失或拥塞。
- 拥塞窗口:拥塞窗口是用于控制发送方在网络中发送的数据量的一种机制,以避免网络拥塞。它通过动态调整发送数据的速率来适应网络中的拥塞情况。其主要目的是在网络拥塞时减少数据注入量,从而缓解拥塞状况。
- 调整方式:
- 滑动窗口:滑动窗口的大小是根据接收方的处理能力和网络状况进行动态调整的。接收方通过发送确认信息(ACK)来通知发送方其窗口大小,发送方则根据接收到的窗口大小来确定发送数据的量。
- 拥塞窗口:拥塞窗口的大小是根据网络中的拥塞情况进行动态调整的。当网络中出现拥塞时,拥塞窗口的大小会减小,从而降低发送数据的速率;反之,当网络中的拥塞减少时,拥塞窗口的大小会逐渐增大,发送数据的速率也会相应增加。
- 调整算法:
- 滑动窗口:滑动窗口的调整主要依赖于接收方的确认信息(ACK)。发送方在收到ACK后,会根据ACK中携带的窗口大小信息来更新其发送窗口的大小。
- 拥塞窗口:拥塞窗口的调整依赖于拥塞控制算法,如慢开始算法、拥塞避免算法、快重传算法和快恢复算法等。这些算法通过检测网络中的拥塞情况来动态调整拥塞窗口的大小。
- 作用范围:
- 滑动窗口:滑动窗口主要作用于发送方和接收方之间,通过控制发送方发送数据的速率来保证接收方能够及时处理接收到的数据。
- 拥塞窗口:拥塞窗口主要作用于整个网络层面,通过控制发送方在网络中发送的数据量来避免网络拥塞。
- 数值关系:
- 在某些情况下,发送方会让自己的发送窗口等于拥塞窗口。但是,如果再考虑到接收方的接收能力,发送窗口可能会小于拥塞窗口。
- 总结:
- 滑动窗口和拥塞窗口在TCP协议中各自承担不同的角色。滑动窗口主要用于实现发送方和接收方之间的流量控制,而拥塞窗口则用于实现网络层面的拥塞控制。通过协同工作,它们共同确保了TCP连接的高效、稳定和可靠。