BBR与KCC发送速率调节机制

发布时间:2026/6/28 4:17:37
BBR与KCC发送速率调节机制 BBR与KCC发送速率调节机制0. 问题界定拥塞控制算法的核心输出只有两个变量Pacing Rate物理发送速率和CWND逻辑拥塞窗口。本文通过源码和可视化图表剖析 BBR 与 KCC 在决定下一时刻该发多快时的核心逻辑。1. BBR的速率调节增益表 inflight门控BBR 在PROBE_BW稳态探测阶段速率调节依赖一个硬编码的 8 拍增益表bbr_pacing_gain[] {1.25, 0.75, 1,1,1,1,1,1}。它通过 inflight在途字节数判断是否超越物理 BDP但不直接测量排队延迟。1.1 BBR的增益控制流程Phase 0Phase 1Phase 2-7是否是否是否PROBE_BW 周期开始时钟触发 cycle_idx 切换pacing_gain 1.25x (盲测)pacing_gain 0.75x (盲排)pacing_gain 1.0x (巡航)满 1 个 min_rttAND (丢包 OR inflight probe_target)继续当前 probe 增益满 1 个 min_rttOR inflight 1x target继续当前 drain 增益满 1 个 min_rtt?继续当前 cruise 增益关键点Probe1.25x需要同时满足至少 1 个 min_rtt和丢包或 inflight 达标方可退出Drain0.75x可通过inflight ≤ BDP立即短路退出||条件无需等满 1 个 min_rttCruise1.0x仅由时钟驱动必须完成 1 个 min_rtt 才可切换至下一相位1.2 BBR的数学本质开环增益调度BBR 不直接测量T_queue。它写死了 8 个固定增益靠 inflight 门控探测与排空辅以丢包/延迟后的被动 TCP 窗口回缩。这在控制论中被归类为开环Open-loop预测控制。2. KCC的速率调节排队测量驱动的闭环修正KCC 将 BBR 的固定 8 拍增益表扩展为 256 槽位KCC_GAIN_SLOTS 256每槽对应 1 个 RTT 时的增益。默认配置下增益表结构为phase 0 1.25x探测phase 1 0.75x排空phase 2~(cycle_len-1) 1.0x巡航该模式按cycle_len默认 8在整个 256 槽表中重复。KCC 引入卡尔曼滤波器实时估计 T_prop传播延迟从qdelay max(0, RTT_obs − x_est_us)派生瞬时排队延迟通过 EWMA默认权重 7/8平滑为qdelay_avg。速率调节由此变成了受排队测量驱动的自适应边界追踪。2.1 KCC的线性增益衰减KCC 在探测阶段不盲目执行 1.25x 增益而是通过排队qdelay和抖动jitter两项线性且顺序衰减来计算最终增益。衰减仅作用于增益表相位大于 1.0xBBR_UNIT的相位衰减公式: gain max(1.0, probe_gain − conf·min(r_q, max_red) − conf·min(r_j, max_red) 顺序扣除)进入 1.0x 的增益表相位(decay_mask 位已置位)基础增益 kcc_cycle_gain_table[idx]计算卡尔曼置信度conf_scale (p_max − p_est) × BBR_UNIT / (p_max − converged_val)未收敛时 conf_scale BBR_UNIT (衰减折扣)qdelay 衰减 (预算 max_red):扣除 min((qdelay_avg − kcc_cong_thresh) × BBR_UNIT / qscale, max_red)缩放 conf_scale 后从 base_gain 及 max_red 中扣除jitter 衰减 (剩余预算):当 max_red 0 时, 扣除 min((jitter_ewma − kcc_cong_thresh) × BBR_UNIT / jscale, max_red)缩放 conf_scale 后从 base_gain 中扣除base_gain 地板 BBR_UNIT (1.0x)不会跌破巡航水平α BBR_UNIT / qscale (默认 256/20000 ≈ 0.0128/μs)β BBR_UNIT / jscale (默认 256/16000 ≈ 0.016/μs)qdelay 和 jitter 共用同一阈值 kcc_cong_thresh关键点非二值开关而是线性比例衰减r_q ∝ (qdelay_avg − T_cong)r_j ∝ (jitter − T_cong)顺序扣除而非求和qdelay 先消耗预算max_redjitter 再消耗余量两者各自独立 clamped 在可用预算内不是min(∑, max_red)卡尔曼置信度缩放当p_est converged_val未收敛conf_scale BBR_UNIT衰减效果打折——滤波器不确定时不去轻易压制探测增益增益绝不会跌破 BBR_UNIT1.0x即排队再严重也不会把探测降穿到巡航水平2.2 KCC的Drain-Skip机制当 KCC 周期轮转到0.75x排空阶段时可在条件满足时直接将排空转为巡航“drain-skip”避免无效的吞吐断崖是否Drain-Skip 三个必要条件① 卡尔曼已收敛: p_est converged_val② 排队低于清洁阈值: qdelay_avg kcc_clean_thresh③ 最低驻留: delta min_rtt / 8进入 0.75x 排空阶段等待最低驻留时间delta min_rtt 3 (min_rtt/8, 防抖动)全部三个条件?转换为 1.0x 巡航(drain-skip 激活)继续执行 KCC 排空门控(AND-gate: is_full_length drained, 4×min_rtt 安全超时)与 BBR 的关键差异BBR 排空使用OR-gateis_full_length || inflight ≤ BDPinflight 达标即可立即退出KCC 排空使用AND-gateis_full_length drained必须同时满足满 1 RTT和inflight ≤ BDP才能退出另加 4×min_rtt 安全超时这是对 BBRv1 过早退出排空的修复KCC 的 drain-skip 在 AND-gate 之上提供了一条额外的提前退出路径当卡尔曼收敛且排队低于清洁阈值时绕开 AND-gate 直接将排空转为巡航2.3 KCC 与 BBR 控制回路的本质差异本质差异KCC: 排队测量驱导qdelay高qdelay低 已收敛RTT采样卡尔曼(估计T_prop)qdelay RTT − x_estEWMA → qdelay_avg线性衰减 卡尔曼置信缩放floor 1.0xdrain-skip 跳过排空发送速率物理网络缓冲BBR: 增益调度 inflight 门控丢包/延迟节拍驱动cycle_idx 索引bbr_pacing_gain[]发送速率物理网络缓冲被动TCP降窗增益调度 vs 排队测量驱导3. 辅助速率调节机制3.1 PROBE_RTT 机制两种算法都设有 PROBE_RTT 模式以极低的 pacing_gain~0.5x BDP持续 200ms强制清空缓冲以测量真实 min_rtt。BBR每 10 秒固定触发一次无论路径是否需要。这会产生周期性的吞吐量断崖。KCC引入kcc_probe_rtt_decouple默认开启——当卡尔曼滤波器健康p_est ≤ recal_thresh时跳过不必要的 PROBE_RTT仅在工作状态恶化时才触发。这消除了 BBR 的周期性吞吐断崖。3.2 ECN 退避与 CWND 增益约束KCC 在排队压力下同时从两个维度收缩ECN 退避kcc_ecn_backoff()检测 ECN 标记后通过factor (1 − ECN_ratio) × BBR_UNIT降低cwnd_gain逻辑上相当于在排队超出阈值时收窄拥塞窗口的上限CWND 排队约束kcc_apply_cwnd_constraints()在qdelay_avg超过拥塞阈值且不在 PROBE_BW 模式时缩减cwnd_gain至更保守的水平这两项机制确保 KCC 在 CWND 维度上同样对排队做出响应而非仅依赖 pacing_gain。3.3 算法对比总表维度BBRtcp_bbr.cKCCtcp_kcc.c增益表固定 8 拍{1.25, 0.75, 1×6}默认 256 槽pattern 重复默认cycle_len8匹配 BBR探测衰减 (probe)不衰减逼满执行 1.25xqdelay/jitter线性衰减 卡尔曼置信度缩放floor 1.0x排空退出 (drain)OR-gateis_full_length || inflight ≤ BDPAND-gateis_full_length drained 4 RTT 超时排空跳跃 (drain-skip)无卡尔曼收敛 qdelay clean_thresh min_rtt/8 驻留 → 跳过排空PROBE_RTT每 10s 强制触发卡尔曼健康时跳过仅异常时触发ECN / CWND 约束无 ECN 响应ECN 退避降低 cwnd_gainqdelay 超标时同时压缩 cwnd_gain4. 结论BBR 的速率调节是增益表 inflight 门控bbr_pacing_gain[]提供固定节拍probe 盲目冲高 (25%)drain 通过 inflight 短路退出不直接感知排队深度。KCC 将 BBR 的框架重构为三层叠加增益表扩展从 8 拍固定数组到 256 槽可配置表保留 BBR 兼容默认值线性排队衰减gain max(1.0, probe − conf·min(r_q, budget) − conf·min(r_j, budget))qdelay 和 jitter 先后消耗预算衰减受卡尔曼置信度比例缩放卡尔曼收敛门控drain-skip 在 AND-gate 排空之上增加提前跳跃路径PROBE_RTT 在链路健康时可跳过ECN/CWND 约束在 qdelay 超标时同步收窄差异的本质BBR 在固定节拍和 inflight 门控内寻找边界KCC 在每个节拍上叠加排队测量的自适应修正——线性衰减非二值、顺序消耗预算非求和、置信度缩放非全量门控。