标签:解决问题 版本 when smi mon idt oss 丢包 else
我一再强调,BBR算法是个分界点,所有的TCP拥塞控制算法,被分为BBR之前和BBR之后的(其实发现,这并不是我个人的观点,很多人都这么认为,所有想写本文探个究竟)。当然这里的”所有“并不包括封闭的那些算法,比如垃圾公司Appex的算法,或者伟大的垃圾微软的算法。任何的算法都内含了一个进化的过程,CUBIC和Reno看起来非常不同,但是却属于同一个思想,因此可以说,CUBIC是Reno的高级版本(将一种锯齿换成另一种锯齿而已),事实上,TCP拥塞控制算法一直处在不断的改进之中,起初,Reno算法,然后就是NewReno,再往后就是各种混战,直到最终落实到了CUBIC,起码在Linux平台是这么一个过程,其它的平台,也是大同小异。我们看一张图,一张到目前为止,BBR算法之前的TCP拥塞控制算法的图解,假设你对TCP拥塞算法有所了解那么这个图就是直观的:
当然,这里并不包括快速重传/快速恢复算法。为什么?难道快速恢复不重要吗?不是不重要,而是,快速恢复属于上述经典图解的一个优化!我不是说过吗,算法是一个进化的过程,不管最终变得多么复杂,其根本是不会变的。在BBR之前,其根本就是上图所示。
按照VJ的想法,TCP拥塞控制的根本就是实现上图中红色框框所框住的那些阶段的处理逻辑。我们先看看BBR之前是怎么处理的,这虽然并不重要,但看看毕竟不多:cwnd = 1; while(1) { send packets of min (cwnd, rwnd); // burst wait until receiving all ACKs for the previous sent packets slow-start if ( timeout occurs ) break; else cwnd = 2*cwnd; } threshold = cwnd/2; cwnd = 1; while(1){ if ( cwnd < threshold ){ send packets of min (cwnd, rwnd); //burst wait until receiving all ACKs for the previous sent packets slow-start if ( timeout occurs ){ threshold = cwnd/2; cwnd = 1;} else cwnd = 2*cwnd;} if ( cwnd == threshold || cwnd > threshold ) send packets of min (threshold, rwnd); //burst } else if ( cwnd > threshold ){ send a new packet whenever an ACK is received //self-clocking if ( Sender receives all ACKs for the previous sent packets ) {cwnd = cwnd + 1; send a new packet;} //to probe more bandwidth if ( timeout occurs) {threshold = cwnd/2; cwnd = 1;} //to avoid congestion } }然而,还是VJ的话:
当你看到Reno/CUBIC和bbr的区别的时候,可能会想起中断和轮询的区别,bbr和轮询之间的不同点是,bbr有事实的反馈。
标签:解决问题 版本 when smi mon idt oss 丢包 else
原文地址:http://blog.csdn.net/dog250/article/details/52962727