包括BBR在内的所有常见的拥塞控制算法都基于下面的策略:

  • 对特定的网络事件实施特定的动作。

比如检测到丢包后窗口减半,RTT变大后排空buffer等等,这些事件和动作的对应关系都是固定的,即便是非拥塞导致的事件,这些算法依然要采取相应的动作。

比如对于CUBIC,即便一个噪声丢包被监测到,窗口依然要降20%,这显然不合理。BBR要好很多,但它还是需要周期性进入ProbeRTT,同时BBR依然对独立丢包事件有所反应,要么这种反应过于保守,要么过于激进,很难兼顾低重传率和高带宽利用率。

互联网本身就是统计复用的,状态特征瞬息万变,事件触发原因错综复杂,根本不存在事件和原因的固定关联,也就不存在事件和动作的固定映射。指望这种固定映射的拥塞控制效果,可想而知。

PCC提出一种持续自学习的方法,不再对特定网络事件作出特定反应,而是将所有回馈数据作为变量交给一个效能函数UUU来处理,效能函数UUU会返回一个得分,分数越高,表明这组数据表征的网络状况越好。只要选择合适的效能函数UUU,PCC便可以同时兼顾高带宽利用率以及高公平性。

我不喜欢把paper重新解释一遍,详情参考:
https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-dong.pdf

这里面比较有意思的是如何确定效能函数UUU,简单谈一下我的想法。

效能包括两部分,正效能和负效能,总的效能是两部分相加,如果追求高带宽低时延低丢包,设TTT为测量带宽,RTTRTTRTT为时延,losslossloss为当前检测到的丢包,那么效能函数可以表示成:

U(T,RTT,loss)=f(T)+g(dRTTdt)+k(loss)U(T,RTT,loss)=f(T)+g(\dfrac{dRTT}{dt})+k(loss)U(T,RTT,loss)=f(T)+g(dtdRTT​)+k(loss)

其中:

  • f(x)f(x)f(x)表示正效能,为单调递增函数。
  • g(x)g(x)g(x)既可以表示正效能也可以表示负效能,它穿过第二象限,原点,第四象限的单调递减函数。
  • k(x)k(x)k(x)表示负效能,为单调递减函数。

f(x)f(x)f(x)和k(x)k(x)k(x)没得说,关键是g(x)g(x)g(x),单纯RTT的绝对值没有意义,因此用RTT的变化作为变量,如果RTT迅速变大,那肯定不是好事,反过来,如果RTT缓慢变小,那肯定是加分项,但加分值显然不如RTT迅速变小。

以上原则保证了每一条PCC流均向最高效能逼近。很神奇的是,所有的PCC流看起来都是自私地逼近自己的最优点,但全局来看,所有的流最终竟然还能收敛到公平,虽然我没有实测这个结论,但这仍然是最吸引我的地方。

现在的问题是,f(x)f(x)f(x),g(x)g(x)g(x),k(x)k(x)k(x)还要满足什么原则,能保证公平性呢?

这是一个复杂的数学问题,但还是可以简单介绍一下基本原理。关键点在于负效能的引入,会对每一次收益扣除相应的代价。

将公平性定义为占用buffer的比例是合理的,在此假设下,从2条流的公平性开始。

如果一条流占据buffer不超过0.5,那么它的正效能将大于负效能,反之如果一条流占据了超过0.5的buffer,那么它的负效能将大于正效能,当正好占据0.5的buffer时,正效能和负效能正好相等,在上述原则约束下,可以绘制出一族满足条件的UUU。显然,如果一条流占据buffer不足0.5时,它倾向于被正效能引导占据更多的buffer,反之则被负效能引导释放更多的buffer,最终两条流各占一半的buffer。

现在推而广之,3条流的13\dfrac{1}{3}31​占比,4条流的14\dfrac{1}{4}41​占比…n条流的1n\dfrac{1}{n}n1​占比。只需要在绘制出来的第n族UUU曲线中,找到一条同时最佳拟合所有n族曲线任意一条的曲线即可,其关于f(x)f(x)f(x),g(x)g(x)g(x),k(x)k(x)k(x)的表达式,就是最终的UUU。

假设这个UUU已经存在,实施PCC就变得自然而然。需要做的仅仅是以不同的发送速率不断探测,通过将回馈的结果灌入UUU函数来为该发送速率打分,以此方法慢慢逼近最优发送速率。

PCC paper建议的探测方法是:

  • 以r1=r(1+ε)r_1=r(1+\varepsilon)r1​=r(1+ε)和r2=r(1−ε)r_2=r(1-\varepsilon)r2​=r(1−ε)在packet round之间交替探测,其中rrr为当前实际速率,ε\varepsilonε为一个比较小的探测步长。小步才能快跑,步子大了容易扯到蛋。
  • 获取r1r_1r1​和r2r_2r2​的回馈R1R_1R1​和R2R_2R2​,分别计算U(R1)U(R_1)U(R1​)和U(R2)U(R_2)U(R2​)。
  • 若U(R1)>U(R2)U(R_1)>U(R_2)U(R1​)>U(R2​),则r=r1r=r_1r=r1​,反之r=r2r=r_2r=r2​.

但这显然不是唯一的方式,如何探测并不是最重要的。

