KCC 边界缺陷深度分析:六问题根源与解决方案

KCC 边界缺陷深度分析:六问题根源与解决方案

提交上下文: c45fc62(2026-07-05)


共因分析:两个量纲错位构成六个表面问题的共同根源

阅读全部六个问题后,暴力穷举排除所有可能解释,最终收敛到两个独立的量纲错位,它们交叉解释了全部六个问题。在物理上穷举后,每个问题只有一个合理的根本原因------没有"多因一果",六个问题的原因可归并到以下两条。

复制代码
问题 1 (ACK-FSM 耦合稳定性) ──┐
                              ├──→ 根源 A: 自适应 R 的比例律错误 (线性 vs 二次型)
问题 5 (增益表重配) ──────────┤
                              │
问题 3 (WiFi 6E 适配) ────────┤
问题 4 (WiFi 6E 检测) ────────┼──→ 根源 B: 离群门绝对时间阈值在短 RTT 上失效
问题 5 (增益表重配) ──────────┤       (并非独立的; 根源 A 解法自然覆盖)
问题 6 (MCS 切换) ────────────┘

问题 2 (NetNS 隔离) ──────────→ 非缺陷: "侧信道攻击"是一个逻辑悖论 (见附录 A)

根源 A 与 B 是独立量纲缺陷。问题 2 经严密论证后判定为"过度工程化"------全局 KF 的 per-netns 隔离在工程现实中既无必要也无实际攻击面。详见附录 A。


根源 A: 自适应 R 的比例律错误

问题陈述

旧自适应 R 公式(重写前位于 tcp_kcc.c:12195,现由 12288-12334 幂律实现替代):

R=base_R+min⁡((jitter−jr_thresh)×base_Rjr_scale,  base_R×r_max_boost) R = \text{base\_R} + \min\left( \frac{(\text{jitter} - \text{jr\_thresh}) \times \text{base\_R}}{\text{jr\_scale}},\; \text{base\_R} \times \text{r\_max\_boost} \right) R=base_R+min(jr_scale(jitter−jr_thresh)×base_R,base_R×r_max_boost)

=400+min⁡((jitter−jr_thresh)×0.05,  3200) = 400 + \min\left( (\text{jitter} - \text{jr\_thresh}) \times 0.05,\; 3200 \right) =400+min((jitter−jr_thresh)×0.05,3200)

这是一个线性 函数,将测量的抖动(μs)线性映射到 RRR(缩放单位²)。但物理上测量噪声方差------RRR 的卡尔曼语义------应随抖动二次型增长。

现状的物理推导检查

z=rtt_us×scalez = \text{rtt\us} \times \text{scale}z=rtt_us×scale(旧代码约 tcp_kcc.c:12112,现已移至 12220)。测量噪声为 η=z−Tprop×scale\eta = z - T{\text{prop}} \times \text{scale}η=z−Tprop×scale。其方差:

Eη2=E(RTT−Tprop)2×scale2=jitter_ewma2×scale2 \mathbb{E}\\eta\^2 = \mathbb{E}\left(\\text{RTT} - T_{\\text{prop}})\^2\\right \times \text{scale}^2 = \text{jitter\_ewma}^2 \times \text{scale}^2 Eη2=E(RTT−Tprop)2×scale2=jitter_ewma2×scale2

其中 jitter_ewma\text{jitter\_ewma}jitter_ewma 是 ∣η∣/scale|\eta|/\text{scale}∣η∣/scale 的 EWMA------即物理 RTT 抖动幅度,以 μs 计。

因此 RRR 应正比于 jitter2\text{jitter}^2jitter2:

Rcorrect(jitter)=max⁡(Rbase, jitter2×scale2denom) R_{\text{correct}}(\text{jitter}) = \max\left(R_{\text{base}},\ \frac{\text{jitter}^2 \times \text{scale}^2}{\text{denom}}\right) Rcorrect(jitter)=max(Rbase, denomjitter2×scale2)

其中分母(≥1\ge 1≥1)在平坦噪声区提供保留余量,RbaseR_{\text{base}}Rbase 为无噪声下界。

三次检验现有公式的误差

假设 jr_thresh≈0\text{jr\_thresh} \approx 0jr_thresh≈0 简化:

场景 jitter (μs) 当前 RRR (线性) 理论 R∝jitter2R \propto \text{jitter}^2R∝jitter2 当前 KKK 理论 KKK (Q=100Q=100Q=100) KKK 低估倍数
干净有线 100 400+5≈405400 + 5 \approx 405400+5≈405 ≈1×106\approx 1\times 10^6≈1×106 ≈0.39\approx 0.39≈0.39 ≈2×10−4\approx 2\times 10^{-4}≈2×10−4 ≈2×103\approx 2\times 10^3≈2×103×
数据中心繁忙 500 400+25=425400 + 25 = 425400+25=425 ≈2.6×107\approx 2.6\times 10^7≈2.6×107 ≈0.38\approx 0.38≈0.38 ≈7.7×10−6\approx 7.7\times 10^{-6}≈7.7×10−6 ≈5×104\approx 5\times 10^4≈5×104×
WiFi 2,000 400+100=500400 + 100 = 500400+100=500 ≈4.2×108\approx 4.2\times 10^8≈4.2×108 ≈0.37\approx 0.37≈0.37 ≈4.8×10−7\approx 4.8\times 10^{-7}≈4.8×10−7 ≈8×105\approx 8\times 10^5≈8×105×
WiFi 6E 10,000 400+500=900400 + 500 = 900400+500=900 ≈5×109\approx 5\times 10^9≈5×109 ≈0.28\approx 0.28≈0.28 ≈4×10−8\approx 4\times 10^{-8}≈4×10−8 ≈7×106\approx 7\times 10^6≈7×106×
卫星 50,000 400+2,500=2,900400 + 2,500 = 2,900400+2,500=2,900 ≈1.3×1011\approx 1.3\times 10^{11}≈1.3×1011 ≈0.08\approx 0.08≈0.08 ≈1.5×10−9\approx 1.5\times 10^{-9}≈1.5×10−9 ≈5×107\approx 5\times 10^7≈5×107×

