有没有一种 rate-based 算法可以不测量 delivery rate,当然有!直接套在 AIMD 上就行,虽然套在 bbr 上没什么不可。
传统 AIMD 拥塞控制代价很大,代价源自两点,首先,AI 有填 buffer 的趋势,其次,MD 可能过度降低带宽利用率,两者相克相生无法统一,这是固有开销。还差一个因素没作为变量被引入收敛过程,pacing,依靠 pacing 在达到最佳资源利用率的过程中收敛,如下图:
buffer 始终未 overflow,好像 A 和 B 都知道它的 limit,二者默契配合,此消彼长,达到最佳。但事实上共享链路的流互不可见,上图只是一厢情愿。
从 拥塞控制的经济学原理 和 借贷式拥塞控制 的借贷视角去理解就知道怎么做了。虽然我借钱不知道该付多少利息最合适,多借几次就知道了,对于放款的人也一样,最终大家总能收敛到一个合适的利率,时间不耐表面上的供需决定这一切。
下图是一个新的解释:
以上重新解释后就是一个非常清晰的高效收敛模型。只要经过简单 probe,得到一个大致的 cwnd 标的作为 buffer 的预测值,该模型很容易自然收敛。
由 bpd = pacing_rate * rtt,可得一个恒等式 rtt = bdp * (1 / pacing_rate),而不占 buffer 时的 bdp 就是 cwnd 指示,于是可将 burst 率表示为 cwnd 的倒数,d_burst = 1 / cwnd,可乘上一个系数作可调参数,即 d_burst = beta * (1 / cwnd),恰好保持 rtt 不变,即无 queue 的意思,注意,它既是因又是果(确实比较烧脑)。
始终保持(比如 cubic/reno)或间隔保持(比如 bbr)多出 1 个 或 n 个报文作 probe,可自动发现 F 点,delivery rate 不再增加即为收敛到公平的终止条件,虽然当前流依然可以继续抢占更多带宽,但如果它依照本算法执行的话,稳定的 “跳出 cwnd-limited” 状态将阻止它继续,v < buffer_limit 会改变收敛平衡点,v > buffer_limit 则造成丢包。
和货币原理一样,信用货币与信用规模有关,与流通有关,在网络传输中信用规模和流通主要表现为带宽,而相互借贷则此消彼长,受限于 buffer(将它看作备金)。这从另一个视角证明了 bbr 的最优操作点无法独立找到,必须在 buffer 里折腾,但凡多流共享带宽,就需 buffer 提供倒腾收敛的空间,这就是 “同步的代价”,本来就是空间换时间,如果省掉 buffer,就没了收敛的反应时间。对于 bbr 而言,如果去掉 cwnd_gain * bdp 限制,取决于 cruise 长度,buffer queue 亦将很长。
网络传输的公平和效率的度量属于在变化中度量,它和经济学中很多固有难题一样难解,比如如何保持货币的稳定,如果压缩通胀和通缩的反应周期,说白了但凡在变化中度量的指标,包括标准本身在内,都要对抗滞后性,而滞后性带来固有的偏差,单向时间又将偏差叠加,这是难题之所以难的原因。
但偏差和误差不同,误差可以小到忽略不计但偏差不能,因为偏差是随问题规模等比例缩放的,它的分辨率是一定的。还是那句话,放大了就是马赛克,缩小了你的眼睛又看不清了。
注意,本文的算法位于标准 cc 之上,reno/cubic/westwood/vegas/bbr 等该怎么玩还怎么玩,本文只是引入一种 pacing 和 burst 之间的关系。
浙江温州皮鞋湿,下雨进水不会胖。