昨晚凌晨抵达深圳,今早时间有限,于是就长话短说,但无论如何还是会有一些输出的,这次关于BBR。我曾经说过,我是不需要太多睡眠的,凌晨3点睡,照样早上6点起,应该可以把华为的人熬到cusi吧…不得而知了。

  晚上的火车上,手机充电很难,于是我拿着纸笔比划着一些传统的东西,好不容易蹭到了一个充电桩…满格100%后我看了几篇技术文章,其中有一个猛烈点的关于BBR的优化,当然这个不是我写的,虽然参考了我写的东西但还不是我写的,虽然我知道怎么写但我从来没写过反而还故意误导而反写。

  我看到了人性!看到了人自私的本质。…好吧,我承认,Google的BBR 2.0已经在逐步满足人们贪婪的本质了,这很OK,非常OK,然而非常容易被恶意利用。所以,我强烈反对这种控制论范畴的代码开源,强烈反对。

  没有人知道如何衡量公平性,是的,没有人知道,人们也不在乎。人们在乎的是,以激进为荣,以退让为耻,哪怕大家玉石俱焚反正只要你不成功我就很欣慰…

  云青青兮欲雨,水淡淡兮生烟,杭州西湖美景却挤满了拍照发朋友圈的人扔下成吨的垃圾,TCP…也就不说了…

  倚南窗以寄傲,审容膝之易安。小桥流水,可与鸿儒畅谈,江南烟雨中,杯酒杯茶可与思绪共勉,走在泥泞的土路上,仰头,想起了5年前…


BBR失速控制

很多人是真的不懂这些细节的,从多少次的聊天中就可以得知。前一篇文章说了TCP失速的原理:
从CUBIC/BBR的TCP ACK失速说起:https://blog.csdn.net/dog250/article/details/80140194
这里展示一下TCP BBR失速控制的原理:

可以看到,之所以没有发生真正的失速,是因为通过某种方式补偿了cwnd,即通过extral来补偿!

  总之,失速控制的关键在于,你要保持一个足够大的窗口,在由于ACK丢失,聚集(而不是原始数据丢失)引起的失速时仍然有足够的发送窗口

  请注意,这是一个主动的补偿,而非盲目的补偿,相比那些满天飞的把窗口增加nn<script type="math/tex" id="MathJax-Element-1">n</script>倍,把参数调大这种拍脑袋的做法,这种方案明显是可取的。另外值得注意的是,如何计算当前的extral呢?我这里采用了一种常见的方案,当然还有另一种BBR推崇的方案(然而我并不喜欢):

  • 我的方案:采用移动指数平均来取extral;
  • BBR的方案:采用Window max来取extral。

哪个好?自己决定,反正思路就在这里,万变不离其宗。这也挺无趣的。


我的一个BBR失速控制patch

还是那句话,看破不说破,不传播负能量。通过上面的图解,很容易看出这种场景的解法,那么下面就是一个怎么做的patch:

