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最小值,作为传播延迟的近似。
滑动窗口取最小值在理论上等价于假设传播延迟时不变。在高抖动、高丢包路径上,三个问题同时暴露:
- 样本污染:随机丢包引发的超时重传(RTO)产生异常RTT尖峰。窗口无信号处理能力,最小值被直接污染,直到该样本滑出窗口(10秒后)。
- 响应迟钝:窗口长度固定,路径改善后需等旧样本全部过期。
- 缺乏置信度 :算法不知道当前
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_thresh 且 p_pred ≤ p_converged(滤波器置信度高)时,样本被拒绝。拒绝时只更新 jitter_ewma 用于阈值动态,不更新 x_est 或 p_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%出站丢包率,超出此范围后可通过深度调优内核参数进一步控制。
参考文献
- Cardwell, N., Cheng, Y., Gunn, C. S., Yeganeh, S. H., & Jacobson, V. (2016). BBR: Congestion-Based Congestion Control. ACM Queue, 14(5), 20-53.
- Kalman, R. E. (1960). A New Approach to Linear Filtering and Prediction Problems. Journal of Basic Engineering, 82(1), 35-45.
- Welch, G., & Bishop, G. (2006). An Introduction to the Kalman Filter. UNC-Chapel Hill Technical Report, TR 95-041.
- PPP PRIVATE NETWORK™ X TCP UCP v1.0.
- BBR-S: A Low-Latency BBR Modification for Fast-Varying Connections
- RBBR: A Receiver-Driven BBR in QUIC for Low-Latency in Cellular Networks
- ERCC: Fine-grained RDMA Congestion Control via Kalman Filter-based Multi-bit ECN Feedback Reconstruction