TCP BBR的startup bbr_high_gain为什么是2/ln2?
温州皮鞋厂老板上周就一直在问这个。正好昨天和今天早上有空,加上又在雨夜,就写一波。
温州皮鞋厂老板的问题如下:
慢启动: init_cwnd×2n=cwndinit_cwnd×2n=cwndinit\_cwnd \times 2^n = cwnd
增长速率为 2n2n2^n求导=n×2n−1n×2n−1n\times 2^{n-1}. pacing_gain应该等于类似这个东西来算吧
怎么就2ln22ln2\dfrac{2}{ln2}了
其实一开始我也不知道,根本就没有注意过这个问题,能找到的资料也就是tcp_bbr.c中关于bbr_high_gain的注释:
/* We use a high_gain value of 2/ln(2) because it's the smallest pacing gain* that will allow a smoothly increasing pacing rate that will double each RTT* and send the same number of packets per RTT that an un-paced, slow-starting* Reno or CUBIC flow would:*/
static const int bbr_high_gain = BBR_UNIT * 2885 / 1000 + 1;
另外,BBR的paper:
https://queue.acm.org/detail.cfm?id=3022184
这里面也能找到一段论述:
To handle Internet link bandwidths spanning 12 orders of magnitude, Startup implements a binary search for BtlBw by using a gain of 2/ln2 to double the sending rate while delivery rate is increasing. This discovers BtlBw in log2BDP RTTs but creates up to 2BDP excess queue in the process.
除此之外,就再也找不到别的资料了。我自己也很好奇,也跟很多人进行了讨论,甚至包括BBR的作者之一Neal Cardwell,最终以我自己的理解,整理出了这篇文章,希望能帮同样有此疑问的人解惑。
在Startup阶段,BBR的bbr_high_gain同时作用于PacingRatePacingRatePacingRate和CwndCwndCwnd两者,两者遵循同样的演化规律,即随着RTTRTTRTT轮数而指数级递增:
PacingRate=f1(rounds)=R0×2roundsPacingRate=f1(rounds)=R0×2roundsPacingRate =f_1(rounds)= R_0\times 2^{rounds}
Cwnd=f2(rounds)=init_cwnd×2roundsCwnd=f2(rounds)=init_cwnd×2roundsCwnd = f_2(rounds)=init\_cwnd\times 2^{rounds}
因此,在推导bbr_high_gain时,可以沿着两条路分别进行,我们先沿着PacingRatePacingRatePacingRate积分到CwndCwndCwnd这条路推导出CwndCwndCwnd视角的bbr_high_gain,然后再通过CwndCwndCwnd求导到PacingRatePacingRatePacingRate这条路来验算。
假设在第nnn个RTT" role="presentation">RTTRTTRTT时其PacingRatePacingRatePacingRate是R0×2nR0×2nR_0\times 2^n,那么在下一个RTTRTTRTT,即n+1n+1n+1个RTTRTTRTT时,它的PacingRatePacingRatePacingRate就会变成R0×2n+1R0×2n+1R_0\times 2^{n+1},多了2n2n2^n个R0R0R_0,在Startup阶段,CwndCwndCwnd也遵循同样的演化规律。
为了推导简单,我们将设R0R0R_0,InitCwndInitCwndInitCwnd,RTTRTTRTT均为111来归一化,同时用自变量x" role="presentation">xxx表示以一个RTTRTTRTT为单位的轮数,上面的式子可以写成:
PacingRate=f1(x)=2xPacingRate=f1(x)=2xPacingRate = f_1(x)=2^x
Cwnd=f2(x)=2xCwnd=f2(x)=2xCwnd =f_2(x)=2^x
而我们知道,BDPBDPBDP是PacingRatePacingRatePacingRate在时间上的积分(忽略常数C)。根据我们的假设,我们是按RTTRTTRTT轮数来计数的,所以一个RTTRTTRTT单位内的BDPBDPBDP就是一个关于PacingRatePacingRatePacingRate的定积分:
按照牛顿-莱布尼兹定理则有:
BDPlastrtt=F(x)|xx−1=∫xx−12xdx=2x2ln2BDPlastrtt=F(x)|x−1x=∫x−1x2xdx=2x2ln2BDP_{lastrtt}=F(x)|_{x-1}^{x}=\displaystyle\int_{x-1}^{x} 2^xdx=\dfrac{2^x}{2\ln 2}
抽掉BDPBDPBDP中的时间维度,在数值上它的意义就是CwndCwndCwnd。
设GGG为增益系数,根据间隔一个RTT" role="presentation">RTTRTTRTT时其CwndCwndCwnd的关系,则有:
F(x)|xx−1=G×f2(x−2)F(x)|x−1x=G×f2(x−2)F(x)|_{x-1}^x=G\times f_2(x-2)
化简可以得到:
2x2ln2=G×2x42x2ln2=G×2x4\dfrac{2^x}{2\ln 2}=G\times \dfrac{2^x}{4}
所以,我们就得到了GGG:
G=2ln2" role="presentation">G=2ln2G=2ln2G=\dfrac{2}{\ln 2}
接下来,我们来沿着从CwndCwndCwnd到PacingRatePacingRatePacingRate这条路来再走一遍,看看求出的增益系数是不是同一个值。
我们知道,发送量的变化率其实就是发送速率,因此对CwndCwndCwnd关于时间求导,就可以得到速率:
g(x)=f2′(x)=(2x)′=2xln2g(x)=f2′(x)=(2x)′=2xln2g(x)=f_2\prime(x)=(2^x)\prime=2^x \ln2
设αα\alpha为PacingRatePacingRatePacingRate的增益系数,则有:
g(x+1)=α×g(x)=α×2xln2g(x+1)=α×g(x)=α×2xln2g(x+1)=\alpha \times g(x) = \alpha \times 2^x \ln2
经过αα\alpha演化的PacingRatePacingRatePacingRate恰好就是f1(x+1)f1(x+1)f_1(x+1)的数值:
f1(x+1)=α×g(x)=2x+1=α×2xln2f1(x+1)=α×g(x)=2x+1=α×2xln2f_1(x+1) = \alpha \times g(x) = 2^{x+1} = \alpha \times 2^x \ln2
所以,我们可以求出αα\alpha的数值:
α=2ln2α=2ln2\alpha = \dfrac{2}{\ln2}
可以看出,这里的PacingRatePacingRatePacingRate的增益和前面的CwndCwndCwnd增益在数值上是完全一致的,这也就是TCP BBR中的那个魔数2ln22ln2\dfrac{2}{\ln2}的由来。
如果你足够细心,你会发现上面的推导中有一个破绽。比如,既然f1(x)=f2(x)f1(x)=f2(x)f_1(x)=f_2(x),而g(x)g(x)g(x)又由f1(x)f1(x)f_1(x)求导产生,g(x)g(x)g(x)和f2(x)f2(x)f_2(x)均表示PacingRatePacingRatePacingRate时,显然而然的是:
g(x)≠f2(x)g(x)≠f2(x)g(x) \ne f_2(x)
!!
其实,函数f1f1f_1和f2f2f_2之所以这么写是因为它们在离散的RTTRTTRTT上表现得确实如此,但在实际中,速率计算,CwndCwndCwnd计算并非总是由平滑均匀的ACK事件来触发的,所以说就必须用一条光滑的曲线来尽量拟合离散的点,因此,上面的f1(x)f1(x)f_1(x),f2(x)f2(x)f_2(x)本身就不是光滑曲线,它们和g(x)g(x)g(x)本身就不是同一条曲线。
实际上,f1(x)f1(x)f_1(x)和f2(x)f2(x)f_2(x)表示的均是折线,所要做的正是用光滑的曲线去拟合折线上那些离散的转折点,所以说,只能用增益系数代入去解方程,而不是直接让两个函数相等。
f1f1f_1和f2f2f_2的图像类似下面这样:
我们再把代表BDPBDPBDP的平滑拟合曲线F(x)F(x)F(x)以及代表PacingRatePacingRatePacingRate的平滑拟合曲线g(x)g(x)g(x)画到同一个坐标系中:
可以看得出,它们是3样不同的曲线。
不过,看起来F(x)F(x)F(x)和g(x)g(x)g(x)对离散的f1(x)f1(x)f_1(x)和f2(x)f2(x)f_2(x)拟合得并不是很理想,那为什么不直接用f(x)=2xf(x)=2xf(x)=2^x来拟合呢?它可是能完美拟合的吧:
或者,我们可以用二项式去拟合,用级数…
然而这些都不行。为什么呢?因为要考虑到计算,这里并不是在解一道数学题,而是要求出一个确定的常数作为增益系数GGG,注意,是确定的常数。如果不通过积分或者求导的方式引入一个ln2" role="presentation">ln2ln2\ln2因子,单纯的f(x)=2xf(x)=2xf(x)=2^x是无法得到一个确定的常数的。
这种方法,我们感到似曾相识,TCP的拥塞控制算法,从BIC到CUBIC就是采用了这种光滑的三次曲线拟合BIC二分折线的方法,其中的那些参数也可以用类似的方法求解。
除此之外,以上推导中,下面的关系是不存在的:
f1(x+1)=α×f1(x)f1(x+1)=α×f1(x)f_1(x+1)=\alpha \times f_1(x)
f2(x+1)=α×f2(x)f2(x+1)=α×f2(x)f_2(x+1)=\alpha \times f_2(x)
为什么?因为f1(x)f1(x)f_1(x)和f2(x)f2(x)f_2(x)上的点是离散的,非连续函数在无定义的域上求值没有意义。然而ACK的到达并非以RTT为单位准点的,更有可能遭遇ACK丢失,ACK聚集等无法预知的时间,因此ACK到达是任意的,所以就必须用光滑的曲线来拟合这些离散的点,从而达到比较平滑的增益效果。
简单点说,增益系数GGG的结果是针对光滑的拟合曲线而言的,即针对g(x)" role="presentation">g(x)g(x)g(x)以及F(x)F(x)F(x)的,而不是针对f1(x)f1(x)f_1(x)和f2(x)f2(x)f_2(x)的。
TCP BBR的startup bbr_high_gain为什么是2/ln2?相关推荐
- TCP BBR之Startup gain的另一种推导法以及最新进展
自从上周有个大半夜帮温州皮鞋厂老板计算了那个2ln22ln2\displaystyle\frac{2}{\ln2}之后,就着这个问题又进行了一些思考,过程中非常感谢BBR的作者之一Neal Card ...
- 再聊TCP BBR的2/ln2 bbr_high_gain问题
嗯,确实还真有人看了我在雨夜写的上一篇文章: BBR的startup gain为什么是2/ln2?:https://blog.csdn.net/dog250/article/details/80660 ...
- 来自Google持续更新中的TCP BBR v2.0最新进展
昨晚,Google Groups "BBR Development" group发出了一个topic,我早上醒来才看到,大致扫了一眼,这又是BBR进化史上的一个里程碑. 先给出sl ...
- TCP BBR Startup gain计算总结和Startup失速问题
浙江温州皮鞋湿! 在前面几篇文章中,我采用纯数学的方式推导了TCP BBR Startup gain的由来,本文将通过一个BBR动力学模型对Startup gain的值做出直观地解释. BBR动力学模 ...
- 让人们久等了的TCP BBR v2 0快要出炉了
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这是连续 ...
- The math behind dynamics of TCP BBR
引 BBR中有很多诸如1.25,0.75,0.89,0.77之类的魔数字,它们是调教出来的经验值呢,还是可以用数学推导发出来呢? 这些问题在结果导向的当今非常无聊,但也勉强仅图一乐吧.对我自己而言,除 ...
- 来自Google的TCP BBR拥塞控制算法解析
写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15! 本文的写作方式可能稍有不同,之前很多关于 ...
- Google的TCP BBR拥塞控制算法深度解析
原作者:dog250,授权发布 重新整理:极客重生 hi ,大家好,今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章,希望大家可以学习到一些真正的知识,理解其背后的设计原理,才能应对各种面 ...
- 个人感悟—来自Google的TCP BBR拥塞控制算法解析
地址:TCR BBR拥塞控制算法另类解析 写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15! 本文的写作方式 ...
最新文章
- WAMP安装提示缺少 msvcr100.dll文件解决方法
- 武大计算机宿舍,国内最“豪华”的4所大学宿舍,武大上榜,最后一所意想不到!...
- Qt智能指针--QWeakPointer
- 树形DP+树状数组 HDU 5877 Weak Pair
- python list remove 删除引用_Python——list列表操作一坑(remove)
- c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
- mysql数据库怎么读文件_mysql数据库读写文件
- 再获全球顶会ASPLOS认可:阿里云神龙凭什么打破物理机神话
- Deploy sahara on openstack-icehouse
- html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码
- 请问smartadmin中如何只用其treeview 组件?
- 使用LTT升级HP磁带机的固件程序
- excel饼图按占比从大到小排列
- css bottom属性 使元素位置相对固定
- [推荐]《人一生要读的60本书》
- JavaScript实现的手风琴图片切换,鼠标悬停任意图片html前端源码
- 幸运童年童装 研发制造营销
- 如何实现视觉识别颜色
- 一起来读书361- 应用密码学:第十一章 数学背景
- 固态硬盘测试软件270分,怎么读懂AS SSD Benchmark的跑分成绩
热门文章
- arduino 读取模拟电压_基础部分-读取模拟电压
- Nodejs+vue网上鲜花店销售信息系统express+mysql
- Unity Unlit ShaderGraph实现与PBR的自发光贴图类似的叠加效果
- 盘一盘那些提效/创意的宝藏网站
- 千兆12光12电管理型工业以太网交换机 12千兆光12千兆电口宽温环网交换机
- 《面试技巧-招聘篇》课程笔记
- 最详细的Keycloak教程:Keycloak实现手机号、验证码登陆——(一)Keycloak的下载与使用
- java maven log4j配置_如何在Maven构建的Java项目中使用log4j
- CocosCreator黄金矿工资源工程文件
- git 进阶系列教程--tag