PCC指出了端到端拥塞控制的终极方案,即探测,无论Reno/CUBIC,BBR,还是PCC,事实上都是在探测,Reno/CUBIC以一个AIMD周期来探测,最终探测到一个丢包作为buffer overflow的标志,BBR以8个packet rounds来探测,以获取空余带宽,同时以10s为周期探测以获取RTprop。PCC将所有的这些探测目标体现在单独的一次探测中,所以PCC理论上可以持续学习,以逼近最优解。

无论实际效果如何,PCC是一个新的方向。

BBR通过巧妙分割ProbeBW和ProbeRTT周期以确保探测正交性:

  • ProbeBW时,其RTT是RTprop,在up probe造成排队时,drain to target会排出多余的包。
  • ProbeRTT时,排空buffer,但max bandwidth依然维持在max-win-filter中。

然而该分割仅针对全网BBR的场景,当面对异构网络与其它CC流共存时,上述的正交性便无法得到保证,10s太久,8个rounds可能也不灵敏,buffer可能并非BBR流填充的,此时如何应对,事情就会变得复杂,BBRv2简直就是妥协的产物,面目已全非。

PCC将正交性融合在了一个单独的效能函数中,每一个round就能获得一个效能结果,事件不会再被探测周期淹没,探测周期可能仅仅为了低通滤波的目的而继续存在。

端到端的拥塞控制,很简单也很难,简单在只需要探测,难在如何探测。

在此前的多年,我和同事一直都在聊如何从一些测量量的导数,二阶导数看到些变化趋势或者可以指导如何反应的实时动态,但并不易,难在实现而不是思路,除了四则混合运算,额外开方,求导,积分,自然对数,这些真的很难,即便是除法,也很难保证精度,我们无法做到快速验证,大多数时候也就只能纸上谈兵了。


浙江温州皮鞋湿,下雨进水不会胖。

PCC拥塞控制算法有什么新的突破相关推荐

  1. webrtc拥塞控制算法对比-GCC vs BBR vs PCC

    1.前言 现有集成在webrtc中的拥塞控制算法有三种, 分别是: 谷歌自研发的gcc, 谷歌自研发的BBR算法, 斯坦福大学提出的基于机器学习凸优化的PCC算法. 本文将探讨一下三个算法的区别和优缺 ...

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

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

  3. 如何写一个好的拥塞控制算法

    随手写点感想. 有人说CUBIC带宽利用率低,有人说BBR存在这样那样的问题,于是很多魔改版本纷至沓来,于是各式各样的实验室CC寒武纪大爆发,最终还是出不了实验室,最终还是这样那样的问题. 问题的根源 ...

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

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

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

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

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

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

  7. TCP拥塞控制算法内核实现剖析(二)

    内核版本:2.6.37 主要源文件:linux-2.6.37/ net/ ipv4/ tcp_bic.c 本文主要分析BIC算法实现 ================================= ...

  8. 面试热点|理解TCP/IP传输层拥塞控制算法

    来自:后端技术指南针 0x00.前言 这是TCP/IP协议栈系列的第二篇文章,之前的一篇理解TCP/IP协议栈之HTTP2.0感兴趣可以看下,今天一起来学习下一个热点问题. 通过本文你将了解到以下内容 ...

  9. Linux TCP拥塞控制算法原理解析

    这里只是简单梳理TCP各版本的控制原理,对于基本的变量定义,可以参考以下链接: TCP基本拥塞控制http://blog.csdn.net/sicofield/article/details/9708 ...

最新文章

  1. LiveVideoStackCon 2019北京开幕 成为多媒体技术生态风向标
  2. 前端学习(2230):react条件渲染实现登录二
  3. php手工注入拿webshell
  4. java 上溯造型与下塑造型
  5. 15.Nginx 服务器的高级配置
  6. denali vip使用经验
  7. 比特率和波特率的区别
  8. GEE(python)雨天Gini指数
  9. 每日十道面试题(五)
  10. Python 实现个人博客系统
  11. 全球与中国镁-铈(Mg-Ce)母合金市场深度研究分析报告
  12. android4.0.3 编译lichee 报错dhd-cdc-sdmmc-gpl-3.0.8问题
  13. 试分别简述udp和tcp的特点_读朱红群《余姚音系简述》
  14. Spring MVC上传图片,Java二…
  15. 使用freesurfer进行海马亚区分割学习笔记
  16. UWB室内定位技术有什么风险呢?
  17. backlight子系统二
  18. XMind6和XMind7有何不同
  19. 消费信贷业务风控英文词汇手册
  20. 马蜂窝实时计算平台演进之路

热门文章

  1. visa基本函数操作
  2. Replication(上):常见复制模型分布式系统挑战
  3. 阿里云服务器活动中的计算型c5、c6、c6a、c6e有什么区别?如何选择?
  4. 方法----解决win10笔记本电脑连接电源无法休眠只是黑屏,使用电池可以正常休眠。
  5. Vuex中的Getter的使用
  6. Creo二次开发:创建工程图,生成球标和明细表
  7. Phython基础语法知识点汇集
  8. Python网络爬虫实战之爬取小说
  9. 康宁杰瑞任命前默克中国研发中心负责人担任首席医学官
  10. centos 7 添加端口白名单,设置防火墙