温州皮鞋厂老板上周就一直在问这个。正好昨天和今天早上有空,加上又在雨夜,就写一波。

温州皮鞋厂老板的问题如下:

慢启动: 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=2x2ln⁡2BDP_{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×2x42x2ln⁡2=G×2x4\dfrac{2^x}{2\ln 2}=G\times \dfrac{2^x}{4}

所以,我们就得到了GGG:

G=2ln⁡2" role="presentation">G=2ln2G=2ln⁡2G=\dfrac{2}{\ln 2}


接下来,我们来沿着从CwndCwndCwnd到PacingRatePacingRatePacingRate这条路来再走一遍,看看求出的增益系数是不是同一个值。

我们知道,发送量的变化率其实就是发送速率,因此对CwndCwndCwnd关于时间求导,就可以得到速率:

g(x)=f2′(x)=(2x)′=2xln2g(x)=f2′(x)=(2x)′=2xln⁡2g(x)=f_2\prime(x)=(2^x)\prime=2^x \ln2

设αα\alpha为PacingRatePacingRatePacingRate的增益系数,则有:

g(x+1)=α×g(x)=α×2xln2g(x+1)=α×g(x)=α×2xln⁡2g(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=α×2xln⁡2f_1(x+1) = \alpha \times g(x) = 2^{x+1} = \alpha \times 2^x \ln2

所以,我们可以求出αα\alpha的数值:

α=2ln2α=2ln⁡2\alpha = \dfrac{2}{\ln2}

可以看出,这里的PacingRatePacingRatePacingRate的增益和前面的CwndCwndCwnd增益在数值上是完全一致的,这也就是TCP BBR中的那个魔数2ln22ln⁡2\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,注意,是确定的常数。如果不通过积分或者求导的方式引入一个ln⁡2" role="presentation">ln2ln⁡2\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?相关推荐

  1. TCP BBR之Startup gain的另一种推导法以及最新进展

    自从上周有个大半夜帮温州皮鞋厂老板计算了那个2ln22ln⁡2\displaystyle\frac{2}{\ln2}之后,就着这个问题又进行了一些思考,过程中非常感谢BBR的作者之一Neal Card ...

  2. 再聊TCP BBR的2/ln2 bbr_high_gain问题

    嗯,确实还真有人看了我在雨夜写的上一篇文章: BBR的startup gain为什么是2/ln2?:https://blog.csdn.net/dog250/article/details/80660 ...

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

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

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

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

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

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

  6. The math behind dynamics of TCP BBR

    引 BBR中有很多诸如1.25,0.75,0.89,0.77之类的魔数字,它们是调教出来的经验值呢,还是可以用数学推导发出来呢? 这些问题在结果导向的当今非常无聊,但也勉强仅图一乐吧.对我自己而言,除 ...

  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. WAMP安装提示缺少 msvcr100.dll文件解决方法
  2. 武大计算机宿舍,国内最“豪华”的4所大学宿舍,武大上榜,最后一所意想不到!...
  3. Qt智能指针--QWeakPointer
  4. 树形DP+树状数组 HDU 5877 Weak Pair
  5. python list remove 删除引用_Python——list列表操作一坑(remove)
  6. c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...
  7. mysql数据库怎么读文件_mysql数据库读写文件
  8. 再获全球顶会ASPLOS认可:阿里云神龙凭什么打破物理机神话
  9. Deploy sahara on openstack-icehouse
  10. html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码
  11. 请问smartadmin中如何只用其treeview 组件?
  12. 使用LTT升级HP磁带机的固件程序
  13. excel饼图按占比从大到小排列
  14. css bottom属性 使元素位置相对固定
  15. [推荐]《人一生要读的60本书》
  16. JavaScript实现的手风琴图片切换,鼠标悬停任意图片html前端源码
  17. 幸运童年童装 研发制造营销
  18. 如何实现视觉识别颜色
  19. 一起来读书361- 应用密码学:第十一章 数学背景
  20. 固态硬盘测试软件270分,怎么读懂AS SSD Benchmark的跑分成绩

热门文章

  1. arduino 读取模拟电压_基础部分-读取模拟电压
  2. Nodejs+vue网上鲜花店销售信息系统express+mysql
  3. Unity Unlit ShaderGraph实现与PBR的自发光贴图类似的叠加效果
  4. 盘一盘那些提效/创意的宝藏网站
  5. 千兆12光12电管理型工业以太网交换机 12千兆光12千兆电口宽温环网交换机
  6. 《面试技巧-招聘篇》课程笔记
  7. 最详细的Keycloak教程:Keycloak实现手机号、验证码登陆——(一)Keycloak的下载与使用
  8. java maven log4j配置_如何在Maven构建的Java项目中使用log4j
  9. CocosCreator黄金矿工资源工程文件
  10. git 进阶系列教程--tag