BBR算法中轮数计算方法

        轮数在拥塞算法中是一个重要的概念,基于丢包的拥塞算法中,比如reno算法在拥塞避免阶段,每轮进行一次拥塞窗口加1,bic算法也是每轮进行一次拥塞窗口增加,只是增加的幅度不同,而基于时延的拥塞算法,如vegas算法,检测出一轮内的最小rtt_us值,与rtt_min对比推断得到当前网络的数据包排队的情况。这些例子中可以看出,对于算法的实现都需要考虑轮数的统计。

        那算法是如何计算轮数的呢?主要分为三种,一种形如reno,bic这类算法中,轮数的计算建立在 某一轮能发送snd_cwnd个数据包,当累计了snd_cwnd个数据包确认,就为一轮结束。算法中有个snd_cwnd_cnt变量用来累计当前轮已经收到了多少的数据包确认,当该值大于等于拥塞窗口snd_cwnd,就认为一轮结束了。

以reno为例,w为控制增窗的频率快慢,reno中等于snd_cwnd

   void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w)

   {

        if (tp->snd_cwnd_cnt >= w) { //累计了snd_cwnd个ack数据包

            if (tp->snd_cwnd < tp->snd_cwnd_clamp)//未超过申明的最大窗口值

                tp->snd_cwnd++;

             tp->snd_cwnd_cnt = 0; //累计ack个数清零

         } else {//累计ack个数

            tp->snd_cwnd_cnt++;

        }

}

        第二类,如vegas这种基于时延的拥塞算法中,用序列号进行区分,记录某一轮的起始点对应的snd_nxt,当snd_nxt所对应的数据包没有发生重传,被接收端ack确认的时间即为一个rtt,也就是一轮,如下图所示,数据包a被ack确认时,只有线段SEQ1以上的数据包是之后发送的,当这区间某个数据包被ack确认,说明已经经过了一轮rtt,新一轮中,只有线段SEQ2以上的数据包是之后发送的。


以vegas算法为例,

if (after(ack, vegas->beg_snd_nxt)) {

    /* Do the Vegas once-per-RTT cwnd adjustment. */

    /* Save the extent of the current window so we can use this

    * at the end of the next RTT.

    */

    vegas->beg_snd_nxt  = tp->snd_nxt;

    ...

}

        第三种就是bbr算法中所使用的轮数计算方法,用时间来区分,每个数据包发送都记录当前交付到对端的数据包个数delivered,某一时刻T为一轮的起始点,对应的交付到对端个数为D,时间小于T的记录的delivered都小于D,之后发送的数据包记录的delivered都大于等于D,当接收端收到ack(sack)数据包对应发送的delivered大于等于D,说明T时刻之后发送的数据包至少有个一到达了接收端,即经过了一轮RTT。


        如上图所示,时刻T1所对应的tp->delivered 为D,那时刻T1右侧发送的数据包都是之后发送的,记录prior_delivered都大于等于D,当两个重传数据包被ack确认时,其对应的prior_delivered都为D,说明T1时刻之后发送的两个数据包经过一个RTT传输已经被接收,已经经过了一轮,开始了新一轮,而此时tp->delivered为D+2,之后发送的数据包记录的prior_delivered都大于等于D+2,当收到ack确认的数据包记录的prior_delivered大于等于D+2,说明时间已经又过了一轮,新一轮已经开始。

/* See if we've reached the next RTT */

if (!before(rs->prior_delivered, bbr->next_rtt_delivered)) {

    bbr->next_rtt_delivered = tp->delivered;

    bbr->rtt_cnt++;

    bbr->round_start = 1;

    ...

}

rs->prior_delivered就为每个ack(sack)确认的包发送时记录的tp->delivered值,当其大于等于某一轮起始的delivered值,就为新一轮开始。

        这三种不同的方法,bic算法中这样处理是由于比如窗口每轮增加5个包,并不是一轮结束后窗口加5,而是每经过1/5的窗口值就进行拥塞窗口加1的操作。vegas算法中,需要统计一轮内最小rtt_us,需要知道某一轮的起始和结束点,定期的重置当前轮内追踪到的最小rtt_us以及调整窗口值。然而,BBR算法不仅负责拥塞避免阶段的发包,而且还接管了拥塞丢包状态下发包行为,而vegas算法中的轮数计算只能用于不丢包的open/disorder状态,假设某个时刻发生大面积丢包,拥塞窗口骤降,需要经过两三轮的重传才能重传完毕,才能推进snd_una,进而更新轮数。这对BBR来说是非常不合适了,因为已经拥塞丢包了,网络状况很有可能已经变差了,而这时却因为计算出来的轮数偏小,不能及时的更新最大带宽值,进而延迟了网络处于拥塞的状态时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP...
    愛我你就抱抱我阅读 590评论 0 0
  • 这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇《TCP的那些事儿(上)》 上篇中,我们介绍了TCP...
    半岛夏天阅读 640评论 0 2
  • TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,...
    风亡小窝阅读 1,837评论 0 1
  • 在2.6.32内核中,基于丢包的拥塞算法基本都需要考虑,delay_ack所带来的影响。例如每个ack都确认两个数...
    搬砖小男孩阅读 1,124评论 0 49
  • 为了让我们不半途而废,就需要为我们所做的事情赋予重大的意义。然而很多时候我们并没有想清楚这个意义,因为我们并不太了...
    鄢中堡阅读 594评论 0 0