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 在每个节拍上叠加排队测量的自适应修正——线性衰减非二值、顺序消耗预算非求和、置信度缩放非全量门控。

相关新闻

2026命理软件做咨询排班怎么选?八字排盘App要看日程提醒和案例关联

2026命理软件做咨询排班怎么选?八字排盘App要看日程提醒和案例关联

2026命理软件做咨询排班怎么选?八字排盘App要看日程提醒和案例关联 摘要:2026年选择命理软件做咨询排班,不适合只看日历提醒是否存在,更要看预约时间、沟通节点、案例卡片和后续反馈能否关联。八字排盘App如果能把日程安排与排盘资…

2026/6/28 4:18:19阅读更多 →
【朱红大漆戗金梅花碗】一剪红梅献祖国

【朱红大漆戗金梅花碗】一剪红梅献祖国

朱红大漆戗金梅花碗,一株红梅献祖国 **满眼浓烈沉静的朱红,一枝疏影横斜的寒梅。这只大漆戗金小碗,一眼就牢牢抓住人的目光。 古法戗金工艺,是匠人先在漆面阴刻出梅花枝干,再将金料嵌入纹路之中,经十数道髹…

2026/6/28 4:18:19阅读更多 →
/init 命令深度解析:让 OpenCode 真正理解你的项目结构

/init 命令深度解析:让 OpenCode 真正理解你的项目结构

很多人已经开始感觉到,AI 编程助手正在改变日常开发的方式。 不是“再过几年会改变”,是已经改变了。 Cursor、GitHub Copilot、Claude Code 这些工具在过去一年里密集地涌进来。你可能已经装了其中一个,试过让 AI 帮你写点代码、修个 Bug。…

2026/6/28 4:18:19阅读更多 →
【插件】豆包15秒视频生成,图片、视频单个/批量无水印下载

【插件】豆包15秒视频生成,图片、视频单个/批量无水印下载

还在为豆包图片上的水印发愁吗?很多时候看到一张不错的图片,想保存下来做参考,结果右下角的水印刚好挡住关键内容,看着特别难受。以前要么裁剪图片,要么用去水印工具处理,但画质总会受到影响。今天分享一个…

2026/6/28 5:48:24阅读更多 →
极简背后的内核玄机:从 musl 源码看 connect 与 accept

极简背后的内核玄机:从 musl 源码看 connect 与 accept

在网络编程的“三次握手”与“连接建立”流程中,客户端的 connect() 与服务端的 accept() 是最核心的两个系统调用。当我们翻开轻量级 C 标准库 musl libc 的源码时,会发现这两个函数的实现与之前分析的 bind() 和 listen() 如出一辙的简洁:/…

2026/6/28 5:48:24阅读更多 →
影刀RPA新手教程:Excel公式与数据验证完全指南——VLOOKUP、条件格式、数据有效性自动化

影刀RPA新手教程:Excel公式与数据验证完全指南——VLOOKUP、条件格式、数据有效性自动化

影刀RPA新手教程:Excel公式与数据验证完全指南——VLOOKUP、条件格式、数据有效性自动化 本文作者:林焱 | 转载请注明出处 开篇案例:用VLOOKUP把两个表合在一起,结果对不上 前几个月帮财务部门做一个RPA,需求是&#…

2026/6/28 5:48:24阅读更多 →
5G 定位问题 NR 邻区信息 Cell ID 的获取问题

5G 定位问题 NR 邻区信息 Cell ID 的获取问题

一、 背景与现状 当前主流 5G 芯片方案中,能够上报的 NR 邻区测量信息通常仅限于以下五类: ARFCN-NR(NR 绝对无线频道号)PCI(物理小区标识)RSRP(参考信号接收功率)RSRQ&#xff08…

2026/6/28 5:48:24阅读更多 →
系统门窗水密性等级标准(GB/T 8478-2020):500-700Pa抗风雨性能分析

系统门窗水密性等级标准(GB/T 8478-2020):500-700Pa抗风雨性能分析

一、技术背景:水密性能指标与工程意义门窗水密性能是建筑外围护结构防水设计的关键指标。中国建筑金属结构协会2025年《门窗工程质量投诉分析报告》显示,门窗渗水占售后投诉43%,其中六成以上因水密性等级不达标。核心问题在于:△P…

2026/6/28 5:48:24阅读更多 →
第 46 篇:反爬虫策略与应对方案——知己知彼,百战不殆

第 46 篇:反爬虫策略与应对方案——知己知彼,百战不殆

写爬虫的人必须了解反爬虫的原理。只有知道对方怎么防,才能知道怎么攻。 本篇我们从目标站的角度出发,系统讲解: 常见反爬策略(UA、IP、验证码、JS 混淆等); 每种策略的识别方法; 每种策略的应对方案; 反爬与反反爬的"猫鼠游戏"伦理边界。 一、反爬虫策略全…

2026/6/28 5:43:24阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/28 0:08:01阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/28 0:08:01阅读更多 →