1 TCP拥塞控制
别看放在最后,因为是压轴的知识点,很重要!
1.1 慢启动和拥塞避免
(1)慢启动
慢启动指先把拥塞窗口cwnd设置为一个最大报文段MSS的数值,发送方在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值,在每经过一个往返时间RTT,拥塞窗口wcnd就加倍。
慢启动的“慢”并不是指cwnd的增长速度慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是探测一下网络的拥塞情况)
(2)拥塞避免算法
让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。
(3)步骤
- 当cwnd < ssthresh时,使用上述的慢启动算法;
- 当cwnd > ssthresh时,停止使用慢启动算法而改用拥塞避免算法;
- 当cwnd = ssthresh时,即可使用慢启动算法,也可以使用拥塞避免算法;
1.2 快速重传和快速恢复
当发送方向接收方发送数据时,中间可能会有个别数据包丢失,但是这不是网络拥塞,如果使用上面的慢启动+拥塞避免算法的话,如果发送方在发送数据的过程中有数据丢失的情况,那么会将慢启动的阈值设置为当前拥塞窗口cwnd的值的一半,并将cwnd的值设为1,重新开始慢启动+拥塞避免算法的执行过程,如上图中的TCP Tahoe
版本对应的曲线。这种方式会造成网络的吞吐量降低,所以就有了后来的快重传+快恢复算法。
(1)快速重传
- 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了 预防网络发生拥塞。请注意:接下去不执行慢开始算法。
- 与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。
(2)快速恢复
快速重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有达到对方)而不要等到自己发送数据时才进行捎带确认。快重恢复算法规定,发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计数器时间到期。此时执行的是快恢复算法,而不执行慢启动算法,即发送方将慢启动门限值ssthresh和拥塞窗口cwnd值调整为当前窗口的一半。开始执行拥塞避免算法(即线性增长)。
也有的快恢复算法的实现是把开始时的拥塞窗口的cwnd值再增大一点,即cwnd=ssthresh+3
,解释:
- 既然发送方收到三个重复的确认包,那么就表示有3个数据报文段已经离开了网络
- 这个三个包不再占用网络资源,而是停留在接收方的缓存中
- 可见网络中的报文段不是堆积了,而是减少了,所以可以适当扩大cwnd的值
TCP拥塞控制的整个流程如下:
写在最后
欢迎大家关注鄙人的公众号【麦田里的守望者zhg】,让我们一起成长,谢谢。