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就快速重传了。感觉很多书上所谓的标准在现实中都并不是严格执行的。。