--- tcp_bbr.c   2018-05-02 10:43:40.167859439 -0400
+++ tcp_bbr_new.c       2018-05-07 06:40:58.411514978 -0400
@@ -58,6 +58,7 @@*/#include <linux/module.h>#include <net/tcp.h>
+#include <linux/skbuff.h>#include <linux/inet_diag.h>#include <linux/inet.h>#include <linux/random.h>
@@ -116,6 +117,9 @@unused_b:5;u32     prior_cwnd;     /* prior cwnd upon entering loss recovery */u32     full_bw;        /* recent bw, to estimate if pipe is full */
+       u32     sextral;
+       u64     ack_interval;
+};#define CYCLE_LEN      8       /* number of phases in a pacing gain cycle */
@@ -429,6 +433,9 @@cwnd = cwnd + acked;cwnd = max(cwnd, bbr_cwnd_min_target);+       if (!rs->losses)
+               cwnd += bbr->sextral;
+done:tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp);   /* apply global cap */if (bbr->mode == BBR_PROBE_RTT)  /* drain queue, refresh min_rtt */
@@ -653,7 +660,11 @@{struct tcp_sock *tp = tcp_sk(sk);struct bbr *bbr = inet_csk_ca(sk);
+       u32 extral;u64 bw;
+       u64 temp;
+
+       bbr->ack_interval = tcp_stamp_us_delta(tcp_clock_us(), bbr->ack_interval);bbr->round_start = 0;if (rs->delivered < 0 || rs->interval_us <= 0)
@@ -676,6 +687,11 @@bw = (u64)rs->delivered * BW_UNIT;do_div(bw, rs->interval_us);+       temp = (u64)rs->delivered*bbr->ack_interval;
+       extral = (u64)rs->delivered - do_div(temp, rs->interval_us);
+       if (extral > 0)
+               bbr->sextral = bbr->sextral - (bbr->sextral >> 3) + (extral >> 3);
+/* If this sample is application-limited, it is likely to have a very* low delivered count that represents application behavior rather than* the available network rate. Such a sample could drag down estimated
@@ -856,6 +872,8 @@bbr->cycle_idx = 0;bbr_reset_lt_bw_sampling(sk);bbr_reset_startup_mode(sk);
+       bbr->ack_interval = 0;
+       bbr->sextral = 0;cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);}
@@ -952,3 +970,4 @@MODULE_AUTHOR("Soheil Hassas Yeganeh <soheil@google.com>");MODULE_LICENSE("Dual BSD/GPL");MODULE_DESCRIPTION("TCP BBR (Bottleneck Bandwidth and RTT)");
+// for Linux 4.14 by zhaoya the shabi!

有人就要问了,这么做真的可以吗?哦,我不明白所谓的可以指的是可以干什么…

  答案是,这么做不可以,这么做什么都不可以,这只是思路,这不是交付件!另外,这么做很有可能你会付出成本代价…

  如今类似的神器已经太多了,我也不怕得罪谁,我就实话实说。当初医院排队,12306抢票,后来上海拍车牌,然后就是各种学区房的挤抢占…总之我们已经处于一个资源必须抢,抢不到就毁的现实中,所有人的心理都是趋向于损人不利己,请注意这个不利己词,非常重要!不管自己成不成功,只要别人失败就行。

  这是典型的结果导向的恶果!我过不去,那么大家就都别过去,就这么简单。延伸到技术,那就是TCP加速!BBR是一个很不错的算法,然而它错在开源,结果被一大帮怀着各种目的的人改参数放大招,结果就是互联网传输通路越来越一塌糊涂,BBR给了人们犯罪的一把利器,一把没有开刃的刀具,但绝不是一把没有子弹的枪。


相信任何人都不希望传播技术负能量,用技术手段去控制资源据为己有,如果有能力,也不会任由那些不懂装懂的工具小子持续作恶。

后记

对了,昨天在高铁站买了一本书,在非常累的时候看看也是不错的,这本书是笔名二混子写的《半小时漫画世界史》,讲得非常好,我一直都想自己写一本这样的集子,但最终还是行动力欠佳…本来我是想看看这本书之后对于细节跟作者线上讨教一番的,但是没有发现可以怼的地方,所以我想线下讨教,有熟悉的人帮忙引荐一下,我想我和作者可以成为朋友…

TCP BBR失速控制的一个小trick一个小patch相关推荐

  1. 让人们久等了的TCP BBR v2 0快要出炉了

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这是连续 ...

  2. TCP BBR Startup gain计算总结和Startup失速问题

    浙江温州皮鞋湿! 在前面几篇文章中,我采用纯数学的方式推导了TCP BBR Startup gain的由来,本文将通过一个BBR动力学模型对Startup gain的值做出直观地解释. BBR动力学模 ...

  3. 通过一个小Trick实现shader的像素识别/统计操作

    2018/12/14日补充:后来发现compute shader里用AppendStructuredBuffer可以解决这类问题,请看这里:https://www.cnblogs.com/hont/p ...

  4. 骨干网络演化释义以及TCP BBR的部署环境问题

    昨天本应该去公司加班的,但我由于不在本地而没去享受这奢华的周末盛宴.不过我要一路上远程值守,有问题要上,这是必须的.无聊的时候,没有问题制造问题也要上?这是贱.所以,在没有问题的时候,我写下一些简单的 ...

  5. 来自Google持续更新中的TCP BBR v2.0最新进展

    昨晚,Google Groups "BBR Development" group发出了一个topic,我早上醒来才看到,大致扫了一眼,这又是BBR进化史上的一个里程碑. 先给出sl ...

  6. 「深度好文」TCP BBR拥塞控制算法深度解析

    linux服务器开发相关视频解析: tcpip,accept,11个状态,细枝末节的秘密,还有哪些你不知道 徒手实现网络协议栈,请准备好环境,一起来写代码 c/c++ linux服务器开发学习地址:c ...

  7. 来自Google的TCP BBR拥塞控制算法解析

    写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15!         本文的写作方式可能稍有不同,之前很多关于 ...

  8. Google的TCP BBR拥塞控制算法深度解析

    原作者:dog250,授权发布 重新整理:极客重生 hi ,大家好,今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章,希望大家可以学习到一些真正的知识,理解其背后的设计原理,才能应对各种面 ...

  9. 个人感悟—来自Google的TCP BBR拥塞控制算法解析

    地址:TCR BBR拥塞控制算法另类解析 写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15! 本文的写作方式 ...

最新文章

  1. 无节操cocos2d-js游戏
  2. 张霖峰:AV1和VVC的格局将在2023年后明朗
  3. Linux修改开机启动logo
  4. exe解包和重新打包_Jira 批量提交问题 + 生成可执行文件exe
  5. 服务器漏洞文件被删除漏洞,【华中科技大学 - 漏洞预警】Wordpress = 4.9.6 任意文件删除漏洞...
  6. Ant编译SWF、SWC例子脚本
  7. 学生档案信息管理案例
  8. 物联那点事儿之小爱同学网络控制电脑开机(arduino+点灯科技篇)
  9. 作为一名软件测试人员,有哪些网站是你应该多多关注的,哪些书籍是你必须要看的?
  10. python桌面爬虫_爬虫项目实战十三:爬取zol桌面壁纸
  11. itchat与微软小冰的碰撞!--微软小冰接入itchat实现微信自动回复
  12. 例题 8-4 传送中的车(Fabled Rook, UVa 11134)
  13. 华为云服务器还需要确定位置吗,有了云服务器还需要主机吗
  14. 南开大学2012年考博微观经济学真题
  15. python6小时完全入门_如果只有1小时学Python,看这篇就够了,摸摸头发你还好吗!...
  16. 《解忧杂货店》-东野圭吾
  17. ST的FOC库 2.0学习 霍尔矢量控制
  18. 中国十大免费电影网站排行
  19. 将音频降采样至16k,16bit,立体声(双声道)改为单声道
  20. 时间序列分类02:数据可视化与问题分析建模流程详解(UCI-HAR)

热门文章

  1. Spring Boot:@PostConstruct虽好,也要慎用
  2. 如何理解二进制计算原理
  3. 转让一套基于 Flash 的网页版棋牌平台
  4. Excel公式注意事项
  5. leetcode系列-59. 螺旋矩阵 II
  6. 2022-1-25 牛客C++项目 —— SIGCHID 信号
  7. 2022-1-21 Leetcode 599. 两个列表的最小索引总和
  8. 程序员职业生涯中的〇一三五七
  9. 【转载】电路中各电源符号名称与意义
  10. 有道桌面词典老是显示网络已断开的解决方案