标签:
夜深人静...TCP会进入一个叫做“快速恢复”的状态,恢复什么呢?恢复到正常状态!在快速恢复中,主要要做的任务就是重传“被认为”是丢失的数据包。“被认为”之所以要加上引号是因为一切都是猜测!在这个过程中,TCP会认为网络发生了拥塞,既然发生了拥塞,再发多少数据包也没有用。TCP被设计为一个君子协议,那就是自己发现丢包的时候,自己会主动降低窗口,大家都这么做,以期望网络迅速恢复正常,这也就是为什么像华夏创新的那种算法永远都进不了标准,永远都写不成paper的原因吧。
就目前看来,主要有4中方式降低窗口:
1.BSD原始方式:这也是《TCP/IP详解》(不是第二版啊)中描述的方式,像心电图一样,在降窗之前会有一个毛刺。目前早就已经弃用,想看究竟的话请看steven的书。因此,在rate halving算法中,in_flight值可能会陡降,带来的效果就是CWND陡降,然而却没有补偿,比如下面这个稍微变态些的例子:
如果发生了大量的数据包被标记为LOST,情形如上,事实上降窗过程对此事毫不知情,FACK模式下一个携带SACK的包就可能标记很多包为LOST!除此之外,rate halving降窗算法中,以ACK数量而不是ACKed的字节数来作为标尺,这看似是一件好事,但是由于ACKed的字节数会直接体现在in_flight变量中,结果就是,如果一个ACK确认大量的字节,in_flight会变小,最终取min的时候,还是会造成窗口陡降!不过这也倒是迎合了RFC2582的建议:
Deflate the congestion window by the amount of new data acknowledged, then add back one MSS and send a new和介绍Linux rate halving一样,同样给出一个实例来演示算法执行过程,类似的,第一个例子是标准理想环境下的,第二个是变态些的:
下面我给出一个和Linux rate halving的第二个例子初始状态一致的PRR的例子,我们来看看PRR是怎么补偿窗口的陡降的:
最后我们来一个综合的带有SACK的例子:
算法执行下去的话,没有任何问题,窗口即使不会陡降到ssthresh之下,下一步也会执行类似慢启动的过程提升上来的。这里所谓“类似慢启动”的过程指的就是,按照被ACK的数据的大小来增加窗口,比如ACK了n个,那么窗口就增加n个MSS大小。
标签:
原文地址:http://blog.csdn.net/dog250/article/details/51404615