KCC:在 BBR 思路上的一次探索

KCC:在 BBR 思路上的一次探索

0. 算法与状态机

拥塞控制算法的身份由状态机界定。Tahoe/Reno、CUBIC、BBR 各有其独特的状态机。KCC 与 BBR 的关系类似 CUBIC 与 BIC------保留外层框架,替换/增加核心部件,形成独立算法。

KCC 保留 BBR 的四状态命名(STARTUP/DRAIN/PROBE_BW/PROBE_RTT),但做了两处关键改动:

  1. 卡尔曼滤波器替代滑动窗口 min_rtt 估计;
  2. 新增 ACK 聚合置信度状态机(四状态:IDLE→SUSPECTED→CONFIRMED→TRUSTED)。

同时,DRAIN 和 PROBE_RTT 从必须执行 变为按需执行,由内层状态机驱动。

作者对 BBR 的开创性贡献保持敬意,KCC 仅是在其基础上的可行性探索。


1. BBR 状态机回顾

#mermaid-svg-VpFIiN6y8UfxyT3p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VpFIiN6y8UfxyT3p .error-icon{fill:#552222;}#mermaid-svg-VpFIiN6y8UfxyT3p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VpFIiN6y8UfxyT3p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VpFIiN6y8UfxyT3p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p .marker.cross{stroke:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VpFIiN6y8UfxyT3p p{margin:0;}#mermaid-svg-VpFIiN6y8UfxyT3p defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-VpFIiN6y8UfxyT3p g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-VpFIiN6y8UfxyT3p g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-VpFIiN6y8UfxyT3p g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-VpFIiN6y8UfxyT3p g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-VpFIiN6y8UfxyT3p .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-VpFIiN6y8UfxyT3p .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VpFIiN6y8UfxyT3p .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-VpFIiN6y8UfxyT3p .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-VpFIiN6y8UfxyT3p .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-VpFIiN6y8UfxyT3p .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VpFIiN6y8UfxyT3p .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VpFIiN6y8UfxyT3p .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VpFIiN6y8UfxyT3p .edgeLabel .label text{fill:#333;}#mermaid-svg-VpFIiN6y8UfxyT3p .label div .edgeLabel{color:#333;}#mermaid-svg-VpFIiN6y8UfxyT3p .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-VpFIiN6y8UfxyT3p .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-VpFIiN6y8UfxyT3p .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-VpFIiN6y8UfxyT3p .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p #statediagram-barbEnd{fill:#333333;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VpFIiN6y8UfxyT3p .cluster-label,#mermaid-svg-VpFIiN6y8UfxyT3p .nodeLabel{color:#131300;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-VpFIiN6y8UfxyT3p .note-edge{stroke-dasharray:5;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-note text{fill:black;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram-note .nodeLabel{color:black;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagram .edgeLabel{color:red;}#mermaid-svg-VpFIiN6y8UfxyT3p #dependencyStart,#mermaid-svg-VpFIiN6y8UfxyT3p #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-VpFIiN6y8UfxyT3p .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VpFIiN6y8UfxyT3p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} full_bw_reached
inflight ≤ BDP
10s无min_rtt更新
200ms后
STARTUP
DRAIN
PROBE_BW
PROBE_RTT

  • 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 x x:真实传播延迟, z z z:观测 RTT。

关键内部变量x_est, p_est(协方差), sample_cnt, jitter_ewma, qdelay_avg, qboost_cdwn, consec_reject_cnt

预测-更新

c 复制代码
// 预测-更新迭代
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 K K 的物理含义 : R d y n a m i c R_{dynamic} Rdynamic 放大 → K → 0 K\to0 K→0 → 忽略被污染的 RTT 样本。

