TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法

TCP UCP:基于卡尔曼滤波的BBR增强型拥塞控制算法

输出
控制层
置信度 p_est
测量层
输入
x_est
p_est
p_est
p_est
qdelay_avg, jitter_ewma
qdelay_avg
ACK 到达

rate_sample
滑动窗口

最大带宽估计
卡尔曼滤波器

传播延迟估计
LT 带宽估计

丢包触发
ECN EWMA

标记率跟踪
ACK 聚合

置信度评估
误差协方差 p_est
增益衰减

qdelay + jitter
动态 PROBE_RTT 间隔
排水跳过
ECN 退避
AGG cwnd 补偿
发送速率

sk_pacing_rate
拥塞窗口

snd_cwnd

摘要

TCP UCP(Universal Communication Protocol)是一个Linux内核发送端拥塞控制模块,v1.0约5500行C代码。算法继承BBRv1状态机框架(Cardwell et al., 2016),将测量层重构为单状态卡尔曼滤波器(Kalman, 1960),并结合协方差匹配(Welch & Bishop, 2006)实现自适应噪声估计。

UCP与BBR-S(2021)共享"卡尔曼滤波替代滑动窗口"这一方向性理念,但两者的数学模型、噪声建模方法、异常值处理机制和置信度利用策略均完全不同。压力测试表明,默认参数下UCP在约20%出站丢包率时可维持接近链路标称带宽的吞吐量;超出此范围后性能下降,但可通过调整sysctl或模块参数深度调优,研究人员可自行情景测试复现


1. 问题陈述:BBRv1测量层缺陷

BBRv1的核心测量管线由两个滑动窗口组成:

  • 最大带宽估计minmax_running_max窗口(默认10个RTT),取窗口内即时带宽最大值。
  • 最小RTT估计:固定10秒窗口内的RTT最小值,作为传播延迟的近似。

滑动窗口取最小值在理论上等价于假设传播延迟时不变。在高抖动、高丢包路径上,三个问题同时暴露:

  1. 样本污染:随机丢包引发的超时重传(RTO)产生异常RTT尖峰。窗口无信号处理能力,最小值被直接污染,直到该样本滑出窗口(10秒后)。
  2. 响应迟钝:窗口长度固定,路径改善后需等旧样本全部过期。
  3. 缺乏置信度 :算法不知道当前min_rtt估计有多可靠,无法据此调整探测策略。

BBR-S(2021)在学术界首次提出用卡尔曼滤波器替代滑动窗口的理论框架。UCP借鉴了这一方向性思路,但两者在数学模型上完全不同:BBR-S使用带自适应遗忘因子的ATKF,侧重于收敛性证明;UCP使用单状态标量卡尔曼滤波器,侧重于噪声自适应、异常值门控和置信度驱动的控制增强。


2. 方法论:单状态卡尔曼滤波器

2.1 状态空间模型

UCP将真实传播延迟建模为随机游走过程:

复制代码
状态方程:  x[k] = x[k-1] + w,   w ~ N(0, Q)
观测方程:  z[k] = x[k] + v,     v ~ N(0, R)

