海阔天空

导航

网络拥塞控制(七)BIC-TCP

上面我们已经提到了HSTCP,它通过简单的修改标准TCP的增长方式,从而达到了高吞吐。方法很简单,但是缺点在于,它存在严重的RTT不公平性,RTT不公平性在标准TCP中也是存在的,但是HSTCP显然扩大了这个不公平性。RTT的不公平性指的是当有多条连接在同一个瓶颈带宽上跑时,如果这些连接的RTT不相等,那么这些TCP连接在该链路上分得的带宽也是不一样的。作为一个公平性的协议,是应该达到这一点的。从HSTCP可以很明显的看出,如果当前连接的cwnd比较大的话,那么它的增长速度也是越快。具体的理论计算下次继续,我们先看BIC-TCP的思想。

BIC-TCP由North Carolina State University的网络研究实验室提出,该算法在提出不久后就成为了当时Linux内核中的TCP默认拥塞算法,使用非常广泛,由此可见,该算法是有一定功底的,从长久的使用来看,确实不错,当然问题也有一些。

BIC-TCP的提出者们发现了TCP拥塞窗口调整的一个本质:那就是找到最适合当前网络的一个发送窗口,为了找到这个窗口值,TCP采取的方式是(拥塞避免阶段)每RTT加1,缓慢上升,丢包时下降一半,接着再来慢慢上升。BIC-TCP的提出者们看穿了事情的本质,其实这就是一个搜索的过程,而TCP的搜索方式类似于逐个遍历搜索方法,可以认为这个值是在1和一个比较大的数(large_window)之间,既然在这个区间内需要搜索一个最佳值,那么显然最好的方式就是二分搜索思想。

BIC-TCP就是基于这样一个二分思想的:当出现丢包的时候,说明最佳窗口值应该比这个值小,那么BIC就把此时的cwnd设置为max_win,把乘法减小后的值设置为min_win,然后BIC就开始在这两者之间执行二分思想--每次跳到max_win和min_win的中点。

总的思想就是这么简单,当然实现起来还有一定的细节需要考虑。如果max_win比较大的时候,那么把窗口调整到其乘法降低后的min_win和max_win的中点,其增长量可能比大,也就是说在一个RTT里面增长过多,这会造成传输上的抖动,因而BIC-TCP选取了另外取了两个参考值,称为Smax和Smin,如果中点和当前cwnd值的差大于Smax的话,那么cwnd就只增长Smax,如果没有发生丢包,那么就重新设置min_win为当前的cwnd值,如果丢包,那么设置max_win为当前的cwnd值。该过程一直如此下去,直到窗口增长值小于Smin,也就是说在这个时候max_win和min_win非常接近了,达到这种情况下,可以说明现在的网络环境变好,那么把cwnd设置为max_win。

如果窗口值超过了max_win,那么可以说明稳定状态下的窗口值应该比当前的窗口值要大,此时就需要搜索出新的max_win值,BIC-TCP进入一个称为“max probing”的阶段。在这个阶段,首先把max_win设置为一个非常大的值,然后BIC采取了一个类似慢启动策略,每个RTT后窗口值变为cwnd+1,cwnd+2,cwnd+4......cwnd+Smax,直到增长为Smax的时候再次进入二分阶段。

另外由于该增长方式在小带宽下显然不怎么奏效,BIC规定了如果当前窗口值小于low_window(该值在实现里面为14),那么就采用标准TCP的拥塞方式进行处理。 

BIC-TCP的具体实现可以参考内核代码/net/ipv4/tcp_bictcp.c,上面的一些常量值在里面均有定义,在论文里面有伪码实现,逻辑都非常清晰,同时如果想看BIC的公平性理论证明和测试结果的也可以参考论文。

下一节:CUBIC。

posted on 2009-02-24 23:31  fll  阅读(7039)  评论(3编辑  收藏  举报