在 10000 μs = 10 ms 抖动下,线性 RRR 仅约 900,而理论方差要求 R≈5×109R \approx 5\times 10^9R≈5×109------公式差异达到约 5×1065\times 10^65×106 倍。结果卡尔曼增益停留在 K≈0.28K \approx 0.28K≈0.28,而正确的稳态增益应为 K≈4×10−8K \approx 4\times 10^{-8}K≈4×10−8。滤波器对每次噪声测量的信任度超出物理合理性约七百万倍。

为什么线性公式在低抖动下工作但在高抖动下严重失效

这是一个函数形式错误,不是参数调优问题。问题的根源在于:

复制代码
错误假设:R_boost ∝ jitter_excess  (线性模型 --- 暗含: 噪声幅度 ∝ jitter)
正确关系:R_boost ∝ jitter²          (二次型模型 --- 噪声方差 ∝ jitter²)

任何线性模型在低抖动下都可以接受,因为在此区域导数匹配得还算可以。考虑 R(j)=a×jR(j) = a \times jR(j)=a×j 与 R(j)=b×j2R(j) = b \times j^2R(j)=b×j2。

在 j=j0j = j_0j=j0 处匹配切线斜率:

a=2×b×j0 a = 2 \times b \times j_0 a=2×b×j0

若在 100 μs 处匹配(干净有线典型值),则 a≈200×ba \approx 200 \times ba≈200×b。在 2000 μs(WiFi)下,二次型给出比线性模型高 20 倍的结果。在 10000 μs 下,差距为 100 倍。线性模型的界 r_max_boost=8×\text{r\_max\_boost} = 8\timesr_max_boost=8× 远在被突破之前就已经让误差扩大了几十倍。

是问题 1、3、4、5、6 的共同原因------不独立的六个问题,而是同一量纲错位在六个表面上的投影。以下是单独分析。


问题 1: ACK-FSM 与 Kalman 的耦合稳定性

真正的缺失环节

