云计算百科
云计算领域专业知识百科平台

TCP KCC 2.0:三分量 RTT 分解与测地线拥塞控制

TCP KCC 2.0:三分量 RTT 分解与测地线拥塞控制

本文基于仓库内 tcp_kcc.c(5485 行)与 README.md(2150 行)撰写,所有断言标注出处,格式为 [README:章节] 或 [tcp_kcc.c:行号]。数学记号与仓库文档保持一致。文中将"已证明"(给出证明方法)、“已验证”(给出验证手段)、“声称”(仅给出处)三者区分开,读者可以自行核对。

1. 引言:KCC 在解决什么问题

KCC(Geodesic Congestion Control)是 Linux 内核的一个可加载 TCP 拥塞控制模块,编译产物为 tcp_kcc.ko。它是一个发送端、ACK 驱动的算法:kcc_main() 在每个 ACK 到达时被调用,输入是内核提供的 rate_sample 结构(带宽、RTT、delivered、loss 计数)[README:State Machine Transitions]。模块注册为标准的 tcp_congestion_ops,通过 sysctl net.ipv4.tcp_congestion_control 启用,与内核 BBR 共用同一套 FSM 钩子接口。

KCC 的出发点是下面这个观测问题。拥塞控制本质上是推断:发送端只有一个标量观测 z_k = RTT,但真正需要知道的是三个隐藏变量——T_prop(传播时延,决定 BDP 的下界)、瓶颈队列深度(决定当前拥塞程度)、瓶颈带宽(决定安全发送速率)。这三个变量混合在一个标量里,任何 CC 算法都在做"从被污染的单维观测中反推多维隐藏状态"的工作[README:Congestion Control IS an Inference Problem]。这个推断问题的可解性,完全取决于你用什么样的模型去分解 RTT。

2. 为什么四分量模型对拥塞控制不可用

网络测量的标准模型(Keshav 1991;RFC 9438)按物理位置把 RTT 拆成四项:

RTT = T_prop + T_trans + T_queue + T_proc

它物理上完备,但对端点观测者而言在推断上不可用。设参数向量 θ = (T_prop, T_trans, T_queue, T_proc)ᵀ ∈ ℝ⁴,观测模型为:

z_k = hᵀθ + w_k, h = (1,1,1,1)ᵀ, w_k ~ N(0, σ²)

四个分量对观测的梯度完全相同(都是 1)。于是 Fisher 信息矩阵为:

I(θ) = (N/σ²)·h·hᵀ = (N/σ²)·H

其中 H 是 4×4 全 1 矩阵。h·hᵀ 的秩是 1(特征值 {4,0,0,0}),det(I) = 0 恒成立,与样本量 N 无关——每增加一个样本,只是在同一个秩 1 方向上累加信息[README:Proof E]。Cramer-Rao 定理(Rao 1945;Cramer 1946)给出的结论是:任何无偏估计量的方差下界为 I⁻¹,而 I 不存在逆,于是三个方向的方差下界为无穷。具体地说,H 的零空间维数为 3,一组基为:

v₁ = [1, 0, -1, 0]ᵀ (T_prop 与 T_queue 互换)
v₂ = [0, 1, -1, 0]ᵀ (T_trans 与 T_queue 互换)
v₃ = [0, 0, -1, 1]ᵀ (T_queue 与 T_proc 互换)

沿这些方向扰动参数,观测分布完全不变。能估计的只有总和 Σθᵢ(Moore-Penrose 伪逆投影到的一维子空间)[README:Proof E]。

贝叶斯先验也救不了它。后验精度矩阵 Λ_post = Λ_prior + I(θ)。对物理上合理的先验(固定路径上 T_trans、T_proc 恒定,先验精度无穷),rank(Λ_prior) ≤ 2,于是 rank(Λ_post) ≤ 2 + 1 = 3 < 4。退化方向恰是 v₁ = [1,0,-1,0]ᵀ——这正是拥塞控制最关心的 T_prop vs T_queue 子空间[README:Proof E1]。任何宣称从标量 RTT 恢复四个分量的算法,都在试图解决信息论上不可能的问题。

需要说明的是,这个证明基于"各分量视为固定参数"的瞬时模型;真实网络中 T_queue 随时间变化、T_prop 保持不变,时间维度提供了瞬时 FIM 预测之外的分离途径,仓库文档也明确承认这一点[README:Appendix A Disclaimer]。所以这里的结论应当读作下界:瞬时问题(4 个未知加性分量、1 个标量观测)结构性奇异,与样本量无关。

3. 三分量行为学分解

KCC 换了一个分类标准:不按物理位置,而按每个时延分量对拥塞的行为学响应 ∂/∂q(q 为瓶颈队列深度)划分:

#mermaid-svg-at6RYUFJ0w3noULq{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-at6RYUFJ0w3noULq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-at6RYUFJ0w3noULq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-at6RYUFJ0w3noULq .error-icon{fill:#552222;}#mermaid-svg-at6RYUFJ0w3noULq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-at6RYUFJ0w3noULq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-at6RYUFJ0w3noULq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-at6RYUFJ0w3noULq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-at6RYUFJ0w3noULq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-at6RYUFJ0w3noULq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-at6RYUFJ0w3noULq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-at6RYUFJ0w3noULq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-at6RYUFJ0w3noULq .marker.cross{stroke:#333333;}#mermaid-svg-at6RYUFJ0w3noULq svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-at6RYUFJ0w3noULq p{margin:0;}#mermaid-svg-at6RYUFJ0w3noULq .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-at6RYUFJ0w3noULq .cluster-label text{fill:#333;}#mermaid-svg-at6RYUFJ0w3noULq .cluster-label span{color:#333;}#mermaid-svg-at6RYUFJ0w3noULq .cluster-label span p{background-color:transparent;}#mermaid-svg-at6RYUFJ0w3noULq .label text,#mermaid-svg-at6RYUFJ0w3noULq span{fill:#333;color:#333;}#mermaid-svg-at6RYUFJ0w3noULq .node rect,#mermaid-svg-at6RYUFJ0w3noULq .node circle,#mermaid-svg-at6RYUFJ0w3noULq .node ellipse,#mermaid-svg-at6RYUFJ0w3noULq .node polygon,#mermaid-svg-at6RYUFJ0w3noULq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-at6RYUFJ0w3noULq .rough-node .label text,#mermaid-svg-at6RYUFJ0w3noULq .node .label text,#mermaid-svg-at6RYUFJ0w3noULq .image-shape .label,#mermaid-svg-at6RYUFJ0w3noULq .icon-shape .label{text-anchor:middle;}#mermaid-svg-at6RYUFJ0w3noULq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-at6RYUFJ0w3noULq .rough-node .label,#mermaid-svg-at6RYUFJ0w3noULq .node .label,#mermaid-svg-at6RYUFJ0w3noULq .image-shape .label,#mermaid-svg-at6RYUFJ0w3noULq .icon-shape .label{text-align:center;}#mermaid-svg-at6RYUFJ0w3noULq .node.clickable{cursor:pointer;}#mermaid-svg-at6RYUFJ0w3noULq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-at6RYUFJ0w3noULq .arrowheadPath{fill:#333333;}#mermaid-svg-at6RYUFJ0w3noULq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-at6RYUFJ0w3noULq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-at6RYUFJ0w3noULq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-at6RYUFJ0w3noULq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-at6RYUFJ0w3noULq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-at6RYUFJ0w3noULq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-at6RYUFJ0w3noULq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-at6RYUFJ0w3noULq .cluster text{fill:#333;}#mermaid-svg-at6RYUFJ0w3noULq .cluster span{color:#333;}#mermaid-svg-at6RYUFJ0w3noULq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-at6RYUFJ0w3noULq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-at6RYUFJ0w3noULq rect.text{fill:none;stroke-width:0;}#mermaid-svg-at6RYUFJ0w3noULq .icon-shape,#mermaid-svg-at6RYUFJ0w3noULq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-at6RYUFJ0w3noULq .icon-shape p,#mermaid-svg-at6RYUFJ0w3noULq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-at6RYUFJ0w3noULq .icon-shape .label rect,#mermaid-svg-at6RYUFJ0w3noULq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-at6RYUFJ0w3noULq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-at6RYUFJ0w3noULq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-at6RYUFJ0w3noULq :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

三分量模型:按 ∂/∂q 行为学响应分类

四分量模型:按物理位置分类

T_prop

RTT = T_prop + T_trans + T_queue + T_proc

T_trans

T_queue

T_proc

标量观测 z_k

T_prop:∂/∂q = 0,锚

RTT = T_prop + T_queue + T_noise

T_queue:∂/∂q > 0,信号

T_noise:E[∂/∂q] = 0,干扰

标量观测 z_k

FIM 秩 1 < 4:不可辨识

行为学先验下 FIM 满秩:可辨识

分量分类条件物理构成拥塞信息
T_prop(锚) ∂/∂q ≡ 0,固定路径上方差为 0 电磁传播 + 恒定串行化 + 恒定处理时延
T_queue(信号) ∂/∂q > 0,单调非负 缓冲区排队时延 携带拥塞信息
T_noise(干扰) E[∂/∂q] = 0,零均值、有界方差 NIC 中断合并、OS 调度抖动、ACK 压缩、无线 L2 重传

这个划分是完备且互斥的:FIFO 队列下 ∂/∂q < 0 物理上不可能(入队不会减少已有分组的时延),因此每个物理时延源恰好落入三类之一[README:Definition 1]。注意一个推论:T_trans 在恒定链路速率下 ∂/∂q = 0,被归入 T_prop 等价类;而 WiFi 速率自适应导致的变速率串行化 ∂/∂q > 0,归入 T_queue。分类跟随行为而非位置[README:Classification Criterion]。

为什么必须是三个,不是两个也不是四个?

不是两个。 两分量模型 RTT = T_base + T_queue 把 T_noise 并入 T_base。后果:向上的噪声尖峰被当作基线抬升 → T_base 高估 → BDP 高估 → cwnd 超配 → 自我制造的拥塞 → 噪声与队列之间形成正反馈[README:Proof L, k=2 情形]。BBRv1 就是这种隐式两分量模型的实例(见第 8 节)。

不是四个。 第 2 节的秩亏缺已经说明原因。

三个就够。 三分量模型在无先验时同样秩亏(这点文档没有回避:I₃ 的 FIM 也是秩 1)。它的优势是结构性的:三分量分类本身提供了三个物理上自然的行为学先验[README:Proof F]:

  • Prior 1:固定路径上 T_prop 恒定(Var = 0),T_prop 维度塌缩为单个标量;
  • Prior 2:T_noise 零均值,E[ν_k | q_k = 0] = 0,干净样本给出无偏观测;
  • Prior 3:方向门控,只有 ν_k < 0 的样本更新 T_prop。q_k > 0 时 P(ν_k < 0) → 0,队列污染样本被结构性排除。

在这些先验下,后验精度矩阵 Λ_post 的行列式:

det(Λ_post) = (N/σ²)·λ₁·λ₃ > 0,其中 λ₁ 来自 Prior 1、λ₃ = p_clean·N/R 来自 Prior 2/3

满秩,三个参数都可辨识[README:Proof F, 行列式直接计算]。λ₃ > 0 依赖 p_clean > 0,即干净样本以正频率出现。这个事实不依赖 KCC 的任何设计:Lindley 递归下稳定 FIFO 队列的 P(Q=0) = 1 − ρ,ρ < 1 时严格为正[README:Proof F, Bootstrap]。DRAIN 相位是锦上添花,不是必要条件。

最后,唯一性。证明 L 用穷举论证了 k=1、2、3、4+ 的所有情形:k<3 无法同时满足"锚可分离、信号可隔离、噪声可抑制"三个完备性条件;k≥4 继承四分量模型的秩亏缺[README:Proof L]。加上"按 ∂/∂q 分类是唯一能同时实现角色唯一与最小性的判据"(三个引理),结论是:三分量行为学划分是标量 RTT 观测下拥塞控制推断问题的唯一最粗完备划分[README:Uniqueness Theorem]。

4. 测地线估计器:G1 / G2 / G3

先澄清术语。仓库文档明确声明:"network geodesic"是一个工程类比——在 T_queue ≥ 0 约束下的最保守可行更新路径,即估计空间中的最短安全轨迹;它不声称黎曼几何意义上的最优性,也不求解任何流形上的测地线方程[README:Terminology note][tcp_kcc.c:Section 2]。这个澄清值得保留,因为它划定了"证明了什么"的边界。

估计器只有一个状态变量 x_est(T_prop 估计值,以 1024 定点缩放),没有协方差矩阵、没有过程模型、没有自适应增益。整个推断链的结构是:

#mermaid-svg-KBsgu0vOQJJYpXTu{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KBsgu0vOQJJYpXTu .error-icon{fill:#552222;}#mermaid-svg-KBsgu0vOQJJYpXTu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KBsgu0vOQJJYpXTu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KBsgu0vOQJJYpXTu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KBsgu0vOQJJYpXTu .marker.cross{stroke:#333333;}#mermaid-svg-KBsgu0vOQJJYpXTu svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KBsgu0vOQJJYpXTu p{margin:0;}#mermaid-svg-KBsgu0vOQJJYpXTu .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster-label text{fill:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster-label span{color:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster-label span p{background-color:transparent;}#mermaid-svg-KBsgu0vOQJJYpXTu .label text,#mermaid-svg-KBsgu0vOQJJYpXTu span{fill:#333;color:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu .node rect,#mermaid-svg-KBsgu0vOQJJYpXTu .node circle,#mermaid-svg-KBsgu0vOQJJYpXTu .node ellipse,#mermaid-svg-KBsgu0vOQJJYpXTu .node polygon,#mermaid-svg-KBsgu0vOQJJYpXTu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KBsgu0vOQJJYpXTu .rough-node .label text,#mermaid-svg-KBsgu0vOQJJYpXTu .node .label text,#mermaid-svg-KBsgu0vOQJJYpXTu .image-shape .label,#mermaid-svg-KBsgu0vOQJJYpXTu .icon-shape .label{text-anchor:middle;}#mermaid-svg-KBsgu0vOQJJYpXTu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KBsgu0vOQJJYpXTu .rough-node .label,#mermaid-svg-KBsgu0vOQJJYpXTu .node .label,#mermaid-svg-KBsgu0vOQJJYpXTu .image-shape .label,#mermaid-svg-KBsgu0vOQJJYpXTu .icon-shape .label{text-align:center;}#mermaid-svg-KBsgu0vOQJJYpXTu .node.clickable{cursor:pointer;}#mermaid-svg-KBsgu0vOQJJYpXTu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KBsgu0vOQJJYpXTu .arrowheadPath{fill:#333333;}#mermaid-svg-KBsgu0vOQJJYpXTu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KBsgu0vOQJJYpXTu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KBsgu0vOQJJYpXTu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KBsgu0vOQJJYpXTu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KBsgu0vOQJJYpXTu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KBsgu0vOQJJYpXTu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster text{fill:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu .cluster span{color:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KBsgu0vOQJJYpXTu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KBsgu0vOQJJYpXTu rect.text{fill:none;stroke-width:0;}#mermaid-svg-KBsgu0vOQJJYpXTu .icon-shape,#mermaid-svg-KBsgu0vOQJJYpXTu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KBsgu0vOQJJYpXTu .icon-shape p,#mermaid-svg-KBsgu0vOQJJYpXTu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KBsgu0vOQJJYpXTu .icon-shape .label rect,#mermaid-svg-KBsgu0vOQJJYpXTu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KBsgu0vOQJJYpXTu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KBsgu0vOQJJYpXTu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KBsgu0vOQJJYpXTu :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

T_prop(隐藏)

标量观测 z_k = T_prop + T_queue + T_noise

队列深度(隐藏)

噪声源(隐藏)

测地线估计器单状态 x_est,O(1)/ACK

G1:锚定 T_prop

G2:有界增长

G3:SPRT 确认路径变化

model_rtt = min(x_est, min_rtt)BDP 与 pacing

每个 RTT 样本 z_k 的更新是:

ν = z_k – x_est

ν ≤ 0: x_est = min(x_est, z_k) [G1] TOBIT 向下吸收
ν > 0: x_est = min(x_est + 122/1000·x_est, z_k) [G2] 12.2%/RTT 几何增长,观测截断

4.1 G1 与 G2:结构性噪声免疫

G1 是单步收敛:干净样本(z_k = T_prop + η_k,η_k ≤ 0)一步把估计拉到 |η_k| 以内。关键性质在于队列自身阻止 G1 触发——存在队列时 z_k 被 T_queue > 0 抬高,几乎必然在 x_est 之上;q_k ≥ 3σ 时 P(G1 触发) ≤ 0.0014[README:Proof C]。也就是说,G1 天然只在干净样本上生效,不需要显式的队列检测器。

G2 是对称的另一半:正创新以 12.2%/RTT 的固定几何速率增长,但每一步都被当前观测值 z_k 截断。这个截断使估计在纯噪声下自稳定:向上噪声最多把 x_est 推到 T_prop + η_k,不可能无界发散。12.2% 这个常数有三个约束来源[README:Parameter Derivation Proofs]:

  • 最大路径比:互联网任意两条路径的 RTT 比上界约 10⁴(25μs 数据中心到 250ms 洲际)。几何收敛序列 (1+r)ⁿ 从 R_min 到 R_max 需 N = ⌈ln(10⁴)/ln(1+r)⌉ 步;r = 0.122 时 N ≈ 80,在 50ms RTT 上约 4 秒,匹配 BGP 路由收敛的时间尺度;
  • 单步有界性:任何单样本最多使估计膨胀 min(12.2%, 观测值本身);
  • 整数运算:122/1000 可用乘加移位精确计算,误差 ≤ 0.1%。
  • 需要诚实记录的一点:这三个约束只是把候选区间压缩到 [100, 200]/1000,最终取 122/1000 的依据是 20 亿样本仿真中的 Pareto 最优性[README:Parameter Derivation Proofs]。也就是说,常数有一个推导骨架,但最终取值仍然经过仿真筛选——文档对此是坦白的。

    另外,G2 的截断并不把 T_queue 排除出观测窗口(z_k 就是地面真值,含多少队列就是多少)。文档明确说明:稳态安全性来自 G1 的逐周期复位与 G3 的确认机制,而不是 G2 截断本身[README:Part I 总结]。

    4.2 G3:双阈值路径变化检测

    G1/G2 处理的是"路径没变"的情形。路径变长(T_prop 增加,如 BGP 重路由)时,所有样本持续高于基线,需要 G3 来识别。G3 是一个双阈值、连续计数的 Wald SPRT[README:Proof C.2][tcp_kcc.c:Theorem G3]:

    路径条件计数规则动作
    fast x_est ≥ 1.10 × min_rtt 连续,低于阈值即清零 达到 6 次 → min_rtt 更新
    slow 1.05 × min_rtt ≤ x_est < 1.10 × min_rtt 连续,低于阈值即清零 达到 7 次 → min_rtt 更新
    基线 x_est ≤ min_rtt 两计数器清零

    #mermaid-svg-qhIV2LBXyMLhRJNb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qhIV2LBXyMLhRJNb .error-icon{fill:#552222;}#mermaid-svg-qhIV2LBXyMLhRJNb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qhIV2LBXyMLhRJNb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qhIV2LBXyMLhRJNb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qhIV2LBXyMLhRJNb .marker.cross{stroke:#333333;}#mermaid-svg-qhIV2LBXyMLhRJNb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qhIV2LBXyMLhRJNb p{margin:0;}#mermaid-svg-qhIV2LBXyMLhRJNb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster-label text{fill:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster-label span{color:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster-label span p{background-color:transparent;}#mermaid-svg-qhIV2LBXyMLhRJNb .label text,#mermaid-svg-qhIV2LBXyMLhRJNb span{fill:#333;color:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb .node rect,#mermaid-svg-qhIV2LBXyMLhRJNb .node circle,#mermaid-svg-qhIV2LBXyMLhRJNb .node ellipse,#mermaid-svg-qhIV2LBXyMLhRJNb .node polygon,#mermaid-svg-qhIV2LBXyMLhRJNb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qhIV2LBXyMLhRJNb .rough-node .label text,#mermaid-svg-qhIV2LBXyMLhRJNb .node .label text,#mermaid-svg-qhIV2LBXyMLhRJNb .image-shape .label,#mermaid-svg-qhIV2LBXyMLhRJNb .icon-shape .label{text-anchor:middle;}#mermaid-svg-qhIV2LBXyMLhRJNb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qhIV2LBXyMLhRJNb .rough-node .label,#mermaid-svg-qhIV2LBXyMLhRJNb .node .label,#mermaid-svg-qhIV2LBXyMLhRJNb .image-shape .label,#mermaid-svg-qhIV2LBXyMLhRJNb .icon-shape .label{text-align:center;}#mermaid-svg-qhIV2LBXyMLhRJNb .node.clickable{cursor:pointer;}#mermaid-svg-qhIV2LBXyMLhRJNb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qhIV2LBXyMLhRJNb .arrowheadPath{fill:#333333;}#mermaid-svg-qhIV2LBXyMLhRJNb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qhIV2LBXyMLhRJNb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qhIV2LBXyMLhRJNb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhIV2LBXyMLhRJNb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qhIV2LBXyMLhRJNb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhIV2LBXyMLhRJNb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster text{fill:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb .cluster span{color:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qhIV2LBXyMLhRJNb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qhIV2LBXyMLhRJNb rect.text{fill:none;stroke-width:0;}#mermaid-svg-qhIV2LBXyMLhRJNb .icon-shape,#mermaid-svg-qhIV2LBXyMLhRJNb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qhIV2LBXyMLhRJNb .icon-shape p,#mermaid-svg-qhIV2LBXyMLhRJNb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qhIV2LBXyMLhRJNb .icon-shape .label rect,#mermaid-svg-qhIV2LBXyMLhRJNb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qhIV2LBXyMLhRJNb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qhIV2LBXyMLhRJNb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qhIV2LBXyMLhRJNb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    ν ≤ 0:干净样本

    ν > 0:含队列或噪声

    x_est ≥ 1.10 × min_rtt

    1.05 × min_rtt ≤ x_est < 1.10 × min_rtt

    x_est ≤ min_rtt

    新 RTT 样本 z_k

    ν = z_k − x_est

    G1:x_est = min(x_est, z_k)单步收敛至 T_prop ± |η|

    G2:x_est = min(x_est × 122/1000, z_k)12.2%/RTT 几何增长,观测截断

    G3 阈值比较 vs min_rtt

    confirm_cnt++连续 6 次 → 更新 min_rtt

    confirm_slow_cnt++连续 7 次 → 更新 min_rtt

    两计数器清零

    两个细节值得注意。第一,计数是连续的(低于阈值即清零),不是累计的。这是从早期设计改过来的:20 亿样本仿真证明累计计数必然被持续噪声击穿,连续计数要求不间断抬高,误触发率才有界[README:Proof C.2][tcp_kcc.c:1003-1013]。第二,fast 阈值 θ = 1.10 的解空间是 1.03 < γ < 1.122:下限来自噪声(σ ≤ T_prop/100 时 3σ 界为 1.03),上限来自 G2 一步增长(γ ≥ 1.122 时检测延迟 ≥ 2 RTT)[tcp_kcc.c:1028-1039]。

    误触发界:G3 fast 路径单事件噪声触发率在 10σ 分离下约 7.62×10⁻²⁴(高斯)或 ≤ 0.01(Pareto α=2);slow 路径 5σ 下约 2.87×10⁻⁷(高斯)。连续 7 次的 Chebyshev 界(分布无关,只要求有界方差、σ ≤ T_prop/100)为 0.04⁷ ≈ 1.64×10⁻¹⁰[README:Parameter Derivation Proofs]。注意文档同时承认:同一拥塞时段内的连续 RTT 样本因共享队列状态而相关,这些界是近似而非严格的[README:Part I]。

    4.3 G3 的三级检测区域:5ms 与 7.5ms 门限的来历

    G3 的 6/7 计数组合不是在所有 RTT 上都安全的。20 亿样本仿真(实噪声模型:1ms 基线 + 队列尖峰至 20ms)按路径 RTT 分档验证后,代码把检测逻辑切成三个区域[README:Parameter Derivation Proofs][tcp_kcc.c:2974-2981]:

    区域门限G3 行为仿真结论
    < 5ms KCC_LOCK_THRESH_US = 5000 G3 完全禁用,min_rtt 锁死 4ms 时连 fast-only(4 计数)都有 2 次误触发,没有任何组合安全
    5–7.5ms KCC_FAST_ONLY_THRESH_US = 7500 仅 fast(6),slow 禁用 fast-only(6) 0 误触发;slow 是误触发源
    ≥ 7.5ms fast(6) + slow(7) 全开 7.5ms 边界处 20 亿样本 0 误触发

    5ms 这个下界有独立的物理依据:代码注释写得很直接——“<5ms is fiber (no step possible)”[tcp_kcc.c:2975]。5ms 以内的 RTT 只可能来自光纤直连(光速下约 1000km 往返),这样的路径上没有可行的更短路径存在,也就没有"路径变短/变长"的可能;队列只会抬升 RTT,不会创造路径变化信号。既然检测目标(路径变化)在该区域物理上不存在,检测器整体关闭、min_rtt 锁死是安全的做法,而不是保守的妥协。

    7.5ms 这个分界则是纯仿真产物:在 5–7.5ms 区域,slow 阈值的相对高度(1.05×)与噪声幅度(≤ 1% T_prop + 队列尖峰)在采样上无法被 20 亿样本证明安全,而 fast(1.10×)可以;到 7.5ms 以上,slow 也进入安全区。KCC_G3_FAST_CNT 从 4 提到 6、slow 从 5(累计)改为 7(连续),都是同一轮仿真的结果[tcp_kcc.c:2972-2973][tcp_kcc.c:1011-1013]。

    同一个 7.5ms 常数(KCC_FAST_ONLY_THRESH_US)在代码里还有第二个用途:ACK 聚合补偿的启用门限(见 6.3 节)。两处语义不同——一处是检测区域分界,一处是补偿启用条件——但共享同一个物理直觉:7.5ms 以下是"低延迟路径"区,该区域内补偿机制引入的 cwnd 膨胀弊大于利。

    5. 闭环稳定性:ISS 框架

    前两节证明的是估计器性质。拥塞控制最终要回答的问题是:估计器 + 控制器 + 网络排队系统组成的闭环是否稳定。KCC 文档在这部分的结构如下[README:Part II]:

    #mermaid-svg-AtRPansDzwInM2JC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AtRPansDzwInM2JC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AtRPansDzwInM2JC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AtRPansDzwInM2JC .error-icon{fill:#552222;}#mermaid-svg-AtRPansDzwInM2JC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AtRPansDzwInM2JC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AtRPansDzwInM2JC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AtRPansDzwInM2JC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AtRPansDzwInM2JC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AtRPansDzwInM2JC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AtRPansDzwInM2JC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AtRPansDzwInM2JC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AtRPansDzwInM2JC .marker.cross{stroke:#333333;}#mermaid-svg-AtRPansDzwInM2JC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AtRPansDzwInM2JC p{margin:0;}#mermaid-svg-AtRPansDzwInM2JC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-AtRPansDzwInM2JC .cluster-label text{fill:#333;}#mermaid-svg-AtRPansDzwInM2JC .cluster-label span{color:#333;}#mermaid-svg-AtRPansDzwInM2JC .cluster-label span p{background-color:transparent;}#mermaid-svg-AtRPansDzwInM2JC .label text,#mermaid-svg-AtRPansDzwInM2JC span{fill:#333;color:#333;}#mermaid-svg-AtRPansDzwInM2JC .node rect,#mermaid-svg-AtRPansDzwInM2JC .node circle,#mermaid-svg-AtRPansDzwInM2JC .node ellipse,#mermaid-svg-AtRPansDzwInM2JC .node polygon,#mermaid-svg-AtRPansDzwInM2JC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AtRPansDzwInM2JC .rough-node .label text,#mermaid-svg-AtRPansDzwInM2JC .node .label text,#mermaid-svg-AtRPansDzwInM2JC .image-shape .label,#mermaid-svg-AtRPansDzwInM2JC .icon-shape .label{text-anchor:middle;}#mermaid-svg-AtRPansDzwInM2JC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AtRPansDzwInM2JC .rough-node .label,#mermaid-svg-AtRPansDzwInM2JC .node .label,#mermaid-svg-AtRPansDzwInM2JC .image-shape .label,#mermaid-svg-AtRPansDzwInM2JC .icon-shape .label{text-align:center;}#mermaid-svg-AtRPansDzwInM2JC .node.clickable{cursor:pointer;}#mermaid-svg-AtRPansDzwInM2JC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AtRPansDzwInM2JC .arrowheadPath{fill:#333333;}#mermaid-svg-AtRPansDzwInM2JC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AtRPansDzwInM2JC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AtRPansDzwInM2JC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AtRPansDzwInM2JC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AtRPansDzwInM2JC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AtRPansDzwInM2JC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AtRPansDzwInM2JC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AtRPansDzwInM2JC .cluster text{fill:#333;}#mermaid-svg-AtRPansDzwInM2JC .cluster span{color:#333;}#mermaid-svg-AtRPansDzwInM2JC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AtRPansDzwInM2JC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AtRPansDzwInM2JC rect.text{fill:none;stroke-width:0;}#mermaid-svg-AtRPansDzwInM2JC .icon-shape,#mermaid-svg-AtRPansDzwInM2JC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AtRPansDzwInM2JC .icon-shape p,#mermaid-svg-AtRPansDzwInM2JC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AtRPansDzwInM2JC .icon-shape .label rect,#mermaid-svg-AtRPansDzwInM2JC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AtRPansDzwInM2JC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AtRPansDzwInM2JC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AtRPansDzwInM2JC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    RTT 观测 z_k

    x_est

    发送速率

    扰动 w交叉流量、T_noise 尖峰

    网络 plant排队系统

    观测器G1/G2/G3

    PROBE_BW 控制器pacing / cwnd

    Lemma O.1-O.3:观测器 ISS

    Lemma Q.1-Q.3 + 驻留时间:DRAIN 单调性、控制器 ISS

    Theorem 3:小增益闭环稳定

    统一耗散不等式 ΔV ≤ −αV + γ‖w‖²Theorem 5/6/7

    • Lemma O.1–O.3(观测器 ISS):噪声有界 → 估计误差有界;方向门控的单侧结构性;内生收敛检测;
    • Lemma Q.1–Q.3(DRAIN):队列在 DRAIN 期间严格单调下降;有限时间内清空(4 RTT 内);共存的交叉流量流不阻塞 DRAIN;
    • Theorem C.1:收敛是以上性质的推论,不是假设;
    • Theorem 3(小增益)、Theorem 5/6(ISS 级联 + 切换系统驻留时间):闭环的全局渐近稳定性。统一耗散不等式 ΔV ≤ −αV + γ‖w‖²,扰动 w 包含交叉流量与 T_noise 尖峰[README:Theorem 6];
    • Theorem 7:所有已实现的三类非线性机制(Type A 零扰动:jitter EWMA、G3 输出;Type B 有界向下修正:G1 复位、G2 截断、ECN 退避;Type C 有界暂态:G3 锁)都不破坏 ISS 耗散不等式,收缩因子 γ_window = 0.9701[README:Part III]。

    ISS 输入有界性有一个具体的工程支撑:jitter EWMA 被钳位在 max(min_rtt_us, KCC_RTT_SAMPLE_MAX_US) ≤ 500ms,保证进入观测器的所有量有界[README:Part III]。

    需要明确标注的边界:文档在附录开头与代码头注释中承认,包含全部非线性机制的端到端稳定性证明仍是进行中工作,计划路线是约化为 drift-plus-penalty 框架(Neely 2010)[tcp_kcc.c:header][README:Appendix A Disclaimer]。也就是说,第 4 节的估计器性质与第 5 节的线性化/级联分析有完整证明,但"最终版非线性代码的全闭环严格证明"尚未完成。这是文档自己的声明,不是本文的推断。

    6. 工程实现

    6.1 整体结构

    代码分两个时间尺度:每 ACK 快路径更新测量状态并计算 pacing/cwnd 目标,每轮(RTT)慢路径评估状态迁移并重算增益[README:State Machine Transitions]。所有计算都是定点整数:带宽用 BW_UNIT = 2²⁴(segments × 2²⁴ / μs),增益用 BBR_UNIT = 256(无量纲),RTT 估计用 kcc_scale = 1024 缩放[README:State Machine Transitions]。数值不变量在文档中有专门清单:除零保护、u64 溢出守卫、计数器饱和、极端路径参数(1μs 下限、4.2s 饱和、BW→0 停发)[README:Numerical Invariants]。

    6.2 外层 FSM 与内层估计器

    外层是 BBR 兼容的三状态机(STARTUP → DRAIN → PROBE_BW,无 PROBE_RTT)[tcp_kcc.c:2983-2988]:

    STARTUP(2.89× 加速,找带宽)
    └─ full_bw_reached:连续 3 轮 max_bw 增长 < 1.25×
    DRAIN(0.347× 减速,排空队列)
    └─ inflight ≤ BDP 且超时(AND-gate + 4-RTT 安全超时)
    PROBE_BW(8 相位固定增益 [1.25, 0.75, 1.0×6],进入时相位随机化 8−1−rand(8))

    #mermaid-svg-oEiVSLUrrlXJIC0J{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oEiVSLUrrlXJIC0J .error-icon{fill:#552222;}#mermaid-svg-oEiVSLUrrlXJIC0J .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oEiVSLUrrlXJIC0J .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oEiVSLUrrlXJIC0J .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J .marker.cross{stroke:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oEiVSLUrrlXJIC0J p{margin:0;}#mermaid-svg-oEiVSLUrrlXJIC0J defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-oEiVSLUrrlXJIC0J g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-oEiVSLUrrlXJIC0J g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-oEiVSLUrrlXJIC0J g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-oEiVSLUrrlXJIC0J g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-oEiVSLUrrlXJIC0J .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-oEiVSLUrrlXJIC0J .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-oEiVSLUrrlXJIC0J .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-oEiVSLUrrlXJIC0J .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-oEiVSLUrrlXJIC0J .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-oEiVSLUrrlXJIC0J .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oEiVSLUrrlXJIC0J .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oEiVSLUrrlXJIC0J .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oEiVSLUrrlXJIC0J .edgeLabel .label text{fill:#333;}#mermaid-svg-oEiVSLUrrlXJIC0J .label div .edgeLabel{color:#333;}#mermaid-svg-oEiVSLUrrlXJIC0J .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-oEiVSLUrrlXJIC0J .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-oEiVSLUrrlXJIC0J .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-oEiVSLUrrlXJIC0J .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J #statediagram-barbEnd{fill:#333333;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oEiVSLUrrlXJIC0J .cluster-label,#mermaid-svg-oEiVSLUrrlXJIC0J .nodeLabel{color:#131300;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-oEiVSLUrrlXJIC0J .note-edge{stroke-dasharray:5;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-note text{fill:black;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram-note .nodeLabel{color:black;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagram .edgeLabel{color:red;}#mermaid-svg-oEiVSLUrrlXJIC0J #dependencyStart,#mermaid-svg-oEiVSLUrrlXJIC0J #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-oEiVSLUrrlXJIC0J .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oEiVSLUrrlXJIC0J :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    连接建立

    full_bw_reached连续 3 轮增长低于 1.25×

    inflight ≤ BDP 且超时AND-gate + 4-RTT 安全超时

    8 相位 1.25/0.75/1.0×6

    TCP_CA_Loss

    TCP_CA_Loss

    TCP_CA_Loss

    full_bw_reset

    LT_active

    STARTUP

    DRAIN

    PROBE_BW

    LOSS

    PROBE_BW 的相位增益是编译期常量,不是运行时参数[README:Outer FSM]。内层估计器是 COLD START → CONVERGING → CONVERGED 三态(sample_cnt ≥ 5 进入 CONVERGED,子门控使能)[README:Inner Estimator FSM]。min_rtt 窗口方面,KCC 用 128 轮 G3 观察窗替代 BBR 的 10s 窗口,窗口到期且 x_est 未越界时把 x_est 拉回 95% × min_rtt,防止 G2 几何漂移在长窗口内累积出虚假的 slow 越界[README:Min-RTT window]。

    6.3 ACK 聚合补偿(7.5ms 门限)

    TSO/LRO 会造成 ACK 静默期,静默期内 pacing 机制得不到反馈,速率可能掉到物理瓶颈之下。KCC 采用与 BBRv3 相同的单层补偿模式:target_cwnd = BDP + gain × extra_acked,extra_acked 在 5-RTT 双槽旋转窗口内取最大值,补偿量上限 bw × 100ms[README:ACK Aggregation Compensation]。

    启用门限就是 7.5ms:只有当 min_rtt ≥ KCC_FAST_ONLY_THRESH_US 时补偿才生效[tcp_kcc.c:4041]。理由在代码注释里写得很清楚:低延迟路径(<7.5ms)上 ACK 静默时间远小于 RTT,管道自愈,补偿只会变成纯 cwnd 膨胀[tcp_kcc.c:4030-4031]。仓库记录了一个用户实测数据:1ms 内网链路上,补偿关闭时 0 重传 @ 840 Mbps;内核 BBR(带补偿)736 重传;KCC 早期版本的"双补偿"结构(已被移除)2531–3884 重传、cwnd 膨胀到 100× BDP[README:ACK Aggregation Compensation]。在 50–250ms 的国际链路上补偿是必要的,且 bw × 100ms 上限只要求覆盖物理 ACK 静默窗口(≤ 100ms),不是整个 RTT。

    6.4 带宽估计与 LT-BW(5ms 阈值)

    带宽主估计是 10 轮滑动窗口最大值(minmax_running_max)。LT-BW 是损失触发的下限估计:采样区间 [4, 16] RTT,损失率 ≥ 25/256 ≈ 9.77% 时有效,更新用可配置 EMA(默认 1/2),与 BBR 的算术平均不同;激活条件也比 BBR 严格——首个有效区间只记录不激活,需与后续区间一致才置 lt_use_bw[README:LT Bandwidth Estimation]。

    LT-BW 激活前要过双阈值拥塞门,其中瞬时通道就是 5ms:srtt_us − min_rtt_us > 5000μs(与持久通道 qdelay_avg 超过动态拥塞阈值同时满足才中止采样)[README:LT Bandwidth Estimation]。这个 5000μs 在 BBRv1 里也有(google/patch/tcp_bbr1.c:706),是网络工程中"RTT 突增多少算异常"的习惯值,KCC 沿用了同一量级。

    6.5 其他机制

    • ECN:默认关闭(kcc_ecn_enable = 0)。文档的理由是:ECN 来自未知交换机、未知阈值、未知时延的 1 比特信号,而方向门控在 qdelay 上升的第一微秒就能感知,ECN 在单交换机路径之外不增加信息。启用需要五条件同时满足,退避幅度 20%,探测相位内按 BBR_UNIT²/pacing_gain 渐变(1.25× 时约 80% 退避,STARTUP 2.89× 时约 35%),EWMA 权重 3/4(比 BBRv1 的 1/16 快 4 倍,因为二进制信号应当触发比例响应而不是被平均掉)[README:ECN Backoff];
    • TSO 分片自适应:TSO divisor 基值 8,估计器收敛且 jitter_ewma < 1ms 时减半(4,更大的突发),jitter_ewma > 4ms 时加倍(16,抑制抖动);搜索空间直径 log₂(32/2) = 4 步,每步约一个 PROBE_BW 周期,收敛 ≤ 32 RTT[README:TSO Divisor Adaptation];
    • 全局 KCC 转发(KF):可选的跨连接带宽共享,新连接以公平份额种子初始化,χ² 创新门剔除异常;代码注释明说非原子读-改-写是有意取舍,影响上界为一个连接的冷启动种子,不值得为每 ACK 加锁[README:Global estimated BDP Filter];
    • 诊断接口:/proc/kcc/status 提供逐连接状态快照;ext_fail > 0 表示部分连接因内存不足运行在降级模式(无估计器扩展态)[README:Part III];
    • 模块参数:关键运行参数在 /sys/module/tcp_kcc/parameters/(kcc_ecn_enable、kcc_drain_and_or_mode、kcc_probe_bw_up_limit、kcc_kf_enable、kcc_lt_bw_ema_num/den 等),其余大量常数是编译期 #define[README:Reading Guide]。

    7. 验证:41 个脚本与 114 组配置

    仓库 .research/ 目录下的验证工作分两层:

    第一层,独立脚本验证。 2026-07-19 的最终审计跑完 41 个验证脚本,41 PASS、0 FAIL、3 个警告(低 RTT 漂移与溢出守卫的极端情形)[.research/FINAL_AUDIT_RESULTS.md]。累计测试量:路径检测 >4000 例、拥塞/噪声 >10000 例、死锁恢复 >2000 例、公式/算术检查 >200 项。边界条件表 B1–B51 逐个有证明或残余误差界(冷启动最坏误差 ≤ 0.76×T_prop、持续队列下 BDP 误差 ≤ min(Q_t) 等)[README:Boundary Condition Proofs]。几个关键保证:H0 下 G3 误触发率 0.0000%(仿真)、路径增加检测中位数 3–5 RTT、单流 BDP ≤ min_rtt(0% 高估)、450% BDP 膨胀后死锁恢复率 100%、整数公式 ±1 LSB[.research/FINAL_AUDIT_RESULTS.md]。

    #mermaid-svg-GfHyxt5X4iXxkDJr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GfHyxt5X4iXxkDJr .error-icon{fill:#552222;}#mermaid-svg-GfHyxt5X4iXxkDJr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GfHyxt5X4iXxkDJr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GfHyxt5X4iXxkDJr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GfHyxt5X4iXxkDJr .marker.cross{stroke:#333333;}#mermaid-svg-GfHyxt5X4iXxkDJr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GfHyxt5X4iXxkDJr p{margin:0;}#mermaid-svg-GfHyxt5X4iXxkDJr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster-label text{fill:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster-label span{color:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster-label span p{background-color:transparent;}#mermaid-svg-GfHyxt5X4iXxkDJr .label text,#mermaid-svg-GfHyxt5X4iXxkDJr span{fill:#333;color:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr .node rect,#mermaid-svg-GfHyxt5X4iXxkDJr .node circle,#mermaid-svg-GfHyxt5X4iXxkDJr .node ellipse,#mermaid-svg-GfHyxt5X4iXxkDJr .node polygon,#mermaid-svg-GfHyxt5X4iXxkDJr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GfHyxt5X4iXxkDJr .rough-node .label text,#mermaid-svg-GfHyxt5X4iXxkDJr .node .label text,#mermaid-svg-GfHyxt5X4iXxkDJr .image-shape .label,#mermaid-svg-GfHyxt5X4iXxkDJr .icon-shape .label{text-anchor:middle;}#mermaid-svg-GfHyxt5X4iXxkDJr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GfHyxt5X4iXxkDJr .rough-node .label,#mermaid-svg-GfHyxt5X4iXxkDJr .node .label,#mermaid-svg-GfHyxt5X4iXxkDJr .image-shape .label,#mermaid-svg-GfHyxt5X4iXxkDJr .icon-shape .label{text-align:center;}#mermaid-svg-GfHyxt5X4iXxkDJr .node.clickable{cursor:pointer;}#mermaid-svg-GfHyxt5X4iXxkDJr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GfHyxt5X4iXxkDJr .arrowheadPath{fill:#333333;}#mermaid-svg-GfHyxt5X4iXxkDJr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GfHyxt5X4iXxkDJr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GfHyxt5X4iXxkDJr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GfHyxt5X4iXxkDJr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GfHyxt5X4iXxkDJr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GfHyxt5X4iXxkDJr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster text{fill:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr .cluster span{color:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GfHyxt5X4iXxkDJr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GfHyxt5X4iXxkDJr rect.text{fill:none;stroke-width:0;}#mermaid-svg-GfHyxt5X4iXxkDJr .icon-shape,#mermaid-svg-GfHyxt5X4iXxkDJr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GfHyxt5X4iXxkDJr .icon-shape p,#mermaid-svg-GfHyxt5X4iXxkDJr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GfHyxt5X4iXxkDJr .icon-shape .label rect,#mermaid-svg-GfHyxt5X4iXxkDJr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GfHyxt5X4iXxkDJr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GfHyxt5X4iXxkDJr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GfHyxt5X4iXxkDJr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    tcp_kcc.c:行为为权威参考

    离散事件仿真.research/ 41 脚本全 PASS

    路径检测 >4000 例检测中位 3-5 RTT

    拥塞/噪声 >10000 例G3 误触发 0.0000%(H0)

    死锁恢复 >2000 例100% 恢复

    公式/算术 >200 项±1 LSB

    114 配置吞吐 >96%0 异常

    局限:全部为仿真无真实网络部署数据

    第二层,算法级仿真。 114 组配置(覆盖 1μs–1s 的 RTT 全谱)下吞吐保持 >96%、0 异常[tcp_kcc.c:header];G3 阈值用 20 亿样本的实噪声模型仿真校准[README:Proof B]。

    这里必须画一条界限:以上全部是离散事件仿真,仓库内没有任何真实网络部署测量的数据。仿真的价值是验证逻辑一致性(公式、状态机、边界条件),但它不能回答"在真实互联网上表现如何"——这正是第 9 节要展开的局限。另外,多流场景(N ≥ 8)下 min_rtt_us 本身可能因持续交叉流量排队而高估真实 T_prop,审计报告对此有明确记录:BDP 仍受 min_rtt_us 约束,但可能超过真实物理 BDP[.research/FINAL_AUDIT_RESULTS.md]。

    8. 与 BBR 的关系

    KCC 与 BBR 的关系需要分两层说。

    模型层。 BBRv1 的 RTT 模型 RTT = RTprop + η(t)(η ≥ 0)是隐式的两分量模型,是三分量模型的退化情形:它没有 T_noise 的结构化表示,RTprop 用滑动窗口最小值估计。在三分量视角下,min[t≤T](T_queue + T_noise) > 0 时 RTprop 被两者之和污染——向上噪声在 10s 窗口内存活,基线缓慢上漂[README:Proof M]。KCC 的 G1/G2/G3 结构正是针对这个缺陷:向下即时吸收、向上截断增长、路径变化用 SPRT 确认而非窗口最小值。

    工程层。 两者的差异集中在几个具体机制[README:Behavioral Differences from BBRv1]:

    机制BBRv1KCC
    DRAIN 退出 OR-gate(超时或 inflight ≤ BDP) AND-gate + 4-RTT 安全超时
    RTT 估计 10s 窗口 min_rtt geodesic x_est + min_rtt 下限(model_rtt = min(x_est, min_rtt))
    路径变化检测 无独立机制 G3 双阈值 SPRT
    ECN 逐包减窗 EWMA 比例退避,默认关闭
    带宽估计 滑动窗口最大 滑动窗口最大 + LT-BW
    ACK 聚合 无(BBRv3 才有) BBRv3 单层补偿,≥7.5ms 启用

    DRAIN 的 AND-gate 是其中最有故事的一个:BBR 的 OR-gate 允许并发流在另一条流的 PROBE_UP 残余队列还在瓶颈缓冲区时退出 DRAIN,残余跨周期累积,约 10 个 PROBE_BW 周期后聚合队列达 ~3×BDP,触发丢包和吞吐崩溃;KCC 要求计时与 inflight 条件同时满足,每条流彻底排空后才允许重新进入 PROBE_BW[README:Key Difference Details]。

    还要说清楚集成层的事实:外层 FSM 与 BBR 兼容,这是 TCP 栈集成适配,不是机制继承;内层所有机制(传播时延估计、三分量分离、G1/G2/G3、LT-BW、ACK 聚合补偿、ECN 退避)都是独立设计的[README:Introduction]。ss 诊断中 KCC 可能显示为 bbr,这是接口兼容的结果,需要用 sysctl net.ipv4.tcp_congestion_control 确认实际生效的算法[README:Quick Verification]。

    9. 局限与未完成的工作

    以下全部来自仓库自身文档,逐条引用:

  • 端到端稳定性证明未完成。 含全部非线性机制的闭环稳定性证明是进行中工作(约化为 drift-plus-penalty,Neely 2010)[tcp_kcc.c:header];
  • FIM 论证是下界而非全程。 基于固定参数瞬时模型;时间维度的变化(队列变动而 T_prop 恒定)提供瞬时预测之外的实用分离途径[README:Appendix A Disclaimer];
  • 无线场景的分类边界是近似的。 拥塞触发的 L2 重传与纯噪声重传的界限,在重度拥塞的无线环境下是模糊的,README 明确说该分类"approximate"[README:Definition 1];
  • 没有真实网络部署数据。 全部验证是仿真;12.2% 与 6/7 计数的最终取值经过仿真筛选,本质是经验校准;
  • 前后向队列不可区分。 标量 RTT 无法区分正向队列与反向队列,这是任何单 RTT 观测端到端协议的信息论限制,不是 KCC 特有缺陷;解决需要 OWD 测量、QUIC spin-bit 或显式队列遥测[README:Proof I];
  • 路径不对称导致 BDP 保守膨胀。 最坏情形(1ms 正向 + 250ms 反向)膨胀比约 251×,但只是 cwnd 上界,不会欠利用;pacing 由带宽估计驱动,不受影响[README:Proof I];
  • 多流下 min_rtt 可能高估。 N ≥ 8 流持续交叉排队时,min_rtt_us 本身漂移[.research/FINAL_AUDIT_RESULTS.md];
  • G3 误触发界是近似值。 连续 RTT 样本在拥塞时段内共享队列状态、不独立,Chebyshev 界是保守估计而非精确值[README:Part I];
  • ECN 适用范围窄。 仅对已知一致 AQM 配置的单交换机路径有效,其余路径 ECN 默认关闭[README:ECN Backoff];
  • 极端数值边界。 RTT > 4.2s 时 x_est 饱和;BW → 0 时连接停发直至带宽恢复[README:Numerical Invariants]。
  • 10. 结论

    KCC 的核心主张可以压缩成一句:拥塞控制是推断问题,而三分量行为学分解是标量 RTT 观测下这个推断问题的最小完备模型——四分量秩亏、两分量噪声污染、三分量在行为学先验下满秩且唯一。测地线估计器把这个结论落实成 O(1) 的单状态三分支更新,噪声免疫是结构性的(方向不对称)而不是参数化的(阈值门),这是它与经典估计器路线最本质的差别。实现层面,它是一段独立的、与 BBR 接口兼容的 Linux 内核模块,工程细节(定点运算、数值守卫、区域化检测、补偿门限)都有文档支撑。验证以仿真为主,规模不小,但真实网络表现仍未实测。判断它的价值,应当基于第 4、5 节的证明边界与第 9 节的局限清单,而不是任何性能声明——仓库自己的文档也是这么要求读者的。


    参考文献

    外部文献(仓库文档引用):

  • Keshav, S. “Congestion Control in Computer Networks.” Ph.D. Thesis, UC Berkeley, 1991.
  • RFC 9438, “Evaluation of Congestion Control Algorithms.” IETF, 2023.
  • Rao, C.R. “Information and Accuracy Attainable in the Estimation of Statistical Parameters.” Bulletin of the Calcutta Mathematical Society, 37:81–91, 1945.
  • Cramer, H. Mathematical Methods of Statistics. Princeton University Press, 1946.
  • Cover, T.M., Thomas, J.A. Elements of Information Theory, 2nd ed. Wiley, 2006.
  • Tobin, J. “Estimation of Relationships for Limited Dependent Variables.” Econometrica, 26(1):24–36, 1958.
  • Lindley, D.V. “The Theory of Queues with a Single Server.” Mathematical Proceedings of the Cambridge Philosophical Society, 48(2):277–289, 1952.
  • Cardwell, N., et al. “BBR: Congestion-Based Congestion Control.” ACM Queue 14(5), 2016.
  • Hollot, C.V., et al. “A Control Theoretic Analysis of RED.” IEEE INFOCOM, 2002.
  • Neely, M.J. Stochastic Network Optimization with Application to Communication and Queueing Systems. Morgan & Claypool, 2010.
  • Sontag, E.D., Wang, Y. “On Characterizations of the Input-to-State Stability Property.” Systems & Control Letters, 24(5):351–359, 1995.
  • Jiang, Z.-P., Mareels, I. “A Small-Gain Control Method for Nonlinear Cascaded Systems with Dynamic Uncertainties.” IEEE TAC, 42(3):292–308, 1997.
  • Dashkovskiy, S., Ruffer, B.S., Wirth, F.R. “An ISS Small Gain Theorem for General Networks.” Mathematics of Control, Signals, and Systems, 19(2):93–122, 2007.
  • Liberzon, D. Switching in Systems and Control. Birkhauser, 2003.
  • Simon, D. “Kalman Filtering with State Constraints: A Survey of Linear and Nonlinear Algorithms.” IET Control Theory & Applications, 4(8):1303–1318, 2010.
  • Gupta, N., Hauser, R. “Kalman Filtering with Equality and Inequality State Constraints.” arXiv:0709.2791, 2007.
  • Anderson, B.D.O., Moore, J.B. Optimal Filtering. Prentice-Hall, 1979.
  • Self, S.G., Liang, K.-Y. “Asymptotic Properties of Maximum Likelihood Estimators and Likelihood Ratio Tests under Nonstandard Conditions.” JASA, 82(398):605–610, 1987.
  • Smith, R.L. “Maximum Likelihood Estimation in a Class of Nonregular Cases.” Biometrika, 72(1):67–90, 1985.
  • 仓库内部文献:

  • README.md — 2150 行,设计论证(Part I)、稳定性证明(Part II)、工程实现(Part III)、附录 A。
  • tcp_kcc.c — 5485 行,含公理 A1–A4、证明 B/E/E1/F/L/M、边界条件 B1–B51、定理 G1–G4。
  • .research/FINAL_AUDIT_RESULTS.md — 41 个验证脚本的最终审计结果(2026-07-19)。
  • google/patch/tcp_bbr1.c — BBRv1 参考实现副本,用于对照(如 5000μs 阈值)。
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » TCP KCC 2.0:三分量 RTT 分解与测地线拥塞控制
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!