卡尔曼自身状态机
#mermaid-svg-OpF0k73AhgnzvYr7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OpF0k73AhgnzvYr7 .error-icon{fill:#552222;}#mermaid-svg-OpF0k73AhgnzvYr7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OpF0k73AhgnzvYr7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OpF0k73AhgnzvYr7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 .marker.cross{stroke:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OpF0k73AhgnzvYr7 p{margin:0;}#mermaid-svg-OpF0k73AhgnzvYr7 defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-OpF0k73AhgnzvYr7 g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-OpF0k73AhgnzvYr7 g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-OpF0k73AhgnzvYr7 g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-OpF0k73AhgnzvYr7 g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-OpF0k73AhgnzvYr7 .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-OpF0k73AhgnzvYr7 .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-OpF0k73AhgnzvYr7 .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-OpF0k73AhgnzvYr7 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-OpF0k73AhgnzvYr7 .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-OpF0k73AhgnzvYr7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OpF0k73AhgnzvYr7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OpF0k73AhgnzvYr7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OpF0k73AhgnzvYr7 .edgeLabel .label text{fill:#333;}#mermaid-svg-OpF0k73AhgnzvYr7 .label div .edgeLabel{color:#333;}#mermaid-svg-OpF0k73AhgnzvYr7 .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-OpF0k73AhgnzvYr7 .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-OpF0k73AhgnzvYr7 .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-OpF0k73AhgnzvYr7 .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 #statediagram-barbEnd{fill:#333333;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OpF0k73AhgnzvYr7 .cluster-label,#mermaid-svg-OpF0k73AhgnzvYr7 .nodeLabel{color:#131300;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-OpF0k73AhgnzvYr7 .note-edge{stroke-dasharray:5;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-note text{fill:black;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram-note .nodeLabel{color:black;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagram .edgeLabel{color:red;}#mermaid-svg-OpF0k73AhgnzvYr7 #dependencyStart,#mermaid-svg-OpF0k73AhgnzvYr7 #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-OpF0k73AhgnzvYr7 .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OpF0k73AhgnzvYr7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 首RTT
p_est < 500
|rtt_sample - x_est| > 4ms && cdwn==0
重置p_est, cdwn=15
p_est > 250000
触发PROBE_RTT安全网
ColdStart
CatchUp
Converged
QBoost
Diverged

  • Converged 时通知外层:可跳过 DRAIN、抑制 PROBE_RTT。
  • 连续异常拒绝超过 25 次强制接受,防止滤波器锁定。

2.2 ACK 聚合置信度状态机

BBR 无条件加 extra_acked。KCC 用四状态评估信号可靠性:

c 复制代码
enum kcc_agg_state {
    KCC_AGG_STATE_IDLE,       // 总分 < 256
    KCC_AGG_STATE_SUSPECTED,  // >=256
    KCC_AGG_STATE_CONFIRMED,  // >=512
    KCC_AGG_STATE_TRUSTED,    // >=768
};

评分四因子(每因子 256 分,总分 1024):

  1. 卡尔曼收敛(p_est<500 && sample_cnt≥5
  2. 不在丢包恢复中
  3. 排队延迟低(RTT ≤ min_rtt + 2ms)
  4. extra_acked 稳定(≤ 窗口最大值的 1.5 倍)

行为

  • IDLE/SUSPECTED:不补偿 cwnd
  • CONFIRMED/TRUSTED:补偿 cwnd,且动态放大卡尔曼 R R R(最大 8 倍)
  • 补偿持续超过 8 RTT → 降级到 SUSPECTED
  • R R R 缩放系数向基线平滑回归:每轮 RTT 只衰减超出基线部分的 25%(即保留超出部分的 75%),约 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 平滑回归 每轮向基线回归 25% 的差距

4. 定位

KCC 与 BBR 的关系,类似 CUBIC 与 BIC:继承外层框架,替换核心估计器,形成独立算法。因此可称为 K‑BBRBBR‑K

在模型驱动这一纯粹路线上,KCC 延续了 BBR 的思想------用带宽和延迟直接驱动,而非堆砌规则。它与 Google BBRv2 的路线不同:后者引入大量硬性阈值(ECN、丢包率等),走向规则堆砌;KCC 则坚持用现代控制论(卡尔曼滤波、置信度评估)升级估计工具,保持模型的简洁与可解释性。

这是一种理想方向的探索,并不声称拥有 "BBR‑2" 的命名权。


GitHub : TCP KCC

相关推荐
benben04441 分钟前
强化学习之DQN算法族(基于gymnasium开发)
算法
何以解忧,唯有..2 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
网络研究院2 小时前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智2 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest2 小时前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_2 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
想吃火锅10053 小时前
【leetcode】88.合并两个有序数组js
算法
2601_961845153 小时前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序猿阿伟3 小时前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome