KCC:在 BBR 思路上的一次探索
KCC:在 BBR 思路上的一次探索
0. 算法与状态机
拥塞控制算法的身份由状态机界定。Tahoe/Reno、CUBIC、BBR 各有其独特的状态机。KCC 与 BBR 的关系类似 CUBIC 与 BIC——保留外层框架,替换/增加核心部件,形成独立算法。
KCC 保留 BBR 的四状态命名(STARTUP/DRAIN/PROBE_BW/PROBE_RTT),但做了两处关键改动:
- 用卡尔曼滤波器替代滑动窗口 min_rtt 估计;
- 新增ACK 聚合置信度状态机(四状态:IDLE→SUSPECTED→CONFIRMED→TRUSTED)。
同时,DRAIN 和 PROBE_RTT 从必须执行变为按需执行,由内层状态机驱动。
作者对 BBR 的开创性贡献保持敬意,KCC 仅是在其基础上的可行性探索。
1. BBR 状态机回顾
- DRAIN 和 PROBE_RTT必须执行(因为滑动窗口 min_rtt 需要排空才能得到真实值)
2. KCC 的两处改动
2.1 卡尔曼滤波器替代滑动窗口 min_rtt
建模:x k = x k − 1 + w k , w k ∼ N ( 0 , Q ) x_k = x_{k-1} + w_k,\; w_k\sim N(0,Q)xk=xk−1+wk,wk∼N(0,Q);z k = x k + v k , v k ∼ N ( 0 , R ) z_k = x_k + v_k,\; v_k\sim N(0,R)zk=xk+vk,vk∼N(0,R)
x xx:真实传播延迟,z zz:观测 RTT。
关键内部变量:x_est,p_est(协方差),sample_cnt,jitter_ewma,qdelay_avg,qboost_cdwn,consec_reject_cnt。
预测-更新:
// 预测-更新迭代p_est=p_est+Q;K=p_est/(p_est+R_dynamic);x_est=x_est+K*(rtt_sample-x_est);p_est=(1-K)*p_est;增益K KK的物理含义:R d y n a m i c R_{dynamic}Rdynamic放大 →K → 0 K\to0K→0→ 忽略被污染的 RTT 样本。
卡尔曼自身状态机:
- Converged 时通知外层:可跳过 DRAIN、抑制 PROBE_RTT。
- 连续异常拒绝超过 25 次强制接受,防止滤波器锁定。
2.2 ACK 聚合置信度状态机
BBR 无条件加extra_acked。KCC 用四状态评估信号可靠性:
enumkcc_agg_state{KCC_AGG_STATE_IDLE,// 总分 < 256KCC_AGG_STATE_SUSPECTED,// >=256KCC_AGG_STATE_CONFIRMED,// >=512KCC_AGG_STATE_TRUSTED,// >=768};评分四因子(每因子 256 分,总分 1024):
- 卡尔曼收敛(
p_est<500 && sample_cnt≥5) - 不在丢包恢复中
- 排队延迟低(RTT ≤ min_rtt + 2ms)
extra_acked稳定(≤ 窗口最大值的 1.5 倍)
行为:
- IDLE/SUSPECTED:不补偿 cwnd
- CONFIRMED/TRUSTED:补偿 cwnd,且动态放大卡尔曼R RR(最大 8 倍)
- 补偿持续超过 8 RTT → 降级到 SUSPECTED
- R RR缩放系数按比例平滑衰减:每轮 RTT 保留上一轮的 75%(即衰减掉 25% 的增量),约 4 轮回到基线
2.3 DRAIN 和 PROBE_RTT 变为按需
- DRAIN:卡尔曼收敛且
qdelay_avg < 1ms→ 跳过 DRAIN(转为额外 cruise) - PROBE_RTT:卡尔曼健康(
p_est ≤ 250000)→ 完全抑制;仅发散时触发一次作为安全网
3. BBR vs KCC 对比
| 特性 | BBR | KCC |
|---|---|---|
| RTT 估计器 | 滑动窗口最小值(无状态) | 卡尔曼滤波(有状态,输出置信度) |
| 额外状态机 | 无 | ACK 聚合置信度四状态 |
| DRAIN 必须 | 是 | 否(条件跳过) |
| PROBE_RTT 必须 | 是(固定10s) | 健康时抑制,发散时按需 |
| 路径变化检测 | 依赖 PROBE_RTT(~10s) | Q-Boost(几个RTT) |
| ACK 聚合补偿 | 无条件加 cwnd | 置信度门控 + 动态缩放 R |
| 异常值处理 | 无 | 动态阈值 + 连续拒绝保护 |
| R 平滑衰减 | 无 | 每轮保留75%,约4轮恢复 |
4. 定位
KCC 与 BBR 的关系,类似 CUBIC 与 BIC:继承外层框架,替换核心估计器,形成独立算法。因此可称为K‑BBR或BBR‑K。
在模型驱动这一纯粹路线上,KCC 延续了 BBR 的思想——用带宽和延迟直接驱动,而非堆砌规则。它与 Google BBRv2 的路线不同:后者引入大量硬性阈值(ECN、丢包率等),走向规则堆砌;KCC 则坚持用现代控制论(卡尔曼滤波、置信度评估)升级估计工具,保持模型的简洁与可解释性。
这是一种理想方向的探索,并不声称拥有 “BBR‑2” 的命名权。
GitHub: TCP KCC
