TCP拥塞控制个人理解

Posted Zy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP拥塞控制个人理解相关的知识,希望对你有一定的参考价值。

常规的几个概念如:慢启动(指数增加),拥塞避免(线性增加),慢启动阈值(sstresh)不说了,可以看下其他博客。

说一下其他几个名词,感觉书上分的不是很清楚,事先声明下哈,都是我个人的理解,如果不对还望评论指出。

 

快速重传:即收到3个冗余ACK马上重新发送该数据包,而不是等待该数据包超时再重传。

栗子:

发送端发送1,2,3,4,5,6,7。。。其中4丢包了,接收端收到1,2,3,双方都很满意。

然后接收端收到5,发现4没收到,传一个ACK4回去。

收到6,再发一个ACK4回去。

收到7,再发一个ACK4回去。

这时,发送端收到了连续3个ACK4,也就是三个冗余ACK,这时候马上重传4号数据包。

接收端收到了4号包,由于TCP的ACK是累计确认,那么发一个ACK8回去(因为5,6,7都缓存了),继续数据传输。


 

快速恢复:是较新的TCP版本使用的。内部包含两步:1.快速重传 ;2.回到拥塞避免状态。即快速恢复并不是什么具体操作,而是把两个操作捏到一起,起了这么一个名字而已。

 

注意一个区别:快速恢复只有在收到3次冗余ACK的时候才会调用。如果是定时器超时,那么不论什么版本的TCP,都会直接重新回到慢启动阶段。

注意定时器超时指示的丢包事件和3次ACK指示的丢包的区别。前者说明网络状况不好,我们必须迅速降低发送速率!而后者可能只是某个数据包丢失了(和网络状态无关)!这是整个拥塞控制讨论的基础。。

画个图:

 

 其中不论是否执行快速恢复过程,发现3次ACK后,慢启动阈值都会变成当前拥塞窗口长度的一半,即sstresh=cwnd/2;

区别的是,如果采用快速恢复过程:执行快速重传后,会把拥塞窗口设为sstresh+3,即之前的拥塞窗口长度除2再加3。

这个3是什么意思:

考虑那3个ACK包,由于它们被发送方收到了,说明这三个包从网络中消失了。从网络整体的带宽来看,少了3个包,那么我们就可以把这3个包的带宽也利用起来,不要浪费一点。(其实没什么卵用我感觉)

我个人的理解是:带快速恢复的TCP算法能够较高效率的利用网络的带宽,可以看到上面的图呈现锯齿形状。发送端发送速率(发送窗口长度)慢慢的增长,去探测剩余带宽,如果丢包了,并不像老版本的TCP算法一样一下回到解放前(重新开始慢启动),而是从一个我们认为一定不会使网络堵塞的速率继续开始慢慢增长

 

另外:我自己用wireshark抓包,都是2次冗余ACK就快速重传了。感觉很多书上所谓的标准在现实中都并不是严格执行的。。

以上是关于TCP拥塞控制个人理解的主要内容,如果未能解决你的问题,请参考以下文章

理解TCP/IP传输层拥塞控制算法

理解TCP/IP传输层拥塞控制算法

深入理解TCP协议及其源代码-拥塞控制算法分析

计算机网络 | 谈谈TCP的流量控制与拥塞控制

TCP/IP 系列之 TCP 流控与拥塞控制

tcp窗口滑动以及拥塞控制