其中:

  • x:真实传播延迟(定点单位:us × scale,默认 scale = 1024)
  • z:观测RTT(rtt_us × scale
  • Q:过程噪声协方差(自适应)
  • R:测量噪声协方差(自适应)

2.2 递推更新(定点整数运算)

标准卡尔曼递推,所有运算在定点整数域完成:

复制代码
预测步:
  x_pred = x_est                    (恒等状态转移)
  p_pred = p_est + Q                (协方差预测)

更新步:
  innov = z - x_pred                (创新值)
  K = p_pred / (p_pred + R)         (卡尔曼增益,有理数实现)
  x_est = x_pred + K × innov        (状态更新)
  p_est = (1 - K) × p_pred          (协方差更新)

卡尔曼增益 K 以 gain_num / gain_den 有理数形式实现,避免浮点。p_est 下限 p_est_floor(默认10),上限 p_est_max(默认1,000,000)。

2.3 自适应噪声建模

自适应 Q(过程噪声)

复制代码
Q = Q_base × max(q_min_factor, min_rtt_us / q_rtt_div)
Q = min(Q, Q_base × q_scale_cap)
Q = min(Q, Q_max)

逻辑:长路径上的随机游走方差更大,Q需按 min_rtt_us / 1000 比例放大。双重上限防止极端参数配置导致Q失控。

自适应 R(测量噪声)

复制代码
R_boost = max(0, jitter - jr_thresh) × R_base / jr_scale
R_cap   = R_base × R_max_boost      (默认8倍)
R       = R_base + min(R_boost, R_cap)

逻辑:抖动增大时提升R,降低滤波器对测量值的信任。R_max_boost 上限防止在持续高抖动路径上卡尔曼增益冻结。

2.4 协方差匹配噪声估计

基于Welch & Bishop (2006)的协方差匹配方法,在线估计Q和R:

复制代码
q_est = (1-α) × q_est + α × (K × innov)^2 / S^2
r_est = (1-β) × r_est + β × max(0, innov^2/S^2 - p_pred)

学习率 α、β 默认 0.1。最终 Q/R 可取启发式估计与协方差匹配估计的最大值(默认模式1),或加权平均(模式2),或仅启发式(模式0)。

2.5 异常值门控与防锁定

动态异常值阈值:

复制代码
dyn_thresh = max(outlier_ms × 1000 × scale,
                 jitter_ewma × outlier_jitter_mult × scale)

|innov| > dyn_threshp_pred ≤ p_converged(滤波器置信度高)时,样本被拒绝。拒绝时只更新 jitter_ewma 用于阈值动态,不更新 x_estp_est

防锁定机制 :连续拒绝 max_consec_reject 次(默认25)后强制接受。否则会形成正反馈------异常值→高抖动→高阈值→更多异常值------导致滤波器永久冻结。

2.6 Q-Boost路径变化恢复

|innov| > q_boost_thresh(默认约4ms RTT偏移)时:

  • p_est 重置为 p_est_init,使卡尔曼增益趋向1.0
  • 同时绕过异常值门控(路径变化产生的大创新不是噪声)

效果:在路径变化(路由切换、移动性事件)后1-2个RTT内快速重收敛。


3. 基于置信度的控制增强

卡尔曼滤波器输出误差协方差 p_est 作为置信度指标。UCP围绕 p_est 构建了三个自适应机制:

3.1 增益衰减

在PROBE_BW探测相位(pacing_gain > 1.0x),基于排队延迟和抖动衰减探测增益:

复制代码
qdelay_decay = min(max(0, qdelay_avg - qthresh) × BBR_UNIT / qscale, max_red)
jitter_decay = min(max(0, jitter_ewma - jthresh) × BBR_UNIT / jscale, remaining)
effective_gain = max(probe_gain - qdelay_decay - jitter_decay, BBR_UNIT)

衰减量受置信度缩放:当 p_est > p_converged 时,滤波器对qdelay估计不信任,衰减量按比例减小。

3.2 动态PROBE_RTT间隔

p_est 映射为PROBE_RTT间隔:

p_est 范围 间隔
≤ p_floor 2.5 × dyn_max(默认75s)
(p_floor, p_converged] 线性插值 2.5× → 1×
(p_converged, band) 线性插值 1× → base
≥ band base(默认10s)

效果:高置信度路径上PROBE_RTT性能代价降低约87.5%。

3.3 排水跳过

在排空相位,若卡尔曼已收敛且 qdelay_avg < drain_skip_qdelay_us(默认1000µs),判定路径无队列,跳过排空,转换为额外巡航相位。干净路径上增加约12.5%带宽利用率。


4. LT带宽估计与自动恢复

丢包事件触发LT(长时)带宽估计。与BBR的简单平均不同,UCP使用EMA平滑:

复制代码
lt_bw = (bw_new × ema_num + lt_bw × (ema_den - ema_num)) / ema_den

新估计需通过一致性检验(相对容差12.5%或绝对容差500 bytes/s),才能平滑更新并激活 lt_use_bw

自动恢复 :当 max_bw > lt_bw × 1.25 持续3个连续ACK时,自动退出LT模式。


5. ACK聚合置信度评估

四因子评分,各贡献256分,满分1024:

因子 条件 逻辑
1 卡尔曼收敛 + 样本充足 估计可靠
2 CA状态 < Recovery 非真实拥塞
3 卡尔曼RTT ≤ min_rtt + 2ms 无队列堆积
4 extra_acked ≤ max × 1.5 非瞬态尖峰

置信度 ≥ 512进入CONFIRMED状态后启用cwnd补偿,但连续补偿超8个RTT触发看门狗降级。聚合信号同时用于缩放卡尔曼R噪声(即时上升,迟滞衰减)。


6. 工程实现

6.1 内存管理

内核CA模块仅有104字节(ICSK_CA_PRIV_SIZE)私有空间。UCP采用双结构体:struct ucp紧凑打包在位域内,struct ucp_ext堆分配存放卡尔曼状态、ECN EWMA等。ext分配失败时优雅降级为纯滑动窗口行为,不导致连接失败。

6.2 多版本兼容

约80行条件编译宏覆盖4.x至7.x内核API变更,包括BTF/kfunc注册宏三次重命名、随机数函数重命名、缺失函数的回退实现。

6.3 可调参数

通过 /proc/sys/net/ucp/ 暴露100+可调参数,包括卡尔曼Q/R、异常值阈值、增益衰减因子、LT带宽恢复阈值等。写入触发 ucp_init_module_params() 重新夹紧并计算派生值。


7. 测试

环境 :中国香港 GSL/Lumen 1Gbps 共享KVM VPS → 成都移动 1Gbps 家宽(跨境直连,自带背景丢包)。人工注入出站随机丢包(iptables -A OUTPUT -m statistic --mode random --probability X -j DROP)。

注入丢包率 估计真实丢包率 UCP吞吐量
10% ~10%-13% 接近满速
15% ~15%-18% 高吞吐,低RETR
20% ~20%-23% 900-1000Mbps,低RETR
30% ~30%-33% 部分流饿死,存活流合计450-500Mbps

标注

  • 默认参数下,UCP在约20%出站丢包率范围内可有效抑制,维持高吞吐和低重传。
  • 超出20%后性能下降,但可通过调整sysctl或模块参数深度调优来改善。作者明确指出"多数通用情景并不需要单独调优,数学模型可自行工作"。
  • 30%注入丢包下部分流饿死是任何基于ACK反馈的发送端CC算法在信息反馈严重不足时的物理极限,但存活流仍高效利用剩余带宽,呈优雅退化。

8. 与相关工作的关系

  • BBRplus :UCP借鉴其ACK聚合"量化思路",但不采用其直接将 extra_acked 加入cwnd的控制逻辑。UCP将量化结果用于增强卡尔曼滤波器的抗噪能力,可动态回退。
  • BBR-S(2021):共享"卡尔曼滤波替代滑动窗口"这一方向性理念。UCP的数学模型(单状态标量滤波器 + 协方差匹配 + Q-Boost + 异常值门控 + 置信度驱动控制)与BBR-S的ATKF方案完全不同,且UCP是完整的工程实现而非研究原型。

9. 标注

TCP UCP通过用单状态卡尔曼滤波器替换BBRv1的滑动窗口测量层,解决了其在高抖动、高丢包场景下的核心缺陷。误差协方差 p_est 作为置信度指标,统一驱动增益衰减、PROBE_RTT间隔调整和排水跳过,形成高度内聚的自适应控制系统。

UCP代表了BBR家族"测量层现代化"路线的独立工程实现。其数学模型、噪声建模方法和置信度利用策略与BBR-S完全不同。在默认参数下,UCP可有效抑制约20%出站丢包率,超出此范围后可通过深度调优内核参数进一步控制。


参考文献

相关推荐
LCG元2 小时前
RAG - 大模型检索增强生成深度解析:本地知识库 / 企业级落地优化配置
人工智能·算法
龙佚2 小时前
RTC语音质量优化实战:搭建完整语音系统
算法·架构
过期动态2 小时前
【LeetCode 热题 100】字母异位分组
java·算法·leetcode·职场和发展·哈希算法
Cthy_hy2 小时前
Python 算法竞赛:数学核心知识点全总结
python·算法
驭渊的小故事2 小时前
多线程01(线程状态和线程的sleep,线程终止(Interrupt)的小关联)
java·jvm·算法
tianrun12343 小时前
Ubuntu 24.04 安装 Fcitx5 + Rime + 搜狗词库(替代 IBus 与 Linux 搜狗输入法)
linux·运维·ubuntu
咩咦3 小时前
C++学习笔记26:static 静态成员
c++·学习笔记·static·静态成员变量·静态成员·静态成员函数
fortydusk3 小时前
3DMark v2.32.8426 专业授权版|专业显卡跑分工具
网络
秋落风声3 小时前
内存池仿Nginx C++实现
c++·nginx