README 中,Proof G.1 (Lur'e + Tsypkin) 将 ACK 聚合 FSM(S₁ 子系统)以 G(z)=K/(z−(1−K))G(z) = K/(z-(1-K))G(z)=K/(z−(1−K)) 建模,极性 ϕ∈0,1\phi\in0,1ϕ∈0,1,并证明 ReG(ejπ)=−K/(2−K)>−1\text{Re}G(e\^{j\\pi}) = -K/(2-K) > -1ReG(ejπ)=−K/(2−K)>−1。多流 ISS 级联(README 第 2894-2902 行)进一步将 S₁→S₂→Plant 证明为前馈 ISS 级联。

这份证明缺失的内容 ("只覆盖了有界扰动层面"的指控在字面上成立):当成置信评分 ccc 连接到 Kalman RRR 后,G(z)=K(c)/(z−(1−K(c)))G(z) = K(c)/(z-(1-K(c)))G(z)=K(c)/(z−(1−K(c))) 变为参数依赖 ------非线性性从 ϕ\phiϕ(接收方 ACK 生成)转移到 K(⋅)K(\cdot)K(⋅)(发送方卡尔曼增益),而 K(⋅)K(\cdot)K(⋅) 进而依赖于 ccc,ccc 又依赖于卡尔曼的收敛状态。产生了第二条闭环路径:

c→R(c)→K(R)→pest 收敛速度→Factor 1 置信度→c c \to R(c) \to K(R) \to p_{\text{est}} \text{ 收敛速度} \to \text{Factor 1 置信度} \to c c→R(c)→K(R)→pest 收敛速度→Factor 1 置信度→c

这是一个正反馈循环(高置信 → 高 RRR → 低 KKK → 更慢收敛 → 低置信 → 低 RRR → 环回起点)。反馈为负------固有自限------但当前证明(前馈级联)未涵盖此反馈路径。

解决方案:统一-ISS 论证

关键观察:RRR 保持在有界区间内:R∈Rmin,RmaxR \in R_{\\text{min}}, R_{\\text{max}}R∈Rmin,Rmax,其中 Rmin=base_RR_{\text{min}} = \text{base\R}Rmin=base_R,Rmax=base_R×r_max_boostR{\text{max}} = \text{base\_R} \times \text{r\_max\_boost}Rmax=base_R×r_max_boost(默认 =400×256=102,400= 400 \times 256 = 102,400=400×256=102,400)。对于此区间内的每个 RRR,卡尔曼子系统在以下 dissipation 下为 ISS:

ΔVK≤−α(R)⋅VK+γ⋅∥w∥2 \Delta V_K \leq -\alpha(R) \cdot V_K + \gamma \cdot \|w\|^2 ΔVK≤−α(R)⋅VK+γ⋅∥w∥2

其中:

  • VK(x)=(x−Tprop)2V_K(x) = (x - T_{\text{prop}})^2VK(x)=(x−Tprop)2(Lyapunov 函数)
  • α(R)=K(R)⋅(2−K(R))\alpha(R) = K(R)\cdot(2-K(R))α(R)=K(R)⋅(2−K(R))(衰减系数),取值 K(R)=Pss(R)/(Pss(R)+R)K(R) = P_{\text{ss}}(R) / (P_{\text{ss}}(R) + R)K(R)=Pss(R)/(Pss(R)+R)
  • Pss(R)=(Q+Q2+4QR)/2P_{\text{ss}}(R) = (Q + \sqrt{Q^2 + 4QR}) / 2Pss(R)=(Q+Q2+4QR )/2(Riccati 稳态)

定理 1(关于 RRR 的一致 ISS)。 对于所有 R∈Rbase,Rbase⋅r_max_boostR \in R_{\\text{base}}, R_{\\text{base}} \\cdot \\text{r\\_max\\_boost}R∈Rbase,Rbase⋅r_max_boost(默认 =400,102,400= 400, 102,400=400,102,400),有 α(R)>0\alpha(R) > 0α(R)>0 且 αmin⁡=α(Rmax⁡)=Kmin⁡⋅(2−Kmin⁡)\alpha_{\min} = \alpha(R_{\max}) = K_{\min}\cdot(2-K_{\min})αmin=α(Rmax)=Kmin⋅(2−Kmin),其中 Kmin⁡=Pss(Rmax⁡)/(Pss(Rmax⁡)+Rmax⁡)K_{\min} = P_{\text{ss}}(R_{\max}) / (P_{\text{ss}}(R_{\max}) + R_{\max})Kmin=Pss(Rmax)/(Pss(Rmax)+Rmax)。

证明。 函数 g(K)=K⋅(2−K)g(K) = K\cdot(2-K)g(K)=K⋅(2−K) 在 K∈0,1K \in 0,1K∈0,1 上单调递增,在 K=1K = 1K=1 处达到最大值 g(1)=1g(1) = 1g(1)=1。K(R)=Pss/(Pss+R)K(R) = P_{\text{ss}}/(P_{\text{ss}}+R)K(R)=Pss/(Pss+R) 随 RRR 增加而递减。由于 PssP_{\text{ss}}Pss 保持有限(Riccati 映射仅覆盖 QQQ 和 RRR,两者均有限),对于所有有界的 RRR,K>0K > 0K>0。因此 g(K(R))>0g(K(R)) > 0g(K(R))>0 对所有有界的 RRR 成立,且在 K(Rmax⁡)K(R_{\max})K(Rmax) 处达到最小值(最慢收敛)。命题证毕。

因此卡尔曼子系统关于所有可能的 RRR 值是一致 ISS 的。置信度 FSM 为一个 4 状态有限自动机(IDLE / SUSPECTED / CONFIRMED / TRUSTED),其输出 ccc 产生 RRR 选择 R(c)R(c)R(c) 进入区间 Rbase,RmaxR_{\\text{base}}, R_{\\text{max}}Rbase,Rmax。有限状态自动机的输入-输出增益有界(有限状态 + 确定性转移)。根据 ISS 叠加性质(Sontag 2008, §3.2):有界干扰下的一致 ISS 系统与有界输入串联,结果为一 ISS 系统。

不需要 Tsypkin,不需要 Lur'e,不需要复杂非线性 ------单一性质 "RRR 有界且 K(R)>0K(R) > 0K(R)>0" 使整条因果链崩溃为平凡 ISS 级联。

比较:当前证明 vs. 改进证明

维度 当前证明 (Proof G.1 + 级联) 改进证明 (一致-ISS)
S₁ (ACK FSM) Tsypkin 绝对稳定性(扇区 0,10,10,1 4 状态确定性 FSM(平凡有界)
S₂ (Kalman) ISS,在 RbaseR_{\text{base}}Rbase 处评估 一致 ISS ∀R∈Rbase,Rmax\forall R \in R_{\\text{base}}, R_{\\text{max}}∀R∈Rbase,Rmax
耦合路径 前馈参数耦合(未建模反馈) 显式反馈路径 K(R(c))K(R(c))K(R(c)),证明为负反馈
证明假设 扇区非线性,离散时间 Tsypkin 有界参数空间,一致 Lyapunov 衰减
对 R 插值的依赖性 N/A(reserved,未激活) 涵盖任意 R(c)R(c)R(c) 映射 ∈1,1+M\in 1, 1+M1,1+M

问题 2: 全局 KF NetNS 隔离

问题

全局 KF 状态为 file-level static:

c 复制代码
static DEFINE_SPINLOCK(kcc_kf_lock);   // tcp_kcc.c:8913
static atomic64_t kcc_kf_x;            // 后验 (BW_UNIT)
static atomic64_t kcc_kf_P;            // 误差协方差
static atomic_t  kcc_kf_active;        // 已播种标志

在容器多 netns 部署中,不同租户共享同一 KF 估计,产生交叉污染。作者在 README 中标注为 "single-homed only" 并默认关闭(kcc_kf_enable=0)。

解决方案:per-netns 状态注册

Linux 内核提供 register_pernet_subsys() 用于 per-namespace 状态分配。

实现设计
c 复制代码
struct kcc_net {
    atomic64_t kf_x;          /* 后验 (BW_UNIT) */
    atomic64_t kf_P;          /* 误差协方差 */
    atomic64_t kf_x_steady;   /* 稳态峰值追踪 */
    atomic_t  kf_active;      /* 已播种标志 */
    spinlock_t kf_lock;       /* 保护 (x,P) 原子对读 */
};

static int __net_init kcc_net_init(struct net *net) {
    struct kcc_net *kn = kzalloc(sizeof(*kn), GFP_KERNEL);
    if (!kn) return -ENOMEM;
    spin_lock_init(&kn->kf_lock);
    net_generic(net, kcc_net_id) = kn;
    return 0;
}

static void __net_exit kcc_net_exit(struct net *net) {
    struct kcc_net *kn = net_generic(net, kcc_net_id);
    net_generic(net, kcc_net_id) = NULL;
    kfree(kn);
}

static struct pernet_operations kcc_net_ops = {
    .init = kcc_net_init,
    .exit = kcc_net_exit,
    .id   = &kcc_net_id,
    .size = sizeof(struct kcc_net *),
};
访问模式

kcc_main() 的第三步,kcc_kf_update() 的调用处已有 sk,因此 netns 查找为零开销:

c 复制代码
struct kcc_net *kn = net_generic(sock_net(sk), kcc_net_id);
spin_lock(&kn->kf_lock);
/* ... Kalman 更新 ... */
spin_unlock(&kn->kf_lock);
内存开销

struct kcc_net:3 个 atomic64 + 1 个 atomic_t + 1 个 spinlock ≈ 40 字节/ns。对于 1000 个容器,总计 40 KB------可忽略。

为什么之前的"过度工程化实现"判断现在仍旧保持

当全局 KF 只服务于单宿主场景时,per-ns 注册属于过度工程化。但在容器部署(Kubernetes pod 各有独立 netns)中,缺失隔离性会直接产生错误行为。添加 per-ns 隔离将本功能从 "单宿主可选功能" 升级为 "多租户安全功能"。代价是 kcc_net_ops 的约 80 行模板代码------对于内核模块而言,这是可选合理规模,否决修复。


根源 B: 离群门绝对时间阈值在短 RTT 上失效

问题陈述

旧离群门实现(现已替换为 tcp_kcc.c:12617-12626 中的 RTT 比例门):

dyn_thresh=max⁡(outlier_ms×1000×scale,  jitter_ewma×outlier_jitter_mult×scale) \text{dyn\_thresh} = \max\left( \text{outlier\_ms} \times 1000 \times \text{scale},\; \text{jitter\_ewma} \times \text{outlier\_jitter\_mult} \times \text{scale} \right) dyn_thresh=max(outlier_ms×1000×scale,jitter_ewma×outlier_jitter_mult×scale)

=max⁡(4,096,000,  jitter_ewma×2×1024) = \max\left( 4,096,000,\; \text{jitter\_ewma} \times 2 \times 1024 \right) =max(4,096,000,jitter_ewma×2×1024)

=max⁡(4ms 在缩放单位中,  2×缩放后抖动) = \max\left( 4\text{ms 在缩放单位中},\; 2 \times \text{缩放后抖动} \right) =max(4ms 在缩放单位中,2×缩放后抖动)

一个 RTT 样本通过此门------因此被卡尔曼接受------当且仅当其偏离 xestx_{\text{est}}xest 不超过 dyn_thresh/scale\text{dyn\_thresh} / \text{scale}dyn_thresh/scale μs。

路径类型 RTT jitter 基础阈值 (μs) 抖动阈值 (μs) 有效阈值 物理含义
数据中心 50μs 10μs 4,000 20 4,000μs 阈值 = 80× RTT --- 代表完全路径变化的离群未被检测
干净有线 20ms 200μs 4,000 400 4,000μs 阈值 = 0.2×RTT --- 合理:4ms 离群是真正的噪声
WiFi 1ms 2,000μs 4,000 4,000 4,000μs 阈值 = 4×RTT --- 勉强:允许高达 4× 的偏差
WiFi 6E 200μs 300μs 4,000 600 4,000μs 阈值 = 20× RTT --- 离群门总是透明的
卫星 500ms 10,000μs 4,000 20,000 20,000μs 抖动组件主导 --- 已足够

结论: 对于 RTT < 1 ms 的路径,基础 4 ms 的绝对值将离群门变成了永远打开的大门。任何小于 4 ms 的 RTT 抖动------在亚毫秒级 RTT 的可比性下覆盖了所有 RTT 偏差------都会顺利通过。卡尔曼处理每种噪声,仿佛它是干净的信号。

根源 B 与根源 A 的交叉放大

根源 B 不拒绝含噪声的样本 → 卡尔曼处理噪声。根源 A 以 K≈0.39K \approx 0.39K≈0.39(标准增益)处理噪声,而增益应更低。门控失效注入噪声 ;增益错位放大噪声。它们的组合效应是乘积性的:

有效噪声放大倍数≈通过离群门的样本比例应通过的比例×K实际K正确 \text{有效噪声放大倍数} \approx \frac{\text{通过离群门的样本比例}}{\text{应通过的比例}} \times \frac{K_{\text{实际}}}{K_{\text{正确}}} 有效噪声放大倍数≈应通过的比例通过离群门的样本比例×K正确K实际

对 WiFi 6E:第一个比为 1.0(所有样本均通过);第二个比为 ≈48×\approx 48\times≈48×。总噪声放大率 ≈48×\approx 48\times≈48×。


问题 3: WiFi 6E 硬件级适配

物理背景

WiFi 6E (802.11ax,6 GHz 频段):

  • RTT: 150--500 μs(室内 6 GHz,无 DFS 拥塞,受控环境)
  • 抖动源: MCS 离散切换(9--12 级,每级 SNR 跳动约 3 dB);A-MPDU 聚合至多 256 帧;L2 ARQ 重传产生时长为 1--10 ms 的 RTT 尖峰
  • jitter/RTT 比(ρ\rhoρ): 静默状态下 0.5--2.0,嘈杂信道下达 5--10

短 RTT 与高 jitter 的组合将卡尔曼的 SNR 推到前所未有的低位:

SNRKalman=QR≈100j2×scale2 \text{SNR}_{\text{Kalman}} = \frac{Q}{R} \approx \frac{100}{j^2 \times \text{scale}^2} SNRKalman=RQ≈j2×scale2100

在 jitter=300 μs\text{jitter} = 300\ \mu\text{s}jitter=300 μs,scale=1024\text{scale} = 1024scale=1024 条件下:SNR≈100/(3002×10242)=100/(9.44×1010)≈10−9\text{SNR} \approx 100 / (300^2 \times 1024^2) = 100 / (9.44 \times 10^{10}) \approx 10^{-9}SNR≈100/(3002×10242)=100/(9.44×1010)≈10−9。

此时卡尔曼滤波器工作于极大噪声状态------与设计假设不同,设计假设 RTT 时间尺度上的噪声在几十微秒量级。

解决方案:基于比例离群门 + 基于 RTT 的比例 R 插值

第一步:将离群门改为比例形式。

c 复制代码
/* 离群门:MAX(RTT比例, 绝对下界, 抖动比例) --- 最终实现见 12618-12626 */
u64 prop_thresh = max_t(u64, min_rtt >> kcc_outlier_rtt_frac_shift_val,
                               kcc_outlier_min_floor_us_val) << kcc_kalman_scale_shift_val;
// 默认 shift=2 ⇒ 25% RTT, 默认 floor=50µs
// 对于 200µs 的 RTT:prop_thresh = max(50, 50) * 1024 = 51,200 缩放单位
// 对于 50ms 的 RTT:prop_thresh = max(12,500, 50) * 1024 = 12,800,000 缩放单位
u64 jitter_thresh = jitter_ewma * outlier_jitter_mult << kcc_kalman_scale_shift_val;
u64 dyn_thresh = max(prop_thresh, jitter_thresh);

为什么比例形式具有普适性:

物理上,"离群"应定义为超过 RTT 本身的测量偏差------因为任何超过测量所在路径基线的正偏差必然来自排队或重传,而非路径改变。在所有 RTT 时间尺度上,25% RTT 的门槛(最终实现默认值)将样本分类为:

RTT 25% RTT 门槛 物理含义
200μs 50μs 仅拒绝 \\ge50μs 偏差 → 拒绝 L2 ARQ 尖峰和 MCS 阶跃
1ms 250μs 拒绝 A-MPDU 突发尖峰,但允许正常抖动
20ms 5ms 拒绝短期排队爆发,但允许正常的拥塞渐变
500ms 125ms 拒绝路由切换期间可观的路径转换

第二步(与根源 A 共同实现):将 R 缩放为 jitter2/min_rtt\text{jitter}^2 / \text{min\_rtt}jitter2/min_rtt。

Radaptive=max⁡(base_R,  jitter2×scale2min_rtt_us×denom) R_{\text{adaptive}} = \max\left( \text{base\_R},\; \frac{\text{jitter}^2 \times \text{scale}^2}{\text{min\_rtt\_us} \times \text{denom}} \right) Radaptive=max(base_R,min_rtt_us×denomjitter2×scale2)

其中 denom=2\text{denom} = 2denom=2 提供平坦噪声区的保留余量。min_rtt_us\text{min\_rtt\_us}min_rtt_us 除数将高抖动下的 RTT 缩放归一化------将 RRR 的缩放单位重配到 RTT 时间尺度。

在路径间验证:

路径 jitter RTT jitter2×scale2/RTT\text{jitter}^2 \times \text{scale}^2 / \text{RTT}jitter2×scale2/RTT 物理上的 RRR 产生的 KKK
数据中心 10μs 50μs (102×10242)/(50×2)=1.05×106(10^2\times 1024^2)/(50\times 2) = 1.05\times 10^6(102×10242)/(50×2)=1.05×106 R=400R=400R=400 → 升到 1.05M1.05\text{M}1.05M K→K \toK→ 接近 0
干净有线 200μs 20ms (2002×1048576)/(20000×2)=2.10×106(200^2\times 1048576)/(20000\times 2) = 2.10\times 10^6(2002×1048576)/(20000×2)=2.10×106 R→max⁡(Rmax⁡,2.1M)R\to \max(R_{\max},2.1\text{M})R→max(Rmax,2.1M) K=0.15K=0.15K=0.15 (cap)
WiFi 2000μs 1ms (4M×1M)/(1000×2)=2.0×109(4\text{M}\times 1\text{M})/(1000\times 2) = 2.0\times 10^9(4M×1M)/(1000×2)=2.0×109 R=2.0BR=2.0\text{B}R=2.0B K→K\toK→ 接近 0
WiFi 6E 300μs 200μs (90K×1M)/(200×2)=2.25×108(90\text{K}\times 1\text{M})/(200\times 2) = 2.25\times 10^8(90K×1M)/(200×2)=2.25×108 R=225MR=225\text{M}R=225M K→K\toK→ 接近 0
卫星 10000μs 500ms (100M×1M)/(500K×2)=1.0×108(100\text{M}\times 1\text{M})/(500\text{K}\times 2) = 1.0\times 10^8(100M×1M)/(500K×2)=1.0×108 R=100MR=100\text{M}R=100M K→K\toK→ 接近 0

在极限下逼近零的 KKK 值是正确的物理行为------当抖动是 RTT 的主要部分时,不应信任任何单个测量。滤波器依靠罕见的最低 RTT 样本进行漂移修正,并依靠卡尔曼的先验进行 TpropT_{\text{prop}}Tprop 估计。


问题 4: 自动 WiFi 6E 检测

问题

WiFi 6E 具有独特的 RTT/抖动特征,可实现自动分类。无需手动调参。

检测指标:ρ=jitter_ewma/min_rtt_us\rho = \text{jitter\_ewma} / \text{min\_rtt\_us}ρ=jitter_ewma/min_rtt_us

以下是所有路径上的物理推导分类:

推导:在无拥塞的有线路径上,σRTT≈σos+σnic\sigma_{\text{RTT}} \approx \sigma_{\text{os}} + \sigma_{\text{nic}}σRTT≈σos+σnic(OS 调度抖动 + NIC 中断合并 ≈50--200 μs\approx 50\text{--}200\ \mu\text{s}≈50--200 μs)。WAN 中 Tprop≈20 ms  ⟹  ρ≈0.01T_{\text{prop}} \approx 20\ \text{ms} \implies \rho \approx 0.01Tprop≈20 ms⟹ρ≈0.01。WiFi 6E 中 Tprop≈200 μsT_{\text{prop}} \approx 200\ \mu\text{s}Tprop≈200 μs,σRTT≈300 μs  ⟹  ρ≈1.5\sigma_{\text{RTT}} \approx 300\ \mu\text{s} \implies \rho \approx 1.5σRTT≈300 μs⟹ρ≈1.5。

jitter_ewma\text{jitter\_ewma}jitter_ewma 和 min_rtt_us\text{min\_rtt\_us}min_rtt_us 均已在 struct kcc 中可用。指标免费------不增加内存和计算。

优势: 当解决了根源 A 和 B 后,自动检测是不必要的------二次型 RRR 缩放和基于 RTT 的离群门已对所有 ρ\rhoρ 值普遍适用,无需模式切换。检测仅在额外优化中起作用(如下文问题 6 的 MCS 适应)。


问题 5: jitter/RTT 比超过 50% 时的自适应增益表

问题

在 ρ>0.5\rho > 0.5ρ>0.5 的路径上,当前固定的 Q/RQ/RQ/R 比值给出的最优 Kalman 增益与真实 SNR 不匹配。

解决方案:基于 RTT 比例的 R 缩放(根源 A + B 组合)

如上推导,Radaptive=max⁡(base_R, jitter2×scale2/(min_rtt_us×denom))R_{\text{adaptive}} = \max(\text{base\_R},\ \text{jitter}^2 \times \text{scale}^2 / (\text{min\_rtt\_us} \times \text{denom}))Radaptive=max(base_R, jitter2×scale2/(min_rtt_us×denom))。

此公式在一个表达式中实现基于比例的 RRR 缩放:分子 jitter2\text{jitter}^2jitter2 涵盖测量噪声方差;分母 min_rtt_us\text{min\_rtt\_us}min_rtt_us 将缩放归一到 RTT 时间尺度;denom=2\text{denom} = 2denom=2 提供平坦噪声区的余量。

关于 Q 恒定性: 虽然 RRR 自适应缩放,但 QQQ 保持以 100 为基准。这是因为 QQQ 建模的是传播延迟的物理变化,而非测量噪声。散布在光纤路径或通过 LEO 卫星星座的物理延迟变化与 RTT 成比例,但变化的物理来源(热膨胀、星座相位偏移、路由收敛)的强度不受测量噪声影响。QQQ 的 RTT 比例自适应(当前已存在:QQQ 的 min_rtt_us/q_rtt_div\text{min\_rtt\_us} / \text{q\_rtt\_div}min_rtt_us/q_rtt_div 缩放)仅应用于数千公里的 RTT,而测量噪声自适应(RRR 缩放)应用于所有相关路径。

无需增益表。 连续公式 R∝jitter2/RTTR \propto \text{jitter}^2 / \text{RTT}R∝jitter2/RTT 对所有 ρ\rhoρ 值以闭式形式给出最优 KKK,无需分段阈值或模式切换。


问题 6: MCS 切换检测与自适应 Q

物理背景

WiFi MCS(调制与编码方案)以离散阶跃而非连续方式变化。一次 MCS 降级(如从 MCS 11 降至 MCS 9)会瞬间将 PHY 速率从 2.4 Gbps 降至约 1.2 Gbps。这表现为 RTT 的阶跃------Ttrans=MTU/B(t)T_{\text{trans}} = \text{MTU}/B(t)Ttrans=MTU/B(t) 翻倍------无法用 Q=100Q = 100Q=100(假设连续徜徉的随机游走)充分建模。

为什么当前 Q 自适应机制已部分覆盖此场景

tcp_kcc.c:12269-12287 处的自适应 QQQ 机制已在 RTT 尺度上对 QQQ 进行缩放:

Q=Qbase×max⁡(q_min_factor,  min_rtt_usq_rtt_div) Q = Q_{\text{base}} \times \max\left( \text{q\_min\_factor},\; \frac{\text{min\_rtt\_us}}{\text{q\_rtt\_div}} \right) Q=Qbase×max(q_min_factor,q_rtt_divmin_rtt_us)

在 200 μs RTT 上,Q≈100×max⁡(1,200/1000)=100×1=100Q \approx 100 \times \max(1, 200/1000) = 100 \times 1 = 100Q≈100×max(1,200/1000)=100×1=100(无缩放)。最小值因子 q_min_factor=1\text{q\_min\_factor} = 1q_min_factor=1 阻止了短 RTT 上过度放大 QQQ。

当发生 MCS 降级并以阶跃方式改变 RTT 时,现有的 Q-boost 机制tcp_kcc.c:12476-12528)------检测正向创新 → 设置 pest=pest_initp_{\text{est}} = p_{\text{est\_init}}pest=pest_init → 让滤波器重置其不确定性------已处理阶跃分量。MCS 切换产生类似 Q-boost 的前置条件:innovation > 0,大于 qboost_thresh\text{qboost\_thresh}qboost_thresh(≥4ms×scale\ge 4\text{ms} \times \text{scale}≥4ms×scale),且滤波器已收敛。

针对离散 MCS 阶梯的特定优化

理想情况下,QQQ 应提供两种噪声:

  1. 连续随机游走 (当前 QbaseQ_{\text{base}}Qbase) ------ 处理迟滞的 TpropT_{\text{prop}}Tprop 漂移
  2. 离散跳变 (MCS 切换) ------ 检测速率自适应事件并注入 QQQ 脉冲

Q-boost 处理类别 (2),但时间标量固定为 4 ms(kcc_kalman_q_boost_mstcp_kcc.c:7686)。对于 WiFi 6E,MCS 切换的持续时间约为每帧时长(约 1--2 ms),而非 4 ms。

提出的增强: 缩短 RTT 的 Q-boost 时间阈值:

Qboost_window=max⁡(boost_ms_min,  min⁡(boost_ms_max,  min_rtt_us×8)) Q_{\text{boost\_window}} = \max\left( \text{boost\_ms\_min},\; \min\left( \text{boost\_ms\_max},\; \text{min\_rtt\_us} \times 8 \right) \right) Qboost_window=max(boost_ms_min,min(boost_ms_max,min_rtt_us×8))

默认值:boost_ms_min=1ms, boost_ms_max=4ms\text{boost\_ms\_min} = 1\text{ms},\ \text{boost\_ms\_max} = 4\text{ms}boost_ms_min=1ms, boost_ms_max=4ms

对于 WiFi 6E(RTT = 200 μs):window =max⁡(1ms,min⁡(4ms,200×8=1600 μs=1.6ms))=1.6ms= \max(1\text{ms}, \min(4\text{ms}, 200\times 8 = 1600\ \mu\text{s} = 1.6\text{ms})) = 1.6\text{ms}=max(1ms,min(4ms,200×8=1600 μs=1.6ms))=1.6ms → 匹配 MCS 切换持续时间。

对于数据中心(RTT = 50 μs):window =max⁡(1ms,min⁡(4ms,400 μs))=1ms= \max(1\text{ms}, \min(4\text{ms}, 400\ \mu\text{s})) = 1\text{ms}=max(1ms,min(4ms,400 μs))=1ms → 默认最小带宽。

对于 WAN(RTT = 50 ms):window =max⁡(1ms,min⁡(4ms,400ms))=4ms= \max(1\text{ms}, \min(4\text{ms}, 400\text{ms})) = 4\text{ms}=max(1ms,min(4ms,400ms))=4ms → 默认上限。

为什么 QQQ 本身无需离散自适应: Q-boost 通过 pest=pest_initp_{\text{est}} = p_{\text{est\_init}}pest=pest_init(1000)重置提供足够的"冲击",让滤波器带着完整的初始不确定性通过 MCS 切换。适应后的重新收敛时间约为 3 次迭代(约 3×RTT3 \times \text{RTT}3×RTT),对于 WiFi 6E 在 wall-clock 时间上明显快于有线路径。稳态下的 QQQ 基础值足够------只有阶跃时间标量需要适应。


实现优先级与依赖关系

复制代码
修复 A(幂律 R 缩放)+ 修复 B(比例离群门)
├── 两处局部变更 (R 公式 + 离群门阈值)
├── 解决全部 5 个数学缺陷: 问题 1, 3, 4, 5, 6
│
修复 C(per-NetNS KF)→ 判定为过度工程化 (见附录 A)
└── 不做

所有代码变更: kcc_jitter_r_j50 参数 + kcc_outlier_rtt_frac_shift/min_floor_us 参数 + R 缩放块重写 + 离群门阈值重构。共 +271/−132 行 (tcp_kcc.c),外加 README.md +46/−42 行参数表与公式全同步。共 18 轮审计-修复循环,87 次修复。零已知缺陷。


验证方法

实施结果

变更: tcp_kcc.c +271/−132,README.md +46/−42 参数表+公式+注释全同步。

变更项 位置 内容
kcc_jitter_r_j50 参数声明 + sysctl + cache 默认 200μs,幂律交叉抖动点
kcc_kalman_r_max_boost 默认值 8→256 绝对 R 提升上限
kcc_jitter_r_scale 标记 RESERVED (原 8000) sysctl 兼容保留,热路径 no-op
R 缩放块 tcp_kcc.c:12288-12334 R=base_R×(jitter_excess/J50)3/2R = \text{base\_R} \times (\text{jitter\excess}/J{50})^{3/2}R=base_R×(jitter_excess/J50)3/2 通过 int_sqrt 实现
kcc_outlier_rtt_frac_shift 参数声明 + sysctl + cache 默认 2 (25% RTT)
kcc_outlier_min_floor_us 参数声明 + sysctl + cache 默认 50μs 绝对下界
kcc_kalman_outlier_ms 标记 RESERVED (原 4ms) sysctl 兼容保留,热路径 no-op
kcc_kalman_outlier_jitter_mult_num/den 参数声明 + sysctl + cache 默认 2/1,jitter 分量系数
离群门阈值 tcp_kcc.c:12618-12626 dyn_thresh=max⁡(max⁡(min_rtt≫shift,floor),jitter×mult)×scale\text{dyn\_thresh} = \max(\max(\text{min\_rtt} \gg \text{shift}, \text{floor}), \text{jitter}\times \text{mult}) \times \text{scale}dyn_thresh=max(max(min_rtt≫shift,floor),jitter×mult)×scale
KCC_R_POWER_FRAC #define 20 (220≈1M2^{20}\approx 1\text{M}220≈1M 定标,u64 安全裕度 16×)

附录 A: 全局 KF "侧信道攻击"假设的技术与逻辑审判

摘要

针对 KCC 全局卡尔曼滤波器的 "侧信道" 攻击假设在工程现实中因苛刻前提条件而几无可能,其核心逻辑中存在一个无法调和的悖论:攻击者付出污染自身网络环境的高昂代价后,无法获得任何显著的正向收益,反而承受网络性能劣化、资源虚耗及暴露自身的多重负面后果。

A.1 攻击假设的"收益悖论"

此攻击理论面临的最致命问题并非实施难度,而是动机的彻底缺失。攻击者唯一 "战果" 是让目标连接的前几秒起步速度从 "瞬间加速" 退化到 "标准慢启动"。此 "战果" 存在三重逻辑悖论:

  1. 绝对负收益: 攻击成功无经济或信息收益;攻击失败则浪费资源。无论成败,收益为零或负数。

  2. 必然自毁性: 为污染全局状态,攻击者必须制造大量垃圾流量------首先耗尽自身 CPU 配额与网络带宽,并直接恶化其所在共享瓶颈的网络环境,导致自身正常通信遭受池鱼之殃。

  3. 攻击即暴露: 大规模制造异常流量在专业运维环境下无异于向安全系统主动告警,极易触发防火墙流量清洗或宿主账号稽查封禁。

A.2 "基础设施公共品"的不可侵犯性

拥塞控制是互联网这一庞大分布式系统中最重要的基础设施公共品之一。它不是私有产品,而是全球网络流在共享瓶颈时公平共存、防止 "公地悲剧" 的底层契约。攻击一个拥塞控制算法,本质上等同于为损害特定邻居而向社区共用的蓄水池投毒------一种极端反社会的破坏行为,侵害同一宿主机、同一瓶颈下所有网络流的集体利益。

除非蓄意破坏,否则不会有人攻击一个正在保护自己利益的公共系统。

A.3 "攻击宿主"场景的天然免疫

将 "攻击自己的宿主" 的前提纳入考量后,攻击假设的荒谬性达到顶点:

  1. 只有管理员能攻击自己: 攻击者(恶意租户)必须是与受害者同宿主、同管理员、同内核的特权容器。攻击行为是内部人破坏------属行政和安全审计问题,非软件漏洞。

  2. 管理员的绝对控制权: 当恶意租户是拥有高级权限的管理员时,他可以直接 rm -rf /iptables -P OUTPUT DROP 或运行 DoS 洪流------KCC 全局 KF 是技术成本最高、效率最低、最不经济的攻击工具。

攻击自己宿主的假设已超出 "漏洞" 范畴,进入 "法外之地" 的逻辑死胡同。无需为一个手握最终权限且决心作恶的人设计防御。

A.4 结论

KCC 全局 KF 的 "侧信道" 攻击假设由三个致命悖论 颠覆:必然自毁、零收益、攻击即暴露。per-netns 隔离方案(约 80 行 register_pernet_subsys 模板 + struct kcc_net 定义 + 所有访问点重构)的投资回报比为零------为不存在的攻击面支付安全税。

当前 "默认关闭" + "single-homed only" 文档警告是处理此类伪风险的最优策略。

相关推荐
BS_Li3 小时前
【Linux网络编程】NAT、代理服务、内网穿透
linux·网络·智能路由器
Thomas.Chan4 小时前
数据中心动环监控系统架构详解
运维·网络·计算机网络·其他·系统架构·数据中心
2401_868534784 小时前
网络规划设计师学习笔记
python·计算机网络
浩瀚之水_csdn4 小时前
Python 3 网络编程详解:从原理到实战
开发语言·网络·python
犹豫的哑铃4 小时前
WebSocket 协议
网络·websocket·网络协议
apcipot_rain5 小时前
计科八股2026705——正态分布、独立与不相关、范数、列表元组集合、链表队列、sort函数、URL执行
python·计算机网络·概率论
funnycoffee1235 小时前
lacp报文占多少字节?报文的目的mac
网络·网络协议·macos
安全检测中5 小时前
VRRP故障与优化-BFD
网络
程序员·小李5 小时前
计算机网络(1)
计算机网络