/* Track min RTT seen in the min_rtt_win_sec filter window: */filter_expired = after(tcp_time_stamp, bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);if (rs->rtt_us >= 0 && (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { bbr->min_rtt_us = rs->rtt_us; bbr->min_rtt_stamp = tcp_time_stamp; bbr->rtt_us = rs->rtt_us; if (filter_expired) bbr->max_rtt_us = rs->rtt_us;}bbr->rtt_us = bbr->min_rtt_us;if (!filter_expired && rs->rtt_us >= 0 && rs->rtt_us < bbr->max_rtt_us) { bbr->rtt_us = rs->rtt_us;}2.修改bbr_target_cwnd
if (inet_csk(sk)->icsk_ca_state != TCP_CA_Open) w = (u64)bw * bbr->min_rtt_us;else w = (u64)bw * bbr->rtt_us;----------------------------最大RTT和最小RTT之差就是排队延迟,充分利用这个排队延迟去添堵是一件简单的好事,但是如何去对抗AQM则是一件非常复杂的事,因为你并不知道AQM的行为。以上的讨论均建立在尾部丢包的基础之上,然而现实情况则要面临复杂的AQM,在文章《linux Kernel 4.9中TCP BBR算法的科普解释》的“君莫舞,君不见玉环飞燕皆尘土”以及“BBR的优势之-与AQM的关系”两节中,我有阐述BBR如何乐观地等待CUBIC之流被惩罚以及如何愉快地上位,然而在“广中路上匝道”情形中,CUBIC并不会被惩罚,BBR自然也就不会上位,那怎么办,只能添堵,至于AQM怎么处理,一视同仁吧。换句话说,BBR在CUBIC以及任意所谓“TCP加速者”面前,不必客气,他们抽烟,你就放火。快递或者网络可靠吗
现在人们没了互联网就不能生活,这也是一种错觉。 其实互联网本身就是一种错觉,它是一种不得已而为之的错觉! 去年1月我去深圳万象城(之所以说万象城而不是人人乐,我是想说我买的东西有多么高大上,以至于我多么迫不及待地想拥有)买东西,无货,咋办?店主说次日可取,他们从广州拿货。现在问题来了,去一趟广州难吗?为什么我自己不直接去广州买,还要深圳万象城去广州拿货后再卖给我?因为我没时间!如果我有大把的时间又那么喜欢那件物品,我肯定自己去广州了,顺带旅游,然而我缺的正是时间。 快递业务填补了人们的时间间隙。但是快递业务真的可靠吗? 如果我自己去广州拿货,假设高铁不脱轨,汽车不翻车,自己不被人捅的情况下,一路上我愉快地去,拿到货后愉快地归来,一路上我亲自护送货品,我放心,我踏实。如果交由快递,我不知道快递车会不会翻车,会不会被人抢,里面会不会是假货...一切我都不确定,在送到我手里前,我只能祷告~!但好处在于,这段送货的时间,在我信任快递公司的前提下,我可以做别的工作,如果我不信任快递公司,我只能心急如焚。好在,现在的快递公司,特别是顺丰还算靠谱,你不需要心急如焚。 但是网络,其可靠性完全是另一回事,幸亏人们用了TCP,不然就别玩了。字节的复制往往比丝帛的织造更加廉价,所以TCP有一个存储重发的机制,发送信息前先存储信息,一段时间没有收到回应,就重发被存储的信息,收到回应则将信息删除,如果发了一批丝绸到远方,一段时间没有反馈,然后再去织一批新的,那代价可就大了去了...----------------------------我不亲自去广州而去委托快递公司,正是因为我没有时间,那么如果快递公司的快递过程“弥补”了我本应该节省的时间(比如快递员懒惰),我还不如自己去拿货呢。网络也一样,如果网络的延迟太高,那还不如用U盘拷贝信息,用汽车运输U盘,然后交付呢...网络和快递一样,就是图快,用专业的运输代替你自己的自取。然而,如果网络中有Bufferbloat,那么还不如去自取,甚至去用U盘拷贝。 Bufferbloat让网络丧失了快速传输通道的名声。新的Bloat版本的BBR算法
周日早晨,我登录到了温州老板提供的位于国外的VPS机器上,演绎了一个新版的BBR。也是添堵版的,在我的WIFI环境下碾压了标准的BBR,这就好像魔人布欧的分身一样,一个是好人的时候,另一个必须是恶棍。非常简单:1.为bbr增加一个minmax类型的max_rtt字段
2.修改bbr_update_min_rtt函数
filter_expired = after(tcp_time_stamp, bbr->min_rtt_stamp + bbr_min_rtt_win_sec * HZ);if (rs->rtt_us >= 0 && (rs->rtt_us <= bbr->min_rtt_us || filter_expired)) { bbr->min_rtt_us = rs->rtt_us; bbr->min_rtt_stamp = tcp_time_stamp; bbr->rtt_us = rs->rtt_us;}bbr->rtt_us = rs->rtt_us;rtt_PRior = minmax_get(&bbr->max_rtt);// 迄今为止最大的RTT与当前RTT取其小!是不是拿最大RTT和最小RTT求个"平均"什么的更合理呢?// 反正我是占点Buffer空间bbr->rtt_us = min(bbr->rtt_us, rtt_prior);minmax_running_max(&bbr->max_rtt, bbr_bw_rtts, bbr->rtt_cnt, rs->rtt_us);我祝愿所有的TCP连接早日崩溃,我祝愿互联网越来越拥堵,最终不可用。为什么BBR是合理的
AIMD是基于丢包的拥塞控制算法的根基,这必然会Buffer bloat,解决之道就是不采用基于丢包的算法,而采用基于时延的算法,但是.... 但是只要有一个基于丢包的算法还跑在互联网上,那么所有基于时延的算法都会集体退让...这是基于时延算法弊端,既然它基于时延而不是丢包,那么它就是注定要吃亏的。正确的做法是什么? BBR无视丢包(也并非绝对,BBR在处理非Open状态时还是有措施的),无视时延(也非绝对,BBR只是无视了RTT的瞬时变化值),采用了实时采集并保留时间窗口的策略,这初看起来是吃亏的算法,与基于时延的算法无异,但是BBR拥有Probe More和Drain Less过程,这非常合理。 合理的并不意味着是可用的。我依然祝愿所有的TCP连接早日崩溃,我祝愿互联网越来越拥堵,最终变得不可用。我有一个梦想,每个人抡起铁锤去炼钢,少说多做,最好不说。
新闻热点
疑难解答