CUBIC \text{CUBIC} CUBIC 是针对长肥管道优化的 AIMD \text{AIMD} AIMD 变体,但这种优化体现在哪里,先看标准 AIMD \text{AIMD} AIMD 是怎么个事。
它的不足体现在 Aspera \text{Aspera} Aspera 列举的一个反例中:

如图所示,标准 AIMD \text{AIMD} AIMD 随着 RTT \text{RTT} RTT 增加吞吐陡降,而这张图并非夸张,它就是 AIMD \text{AIMD} AIMD 吞吐函数的图像:
T ^ = 2 − b a 2 b R p \hat T = \dfrac{\sqrt{2-b}\sqrt{a}}{\sqrt{2b}\,R\sqrt{p}} T^=2b Rp 2−b a
其中 a , b a,b a,b 为参数, R R R 为 RTT \text{RTT} RTT, p p p 为丢包率。
标准 AIMD \text{AIMD} AIMD 吞吐公式基于拥塞周期稳态假设,每周期窗口加性增到最大值后丢包,窗口乘性减,如此重复,稳态下每周期恰丢 1 1 1 个包,通过周期内总发送包数与丢包率关系联立可推解,写过太多篇,不再赘述。
CUBIC \text{CUBIC} CUBIC 作为 AIMD \text{AIMD} AIMD 变体,窗口从线性增长变为三次函数,替换窗口增长函数即可推导出吞吐公式,通过两者公式比对,一眼便可看出事实。
CUBIC \text{CUBIC} CUBIC 窗口 W W W 是时间 t t t 的三次函数:
W ( t ) = C ⋅ ( t − K ) 3 + W max W(t)=C\cdot (t-K)^3+W_{\text{max}} W(t)=C⋅(t−K)3+Wmax
其中 K K K 为窗口从 β W max \beta W_{\text{max}} βWmax 增长到 W max W_{\text{max}} Wmax 所需时间,代入 t = 0 t=0 t=0 可推出:
K = W max ⋅ ( 1 − β ) C 3 K=\sqrt3{\dfrac{W_{\text{max}} \cdot (1-\beta)}{C}} K=3CWmax⋅(1−β)
稳态下带宽固定, K K K 即一个拥塞周期时长。
瞬时速率可表示为 W ( t ) R T T \dfrac{W(t)}{RTT} RTTW(t),一个周期发送的总包数则为:
N = ∫ 0 K W ( t ) R T T d t N=\displaystyle\int_0^K \dfrac{W(t)}{RTT}\text{d}t N=∫0KRTTW(t)dt
稳态下每周期恰丢 1 1 1 包,丢包率 $p=\dfrac{1}{N},即:
1 p = 1 R T T ∫ 0 K W ( t ) d t ⋯ ( 1 ) \dfrac{1}{p}=\dfrac{1}{RTT} \displaystyle\int_0^K W(t)\text{d}t \quad\cdots(1) p1=RTT1∫0KW(t)dt⋯(1)
对 W ( t ) W(t) W(t) 在一周期内积分,结合 C K 3 = W max ( 1 − β ) ) CK^3=W_{\text{max}}(1-\beta)) CK3=Wmax(1−β)) 化简:
∫ 0 K W ( t ) d t = ∫ 0 K C ( t − K ) 3 + W max d t = − C K 4 4 + W max K = − W max ( 1 − β ) K 4 + W max K = W max K ⋅ 3 + β 4 \begin{aligned}\int_0^K W(t)\text{d}t &=\int_0^K \leftC(t-K)\^3+W_{\\text{max}} \\right\text{d}t\\&=-\dfrac{CK^4}{4} + W_{\text{max}}K\\&=-\dfrac{W_{\text{max}}(1-\beta)K}{4}+W_{\text{max}}K\\&=W_{\text{max}}K\cdot\dfrac{3+\beta}{4}\end{aligned} ∫0KW(t)dt=∫0KC(t−K)3+Wmaxdt=−4CK4+WmaxK=−4Wmax(1−β)K+WmaxK=WmaxK⋅43+β
因此周期平均窗口为:
W ‾ = 1 K ∫ 0 K c w n d ( t ) d t = W max ⋅ 3 + β 4 ⋯ ( 2 ) \overline{W} = \dfrac{1}{K} \displaystyle\int_0^K cwnd(t) dt = W_{\text{max}} \cdot \dfrac{3+\beta}{4} \quad\cdots (2) W=K1∫0Kcwnd(t)dt=Wmax⋅43+β⋯(2)
对比 AIMD \text{AIMD} AIMD 平均窗口 W ‾ = W max ⋅ 1 + β 2 \overline{W} = W_{\text{max}} \cdot \dfrac{1+\beta}{2} W=Wmax⋅21+β, CUBIC \text{CUBIC} CUBIC 三次函数增长先快后缓,大部分时间窗口更接近 W max W_{\text{max}} Wmax,因此平均窗口更大。
吞吐定义:
T = W ‾ R T T ⋯ ( 3 ) T=\dfrac{\overline{W}}{RTT} \quad\cdots (3) T=RTTW⋯(3)
将 ( 2 ) (2) (2) 代入 ( 1 ) (1) (1),结合 K K K 的表示 消去 W max , K W_{\text{max}},K Wmax,K,得:
T = ( C ⋅ ( 3 + β ) 4 ⋅ ( 1 − β ) ⋅ R T T ⋅ p 3 ) 1 / 4 T=\left(\dfrac{C \cdot (3+\beta)}{4 \cdot (1-\beta) \cdot RTT \cdot p^3} \right)^{1/4} T=(4⋅(1−β)⋅RTT⋅p3C⋅(3+β))1/4
忽略常量看趋势,同时写下 CUBIC \text{CUBIC} CUBIC 和 AIMD \text{AIMD} AIMD 做比对:
T CUBIC ∝ 1 R T T 1 / 4 ⋅ p 3 / 4 , T AIMD ∝ 1 R T T 1 ⋅ p 1 / 2 T_{\text{CUBIC}} \propto \dfrac{1}{RTT^{1/4} \cdot p^{3/4}}, \quad T_{\text{AIMD}} \propto \dfrac{1}{RTT^{1} \cdot p^{1/2}} TCUBIC∝RTT1/4⋅p3/41,TAIMD∝RTT1⋅p1/21
则一目了然,$\text{CUBIC} 吞吐与 R T T 1 / 4 RTT^{1/4} RTT1/4 成反比, R T T RTT RTT 敏感性更低,便更适合高速长距离网络。
结合平均窗口:
W ‾ CUBIC = W max ⋅ 3 + β 4 = 0.925 W max , W ‾ AIMD = W max ⋅ 1 + β 2 = 0.85 W max \overline{W}{\text{CUBIC}} = W{\max}\cdot\dfrac{3+\beta}{4}= 0.925W_{\max},\quad\overline{W}{\text{AIMD}}= W{\max}\cdot\dfrac{1+\beta}{2}=0.85W_{\max} WCUBIC=Wmax⋅43+β=0.925Wmax,WAIMD=Wmax⋅21+β=0.85Wmax
CUBIC \text{CUBIC} CUBIC 有 92.5 % 92.5\% 92.5% 的时间运行在接近满带宽状态,而标准 AIMD \text{AIMD} AIMD 只有 85 % 85\% 85%, CUBIC \text{CUBIC} CUBIC 链路利用率提升接近 10 % 10\% 10%。
再看 p p p 影响, T ∝ p − α T \propto p^{-\alpha} T∝p−α 中, α \alpha α 越大,相同 p p p 下吞吐更高, α CUBIC = 3 4 , α AIMD = 1 2 \alpha_{\text{CUBIC}}=\dfrac{3}{4},\alpha_{\text{AIMD}} = \dfrac{1}{2} αCUBIC=43,αAIMD=21,故 CUBIC \text{CUBIC} CUBIC 吞吐更高。
再看弹性,由于 W = k ⋅ p − α W = k \cdot p^{-\alpha} W=k⋅p−α,则 d W d p = k ⋅ ( − α ) p − α − 1 \dfrac{dW}{dp} = k \cdot (-\alpha)\, p^{-\alpha-1} dpdW=k⋅(−α)p−α−1,构造弹性定义,即相对变化之比:
ε = W 的相对变化 p 的相对变化 = d W / W d p / p \varepsilon=\dfrac{\text{W 的相对变化}}{\text{p 的相对变化}} = \dfrac{\text{d}W/W}{\text{d}p/p} ε=p 的相对变化W 的相对变化=dp/pdW/W
带入关系式:
ε = p k p − α ⋅ ( − α k p − α − 1 ) = p k p − α ⋅ ( − α k ) p − α − 1 = p 1 + α ⋅ ( − α ) p − α − 1 = − α \begin{aligned} \varepsilon &= \dfrac{p}{k p^{-\alpha}} \cdot \big(-\alpha\,k p^{-\alpha-1}\big) \\ &= \dfrac{p}{k p^{-\alpha}} \cdot (-\alpha k) p^{-\alpha-1} \\ &= p^{1+\alpha} \cdot (-\alpha) p^{-\alpha -1}\\ &= -\alpha \end{aligned} ε=kp−αp⋅(−αkp−α−1)=kp−αp⋅(−αk)p−α−1=p1+α⋅(−α)p−α−1=−α
故弹性为 − α -\alpha −α。
这意味着 CUBIC \text{CUBIC} CUBIC 丢包敏感性更高,丢包率小幅波动的时候, CUBIC \text{CUBIC} CUBIC 吞吐波动幅度更大。
评估敏感性,在低丢包链路,如骨干网,数据中心, CUBIC \text{CUBIC} CUBIC 具备优势, p − 3 / 4 p^{-3/4} p−3/4 带来巨大优势,填充高 BDP \text{BDP} BDP,这就是它替代 Reno-AIMD \text{Reno-AIMD} Reno-AIMD 的理由,但在随机丢包链路,如无线场景, CUBIC \text{CUBIC} CUBIC 的弹性过大,便失去了容错性。
CUBIC \text{CUBIC} CUBIC 选则更大的 α \alpha α,换取低丢包环境更高吞吐,代价是更容易被丢包扰动。但方向也很明确,即识别随机丢包并排除其影响,这就是我的另一个优化了,参见 区分丢包类型的 Reno-RNA。
CUBIC \text{CUBIC} CUBIC 是最好的端到端的,应用无关的通用拥塞控制算法,远胜 BBR \text{BBR} BBR,但总有人拿 iperf \text{iperf} iperf 测速说事,这本来就不对,但姑且如此,我说你把 CUBIC \text{CUBIC} CUBIC 操作点从崖点换到膝点试试,对方就听不懂了。
既然 loss-based \text{loss-based} loss-based,就总要丢点包,若改信号为时延达到目标,就能以一定点时延换取满载带宽,这样的 CUBIC \text{CUBIC} CUBIC 就是所有 capacity-seeking \text{capacity-seeking} capacity-seeking 算法的极致了。
就这么一环扣一环,证据确凿,非常明确的导出最后的合理优化方案,这才是一个做网络优化的工人应有的素质。
浙江温州皮鞋湿,下雨进水不会胖。