KCC 拥塞控制算法缺陷修复记录
提交: c45fc62(2026-07-05) · 文件: tcp_kcc.c (+465/−174), README.md (+20/−12)
1. DRAIN 阶段永久卡死
问题
DRAIN 排出速率为 (1−gdrain)C=0.653C(1 - g_{\text{drain}})C = 0.653C(1−gdrain)C=0.653C,退出条件为 inflight ≤ BDP。当持续交叉流量占据瓶颈缓冲区,inflight 无法下降到目标值,连接永久滞留 DRAIN。
#mermaid-svg-r8f9CKhiLPYsxojj{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-r8f9CKhiLPYsxojj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-r8f9CKhiLPYsxojj .error-icon{fill:#552222;}#mermaid-svg-r8f9CKhiLPYsxojj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r8f9CKhiLPYsxojj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r8f9CKhiLPYsxojj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r8f9CKhiLPYsxojj .marker.cross{stroke:#333333;}#mermaid-svg-r8f9CKhiLPYsxojj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r8f9CKhiLPYsxojj p{margin:0;}#mermaid-svg-r8f9CKhiLPYsxojj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r8f9CKhiLPYsxojj .cluster-label text{fill:#333;}#mermaid-svg-r8f9CKhiLPYsxojj .cluster-label span{color:#333;}#mermaid-svg-r8f9CKhiLPYsxojj .cluster-label span p{background-color:transparent;}#mermaid-svg-r8f9CKhiLPYsxojj .label text,#mermaid-svg-r8f9CKhiLPYsxojj span{fill:#333;color:#333;}#mermaid-svg-r8f9CKhiLPYsxojj .node rect,#mermaid-svg-r8f9CKhiLPYsxojj .node circle,#mermaid-svg-r8f9CKhiLPYsxojj .node ellipse,#mermaid-svg-r8f9CKhiLPYsxojj .node polygon,#mermaid-svg-r8f9CKhiLPYsxojj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r8f9CKhiLPYsxojj .rough-node .label text,#mermaid-svg-r8f9CKhiLPYsxojj .node .label text,#mermaid-svg-r8f9CKhiLPYsxojj .image-shape .label,#mermaid-svg-r8f9CKhiLPYsxojj .icon-shape .label{text-anchor:middle;}#mermaid-svg-r8f9CKhiLPYsxojj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-r8f9CKhiLPYsxojj .rough-node .label,#mermaid-svg-r8f9CKhiLPYsxojj .node .label,#mermaid-svg-r8f9CKhiLPYsxojj .image-shape .label,#mermaid-svg-r8f9CKhiLPYsxojj .icon-shape .label{text-align:center;}#mermaid-svg-r8f9CKhiLPYsxojj .node.clickable{cursor:pointer;}#mermaid-svg-r8f9CKhiLPYsxojj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-r8f9CKhiLPYsxojj .arrowheadPath{fill:#333333;}#mermaid-svg-r8f9CKhiLPYsxojj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r8f9CKhiLPYsxojj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r8f9CKhiLPYsxojj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r8f9CKhiLPYsxojj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-r8f9CKhiLPYsxojj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r8f9CKhiLPYsxojj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-r8f9CKhiLPYsxojj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r8f9CKhiLPYsxojj .cluster text{fill:#333;}#mermaid-svg-r8f9CKhiLPYsxojj .cluster span{color:#333;}#mermaid-svg-r8f9CKhiLPYsxojj 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-r8f9CKhiLPYsxojj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-r8f9CKhiLPYsxojj rect.text{fill:none;stroke-width:0;}#mermaid-svg-r8f9CKhiLPYsxojj .icon-shape,#mermaid-svg-r8f9CKhiLPYsxojj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r8f9CKhiLPYsxojj .icon-shape p,#mermaid-svg-r8f9CKhiLPYsxojj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-r8f9CKhiLPYsxojj .icon-shape .label rect,#mermaid-svg-r8f9CKhiLPYsxojj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r8f9CKhiLPYsxojj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-r8f9CKhiLPYsxojj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-r8f9CKhiLPYsxojj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} full_bw
inflight ≤ BDP
交叉流量阻止 inflight 下降
原有代码: 无退出机制
STARTUP
DRAIN
PROBE_BW
修复
#mermaid-svg-uNIgxchFBfWZWT1E{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-uNIgxchFBfWZWT1E .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uNIgxchFBfWZWT1E .error-icon{fill:#552222;}#mermaid-svg-uNIgxchFBfWZWT1E .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uNIgxchFBfWZWT1E .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uNIgxchFBfWZWT1E .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uNIgxchFBfWZWT1E .marker.cross{stroke:#333333;}#mermaid-svg-uNIgxchFBfWZWT1E svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uNIgxchFBfWZWT1E p{margin:0;}#mermaid-svg-uNIgxchFBfWZWT1E .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uNIgxchFBfWZWT1E .cluster-label text{fill:#333;}#mermaid-svg-uNIgxchFBfWZWT1E .cluster-label span{color:#333;}#mermaid-svg-uNIgxchFBfWZWT1E .cluster-label span p{background-color:transparent;}#mermaid-svg-uNIgxchFBfWZWT1E .label text,#mermaid-svg-uNIgxchFBfWZWT1E span{fill:#333;color:#333;}#mermaid-svg-uNIgxchFBfWZWT1E .node rect,#mermaid-svg-uNIgxchFBfWZWT1E .node circle,#mermaid-svg-uNIgxchFBfWZWT1E .node ellipse,#mermaid-svg-uNIgxchFBfWZWT1E .node polygon,#mermaid-svg-uNIgxchFBfWZWT1E .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uNIgxchFBfWZWT1E .rough-node .label text,#mermaid-svg-uNIgxchFBfWZWT1E .node .label text,#mermaid-svg-uNIgxchFBfWZWT1E .image-shape .label,#mermaid-svg-uNIgxchFBfWZWT1E .icon-shape .label{text-anchor:middle;}#mermaid-svg-uNIgxchFBfWZWT1E .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uNIgxchFBfWZWT1E .rough-node .label,#mermaid-svg-uNIgxchFBfWZWT1E .node .label,#mermaid-svg-uNIgxchFBfWZWT1E .image-shape .label,#mermaid-svg-uNIgxchFBfWZWT1E .icon-shape .label{text-align:center;}#mermaid-svg-uNIgxchFBfWZWT1E .node.clickable{cursor:pointer;}#mermaid-svg-uNIgxchFBfWZWT1E .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uNIgxchFBfWZWT1E .arrowheadPath{fill:#333333;}#mermaid-svg-uNIgxchFBfWZWT1E .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uNIgxchFBfWZWT1E .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uNIgxchFBfWZWT1E .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uNIgxchFBfWZWT1E .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uNIgxchFBfWZWT1E .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uNIgxchFBfWZWT1E .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uNIgxchFBfWZWT1E .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uNIgxchFBfWZWT1E .cluster text{fill:#333;}#mermaid-svg-uNIgxchFBfWZWT1E .cluster span{color:#333;}#mermaid-svg-uNIgxchFBfWZWT1E 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-uNIgxchFBfWZWT1E .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uNIgxchFBfWZWT1E rect.text{fill:none;stroke-width:0;}#mermaid-svg-uNIgxchFBfWZWT1E .icon-shape,#mermaid-svg-uNIgxchFBfWZWT1E .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uNIgxchFBfWZWT1E .icon-shape p,#mermaid-svg-uNIgxchFBfWZWT1E .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uNIgxchFBfWZWT1E .icon-shape .label rect,#mermaid-svg-uNIgxchFBfWZWT1E .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uNIgxchFBfWZWT1E .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uNIgxchFBfWZWT1E .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uNIgxchFBfWZWT1E :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} full_bw
inflight ≤ BDP
drain_rtt_cnt ≥ timeout
kcc_reset_mode
STARTUP
DRAIN
PROBE_BW
新增 kcc_drain_timeout_rtts 参数(默认 24),round_start 每轮递增计数器,超过阈值后调用 kcc_reset_mode 强制进入 PROBE_BW。
推导
tdrain=BDP(1−gdrain)C=C⋅Tprop0.653C=1.53 Tprop≈1.5 RTTt_{\text{drain}} = \frac{\text{BDP}}{(1-g_{\text{drain}})C} = \frac{C \cdot T_{\text{prop}}}{0.653C} = 1.53\;T_{\text{prop}} \approx 1.5\;\text{RTT}tdrain=(1−gdrain)CBDP=0.653CC⋅Tprop=1.53Tprop≈1.5RTT
取 3σ3\sigma3σ 安全系数覆盖多流干扰:3×1.53=4.63 \times 1.53 = 4.63×1.53=4.6 RTT。24 = 3 × 2³,提供 15.7 倍余量。5 位 bitfield drain_rtt_cnt : 5 上限 31,24 留有调大余地。默认值在所有 RTT 下均安全------数据中心 120 ms,WAN 2.4 s,卫星 14.4 s。
kcc_probe_up_max_rtts(默认 16)同理:1.25× 步速超额 0.25C,填满 BDP 需 4 RTT,3σ → 12,向上取 2 的幂得 16。
2. Tier-2 漂移零值死循环
问题
Tier-2 漂移触发条件 pos_skip_cnt ≥ drift_thresh × tier2_mult = 56,修正量 drift_corr = abs_innov >> 3。当 abs_innov < 8,右移三位量化为零。漂移机制消耗了一个完整周期(56 skips),x_est 无变化,pos_skip_cnt 被重置,此后重复空转。
#mermaid-svg-aGQeS55EFGsJCFnM{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-aGQeS55EFGsJCFnM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-aGQeS55EFGsJCFnM .error-icon{fill:#552222;}#mermaid-svg-aGQeS55EFGsJCFnM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-aGQeS55EFGsJCFnM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-aGQeS55EFGsJCFnM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-aGQeS55EFGsJCFnM .marker.cross{stroke:#333333;}#mermaid-svg-aGQeS55EFGsJCFnM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-aGQeS55EFGsJCFnM p{margin:0;}#mermaid-svg-aGQeS55EFGsJCFnM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-aGQeS55EFGsJCFnM .cluster-label text{fill:#333;}#mermaid-svg-aGQeS55EFGsJCFnM .cluster-label span{color:#333;}#mermaid-svg-aGQeS55EFGsJCFnM .cluster-label span p{background-color:transparent;}#mermaid-svg-aGQeS55EFGsJCFnM .label text,#mermaid-svg-aGQeS55EFGsJCFnM span{fill:#333;color:#333;}#mermaid-svg-aGQeS55EFGsJCFnM .node rect,#mermaid-svg-aGQeS55EFGsJCFnM .node circle,#mermaid-svg-aGQeS55EFGsJCFnM .node ellipse,#mermaid-svg-aGQeS55EFGsJCFnM .node polygon,#mermaid-svg-aGQeS55EFGsJCFnM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-aGQeS55EFGsJCFnM .rough-node .label text,#mermaid-svg-aGQeS55EFGsJCFnM .node .label text,#mermaid-svg-aGQeS55EFGsJCFnM .image-shape .label,#mermaid-svg-aGQeS55EFGsJCFnM .icon-shape .label{text-anchor:middle;}#mermaid-svg-aGQeS55EFGsJCFnM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-aGQeS55EFGsJCFnM .rough-node .label,#mermaid-svg-aGQeS55EFGsJCFnM .node .label,#mermaid-svg-aGQeS55EFGsJCFnM .image-shape .label,#mermaid-svg-aGQeS55EFGsJCFnM .icon-shape .label{text-align:center;}#mermaid-svg-aGQeS55EFGsJCFnM .node.clickable{cursor:pointer;}#mermaid-svg-aGQeS55EFGsJCFnM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-aGQeS55EFGsJCFnM .arrowheadPath{fill:#333333;}#mermaid-svg-aGQeS55EFGsJCFnM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-aGQeS55EFGsJCFnM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-aGQeS55EFGsJCFnM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGQeS55EFGsJCFnM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-aGQeS55EFGsJCFnM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGQeS55EFGsJCFnM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-aGQeS55EFGsJCFnM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-aGQeS55EFGsJCFnM .cluster text{fill:#333;}#mermaid-svg-aGQeS55EFGsJCFnM .cluster span{color:#333;}#mermaid-svg-aGQeS55EFGsJCFnM 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-aGQeS55EFGsJCFnM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-aGQeS55EFGsJCFnM rect.text{fill:none;stroke-width:0;}#mermaid-svg-aGQeS55EFGsJCFnM .icon-shape,#mermaid-svg-aGQeS55EFGsJCFnM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-aGQeS55EFGsJCFnM .icon-shape p,#mermaid-svg-aGQeS55EFGsJCFnM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-aGQeS55EFGsJCFnM .icon-shape .label rect,#mermaid-svg-aGQeS55EFGsJCFnM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-aGQeS55EFGsJCFnM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-aGQeS55EFGsJCFnM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-aGQeS55EFGsJCFnM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
重新累积 56 skips
否
pos_skip_cnt ≥ 56
drift_corr = abs_innov >> 3
abs_innov < 8 ?
drift_corr = 0
x_updated = true
pos_skip_cnt = 0
x_est 无变化
x_est += corr/8
修复
#mermaid-svg-iis8apS3Cjvo4Cqf{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-iis8apS3Cjvo4Cqf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iis8apS3Cjvo4Cqf .error-icon{fill:#552222;}#mermaid-svg-iis8apS3Cjvo4Cqf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iis8apS3Cjvo4Cqf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iis8apS3Cjvo4Cqf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iis8apS3Cjvo4Cqf .marker.cross{stroke:#333333;}#mermaid-svg-iis8apS3Cjvo4Cqf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iis8apS3Cjvo4Cqf p{margin:0;}#mermaid-svg-iis8apS3Cjvo4Cqf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster-label text{fill:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster-label span{color:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster-label span p{background-color:transparent;}#mermaid-svg-iis8apS3Cjvo4Cqf .label text,#mermaid-svg-iis8apS3Cjvo4Cqf span{fill:#333;color:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf .node rect,#mermaid-svg-iis8apS3Cjvo4Cqf .node circle,#mermaid-svg-iis8apS3Cjvo4Cqf .node ellipse,#mermaid-svg-iis8apS3Cjvo4Cqf .node polygon,#mermaid-svg-iis8apS3Cjvo4Cqf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iis8apS3Cjvo4Cqf .rough-node .label text,#mermaid-svg-iis8apS3Cjvo4Cqf .node .label text,#mermaid-svg-iis8apS3Cjvo4Cqf .image-shape .label,#mermaid-svg-iis8apS3Cjvo4Cqf .icon-shape .label{text-anchor:middle;}#mermaid-svg-iis8apS3Cjvo4Cqf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iis8apS3Cjvo4Cqf .rough-node .label,#mermaid-svg-iis8apS3Cjvo4Cqf .node .label,#mermaid-svg-iis8apS3Cjvo4Cqf .image-shape .label,#mermaid-svg-iis8apS3Cjvo4Cqf .icon-shape .label{text-align:center;}#mermaid-svg-iis8apS3Cjvo4Cqf .node.clickable{cursor:pointer;}#mermaid-svg-iis8apS3Cjvo4Cqf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iis8apS3Cjvo4Cqf .arrowheadPath{fill:#333333;}#mermaid-svg-iis8apS3Cjvo4Cqf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iis8apS3Cjvo4Cqf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iis8apS3Cjvo4Cqf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iis8apS3Cjvo4Cqf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iis8apS3Cjvo4Cqf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iis8apS3Cjvo4Cqf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster text{fill:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf .cluster span{color:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf 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-iis8apS3Cjvo4Cqf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iis8apS3Cjvo4Cqf rect.text{fill:none;stroke-width:0;}#mermaid-svg-iis8apS3Cjvo4Cqf .icon-shape,#mermaid-svg-iis8apS3Cjvo4Cqf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iis8apS3Cjvo4Cqf .icon-shape p,#mermaid-svg-iis8apS3Cjvo4Cqf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iis8apS3Cjvo4Cqf .icon-shape .label rect,#mermaid-svg-iis8apS3Cjvo4Cqf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iis8apS3Cjvo4Cqf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iis8apS3Cjvo4Cqf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iis8apS3Cjvo4Cqf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
pos_skip_cnt ≥ 56
drift_corr = abs_innov >> 3
drift_corr == 0 ?
drift_corr = 1
x_est += 1 unit
p_est 随之衰减
x_est += corr/8
drift_corr 最小值为 1。1 个缩放单位(scale = 1024 时 ≈ 1 ns)物理可忽略,其价值在于确保有限状态推进------x_est 变化使 p_est 随之衰减,打破空转。早期漂移(shift = 2,abs_innov < 4 时 drift_corr = 0)同样添加 floor = 1 保护。
3. 抖动门禁结构性死区
问题
tier1_blocked_cnt 声明为 u8 字段,按抖动门禁拒绝递增,但无任何逻辑读取------死代码。持续噪声路径(无线 L2 重传、多租户 NIC)上每个样本被门禁拒绝。Tier-1 漂移需 14 次连续正向跳过来触发(约 41 RTT),但被门禁拒绝的样本不累积 pos_skip_cnt,漂移永远不触发,p_est 永不收敛。
#mermaid-svg-PrDv8HUknOhhyPCG{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-PrDv8HUknOhhyPCG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PrDv8HUknOhhyPCG .error-icon{fill:#552222;}#mermaid-svg-PrDv8HUknOhhyPCG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PrDv8HUknOhhyPCG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PrDv8HUknOhhyPCG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PrDv8HUknOhhyPCG .marker.cross{stroke:#333333;}#mermaid-svg-PrDv8HUknOhhyPCG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PrDv8HUknOhhyPCG p{margin:0;}#mermaid-svg-PrDv8HUknOhhyPCG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PrDv8HUknOhhyPCG .cluster-label text{fill:#333;}#mermaid-svg-PrDv8HUknOhhyPCG .cluster-label span{color:#333;}#mermaid-svg-PrDv8HUknOhhyPCG .cluster-label span p{background-color:transparent;}#mermaid-svg-PrDv8HUknOhhyPCG .label text,#mermaid-svg-PrDv8HUknOhhyPCG span{fill:#333;color:#333;}#mermaid-svg-PrDv8HUknOhhyPCG .node rect,#mermaid-svg-PrDv8HUknOhhyPCG .node circle,#mermaid-svg-PrDv8HUknOhhyPCG .node ellipse,#mermaid-svg-PrDv8HUknOhhyPCG .node polygon,#mermaid-svg-PrDv8HUknOhhyPCG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PrDv8HUknOhhyPCG .rough-node .label text,#mermaid-svg-PrDv8HUknOhhyPCG .node .label text,#mermaid-svg-PrDv8HUknOhhyPCG .image-shape .label,#mermaid-svg-PrDv8HUknOhhyPCG .icon-shape .label{text-anchor:middle;}#mermaid-svg-PrDv8HUknOhhyPCG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PrDv8HUknOhhyPCG .rough-node .label,#mermaid-svg-PrDv8HUknOhhyPCG .node .label,#mermaid-svg-PrDv8HUknOhhyPCG .image-shape .label,#mermaid-svg-PrDv8HUknOhhyPCG .icon-shape .label{text-align:center;}#mermaid-svg-PrDv8HUknOhhyPCG .node.clickable{cursor:pointer;}#mermaid-svg-PrDv8HUknOhhyPCG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PrDv8HUknOhhyPCG .arrowheadPath{fill:#333333;}#mermaid-svg-PrDv8HUknOhhyPCG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PrDv8HUknOhhyPCG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PrDv8HUknOhhyPCG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PrDv8HUknOhhyPCG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PrDv8HUknOhhyPCG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PrDv8HUknOhhyPCG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PrDv8HUknOhhyPCG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PrDv8HUknOhhyPCG .cluster text{fill:#333;}#mermaid-svg-PrDv8HUknOhhyPCG .cluster span{color:#333;}#mermaid-svg-PrDv8HUknOhhyPCG 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-PrDv8HUknOhhyPCG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PrDv8HUknOhhyPCG rect.text{fill:none;stroke-width:0;}#mermaid-svg-PrDv8HUknOhhyPCG .icon-shape,#mermaid-svg-PrDv8HUknOhhyPCG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PrDv8HUknOhhyPCG .icon-shape p,#mermaid-svg-PrDv8HUknOhhyPCG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PrDv8HUknOhhyPCG .icon-shape .label rect,#mermaid-svg-PrDv8HUknOhhyPCG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PrDv8HUknOhhyPCG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PrDv8HUknOhhyPCG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PrDv8HUknOhhyPCG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是, 通过
否, 阻塞
死循环
每个 RTT 样本
jitter < threshold ?
卡尔曼更新: p_est 收敛 ✓
pos_skip_cnt 不累积
漂移永远不触发
修复
#mermaid-svg-8MwuMg38CwBv1KjM{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-8MwuMg38CwBv1KjM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8MwuMg38CwBv1KjM .error-icon{fill:#552222;}#mermaid-svg-8MwuMg38CwBv1KjM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8MwuMg38CwBv1KjM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8MwuMg38CwBv1KjM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8MwuMg38CwBv1KjM .marker.cross{stroke:#333333;}#mermaid-svg-8MwuMg38CwBv1KjM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8MwuMg38CwBv1KjM p{margin:0;}#mermaid-svg-8MwuMg38CwBv1KjM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8MwuMg38CwBv1KjM .cluster-label text{fill:#333;}#mermaid-svg-8MwuMg38CwBv1KjM .cluster-label span{color:#333;}#mermaid-svg-8MwuMg38CwBv1KjM .cluster-label span p{background-color:transparent;}#mermaid-svg-8MwuMg38CwBv1KjM .label text,#mermaid-svg-8MwuMg38CwBv1KjM span{fill:#333;color:#333;}#mermaid-svg-8MwuMg38CwBv1KjM .node rect,#mermaid-svg-8MwuMg38CwBv1KjM .node circle,#mermaid-svg-8MwuMg38CwBv1KjM .node ellipse,#mermaid-svg-8MwuMg38CwBv1KjM .node polygon,#mermaid-svg-8MwuMg38CwBv1KjM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8MwuMg38CwBv1KjM .rough-node .label text,#mermaid-svg-8MwuMg38CwBv1KjM .node .label text,#mermaid-svg-8MwuMg38CwBv1KjM .image-shape .label,#mermaid-svg-8MwuMg38CwBv1KjM .icon-shape .label{text-anchor:middle;}#mermaid-svg-8MwuMg38CwBv1KjM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8MwuMg38CwBv1KjM .rough-node .label,#mermaid-svg-8MwuMg38CwBv1KjM .node .label,#mermaid-svg-8MwuMg38CwBv1KjM .image-shape .label,#mermaid-svg-8MwuMg38CwBv1KjM .icon-shape .label{text-align:center;}#mermaid-svg-8MwuMg38CwBv1KjM .node.clickable{cursor:pointer;}#mermaid-svg-8MwuMg38CwBv1KjM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8MwuMg38CwBv1KjM .arrowheadPath{fill:#333333;}#mermaid-svg-8MwuMg38CwBv1KjM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8MwuMg38CwBv1KjM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8MwuMg38CwBv1KjM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MwuMg38CwBv1KjM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8MwuMg38CwBv1KjM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MwuMg38CwBv1KjM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8MwuMg38CwBv1KjM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8MwuMg38CwBv1KjM .cluster text{fill:#333;}#mermaid-svg-8MwuMg38CwBv1KjM .cluster span{color:#333;}#mermaid-svg-8MwuMg38CwBv1KjM 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-8MwuMg38CwBv1KjM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8MwuMg38CwBv1KjM rect.text{fill:none;stroke-width:0;}#mermaid-svg-8MwuMg38CwBv1KjM .icon-shape,#mermaid-svg-8MwuMg38CwBv1KjM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MwuMg38CwBv1KjM .icon-shape p,#mermaid-svg-8MwuMg38CwBv1KjM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8MwuMg38CwBv1KjM .icon-shape .label rect,#mermaid-svg-8MwuMg38CwBv1KjM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MwuMg38CwBv1KjM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8MwuMg38CwBv1KjM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8MwuMg38CwBv1KjM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
否
是
每个 RTT 样本
jitter < threshold ?
卡尔曼更新 ✓
tier1_blocked_cnt++
blocked_cnt ≥ 3 ?
本次跳过
豁免抖动门禁
tier1_blocked_cnt 从死字段重新用作绕过计数器。新增 kcc_tier1_blocked_thresh(默认 3),连续 N 次门禁阻塞后豁免抖动条件。
推导 :死区 = 41 RTT。N = 3 时绕过时间 = 123 RTT。在 16 ms RTT 无线链路上约为 2 秒------匹配 3GPP 小区切换中断时长(1--3 s)。在对称噪声假设下,3 次连续阻塞的虚警概率为 2−3=12.5%2^{-3} = 12.5\%2−3=12.5%,提供 87.5% 统计置信度------独立噪声下可接受的最低置信水平。上限 15 受 KCC_TIER1_BLOCKED_CNT_MAX 约束,防止 u8 计数器饱和回绕。
4. 饱和→复位→饱和振荡
问题
p_est 超过阈值时 x_est 被钳制到 min_rtt。若无保持,下一次漂移周期(每 56 RTT)将 x_est 重新抬升到 min_rtt 之上,触发再次饱和------无限循环。
Tosc=drift_thresh×tier2_mult=14×4=56 RTTT_{\text{osc}} = \text{drift\_thresh} \times \text{tier2\_mult} = 14 \times 4 = 56 \;\text{RTT}Tosc=drift_thresh×tier2_mult=14×4=56RTT
#mermaid-svg-EToLUK4eWQVLX5D9{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-EToLUK4eWQVLX5D9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EToLUK4eWQVLX5D9 .error-icon{fill:#552222;}#mermaid-svg-EToLUK4eWQVLX5D9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EToLUK4eWQVLX5D9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EToLUK4eWQVLX5D9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EToLUK4eWQVLX5D9 .marker.cross{stroke:#333333;}#mermaid-svg-EToLUK4eWQVLX5D9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EToLUK4eWQVLX5D9 p{margin:0;}#mermaid-svg-EToLUK4eWQVLX5D9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster-label text{fill:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster-label span{color:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster-label span p{background-color:transparent;}#mermaid-svg-EToLUK4eWQVLX5D9 .label text,#mermaid-svg-EToLUK4eWQVLX5D9 span{fill:#333;color:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 .node rect,#mermaid-svg-EToLUK4eWQVLX5D9 .node circle,#mermaid-svg-EToLUK4eWQVLX5D9 .node ellipse,#mermaid-svg-EToLUK4eWQVLX5D9 .node polygon,#mermaid-svg-EToLUK4eWQVLX5D9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EToLUK4eWQVLX5D9 .rough-node .label text,#mermaid-svg-EToLUK4eWQVLX5D9 .node .label text,#mermaid-svg-EToLUK4eWQVLX5D9 .image-shape .label,#mermaid-svg-EToLUK4eWQVLX5D9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-EToLUK4eWQVLX5D9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EToLUK4eWQVLX5D9 .rough-node .label,#mermaid-svg-EToLUK4eWQVLX5D9 .node .label,#mermaid-svg-EToLUK4eWQVLX5D9 .image-shape .label,#mermaid-svg-EToLUK4eWQVLX5D9 .icon-shape .label{text-align:center;}#mermaid-svg-EToLUK4eWQVLX5D9 .node.clickable{cursor:pointer;}#mermaid-svg-EToLUK4eWQVLX5D9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EToLUK4eWQVLX5D9 .arrowheadPath{fill:#333333;}#mermaid-svg-EToLUK4eWQVLX5D9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EToLUK4eWQVLX5D9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EToLUK4eWQVLX5D9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EToLUK4eWQVLX5D9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EToLUK4eWQVLX5D9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EToLUK4eWQVLX5D9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster text{fill:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 .cluster span{color:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 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-EToLUK4eWQVLX5D9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EToLUK4eWQVLX5D9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-EToLUK4eWQVLX5D9 .icon-shape,#mermaid-svg-EToLUK4eWQVLX5D9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EToLUK4eWQVLX5D9 .icon-shape p,#mermaid-svg-EToLUK4eWQVLX5D9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EToLUK4eWQVLX5D9 .icon-shape .label rect,#mermaid-svg-EToLUK4eWQVLX5D9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EToLUK4eWQVLX5D9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EToLUK4eWQVLX5D9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EToLUK4eWQVLX5D9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} x_est ≥ min_rtt
饱和: x_est 钳制到 min_rtt
漂移: 14 + 42 = 56 RTT
x_est 被漂移抬升
修复
#mermaid-svg-D5tXCsYG1uMKvVkU{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-D5tXCsYG1uMKvVkU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-D5tXCsYG1uMKvVkU .error-icon{fill:#552222;}#mermaid-svg-D5tXCsYG1uMKvVkU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-D5tXCsYG1uMKvVkU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-D5tXCsYG1uMKvVkU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-D5tXCsYG1uMKvVkU .marker.cross{stroke:#333333;}#mermaid-svg-D5tXCsYG1uMKvVkU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-D5tXCsYG1uMKvVkU p{margin:0;}#mermaid-svg-D5tXCsYG1uMKvVkU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster-label text{fill:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster-label span{color:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster-label span p{background-color:transparent;}#mermaid-svg-D5tXCsYG1uMKvVkU .label text,#mermaid-svg-D5tXCsYG1uMKvVkU span{fill:#333;color:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU .node rect,#mermaid-svg-D5tXCsYG1uMKvVkU .node circle,#mermaid-svg-D5tXCsYG1uMKvVkU .node ellipse,#mermaid-svg-D5tXCsYG1uMKvVkU .node polygon,#mermaid-svg-D5tXCsYG1uMKvVkU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-D5tXCsYG1uMKvVkU .rough-node .label text,#mermaid-svg-D5tXCsYG1uMKvVkU .node .label text,#mermaid-svg-D5tXCsYG1uMKvVkU .image-shape .label,#mermaid-svg-D5tXCsYG1uMKvVkU .icon-shape .label{text-anchor:middle;}#mermaid-svg-D5tXCsYG1uMKvVkU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-D5tXCsYG1uMKvVkU .rough-node .label,#mermaid-svg-D5tXCsYG1uMKvVkU .node .label,#mermaid-svg-D5tXCsYG1uMKvVkU .image-shape .label,#mermaid-svg-D5tXCsYG1uMKvVkU .icon-shape .label{text-align:center;}#mermaid-svg-D5tXCsYG1uMKvVkU .node.clickable{cursor:pointer;}#mermaid-svg-D5tXCsYG1uMKvVkU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-D5tXCsYG1uMKvVkU .arrowheadPath{fill:#333333;}#mermaid-svg-D5tXCsYG1uMKvVkU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-D5tXCsYG1uMKvVkU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-D5tXCsYG1uMKvVkU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D5tXCsYG1uMKvVkU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-D5tXCsYG1uMKvVkU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D5tXCsYG1uMKvVkU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster text{fill:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU .cluster span{color:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU 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-D5tXCsYG1uMKvVkU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-D5tXCsYG1uMKvVkU rect.text{fill:none;stroke-width:0;}#mermaid-svg-D5tXCsYG1uMKvVkU .icon-shape,#mermaid-svg-D5tXCsYG1uMKvVkU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D5tXCsYG1uMKvVkU .icon-shape p,#mermaid-svg-D5tXCsYG1uMKvVkU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-D5tXCsYG1uMKvVkU .icon-shape .label rect,#mermaid-svg-D5tXCsYG1uMKvVkU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D5tXCsYG1uMKvVkU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-D5tXCsYG1uMKvVkU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-D5tXCsYG1uMKvVkU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
x_est ≥ min_rtt
饱和: x_est 钳制
hold_cnt = 30
hold_cnt > 0 ?
hold_cnt--; goto skip_drift
漂移恢复 ✓
kcc_saturation_hold_rtts 参数(默认 30)。饱和后设置计数器递减,期间 goto skip_drift 跳过漂移。
推导 :Tosc/2=28T_{\text{osc}} / 2 = 28Tosc/2=28 RTT。30>2830 > 2830>28 --- 整个上升沿被抑制。30 = 3 × 10,安全整数余量,远低于 u8 上限 255。保持结束时 DRAIN 已清空队列(每 8 RTT 一次),漂移从干净状态重启,无振荡。
5. Undo 恢复后 cwnd 被 PROBE_RTT 钳制截断
问题
虚假丢包触发 undo 恢复 cwnd 到丢包前水平。若 undo 发生在 PROBE_RTT 中,下一个 ACK 触发 kcc_set_cwnd,其中 if (mode == PROBE_RTT) cwnd = min(cwnd, 4) 立即将刚恢复的 cwnd 重新截断为 4------undo 完全作废。
kcc_set_cwnd kcc_undo_cwnd kcc_set_cwnd kcc_undo_cwnd #mermaid-svg-cKWvZywK9UsrnaMN{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-cKWvZywK9UsrnaMN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cKWvZywK9UsrnaMN .error-icon{fill:#552222;}#mermaid-svg-cKWvZywK9UsrnaMN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cKWvZywK9UsrnaMN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cKWvZywK9UsrnaMN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cKWvZywK9UsrnaMN .marker.cross{stroke:#333333;}#mermaid-svg-cKWvZywK9UsrnaMN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cKWvZywK9UsrnaMN p{margin:0;}#mermaid-svg-cKWvZywK9UsrnaMN .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cKWvZywK9UsrnaMN text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-cKWvZywK9UsrnaMN .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cKWvZywK9UsrnaMN .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-cKWvZywK9UsrnaMN .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-cKWvZywK9UsrnaMN .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-cKWvZywK9UsrnaMN #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-cKWvZywK9UsrnaMN .sequenceNumber{fill:white;}#mermaid-svg-cKWvZywK9UsrnaMN #sequencenumber{fill:#333;}#mermaid-svg-cKWvZywK9UsrnaMN #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-cKWvZywK9UsrnaMN .messageText{fill:#333;stroke:none;}#mermaid-svg-cKWvZywK9UsrnaMN .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cKWvZywK9UsrnaMN .labelText,#mermaid-svg-cKWvZywK9UsrnaMN .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-cKWvZywK9UsrnaMN .loopText,#mermaid-svg-cKWvZywK9UsrnaMN .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-cKWvZywK9UsrnaMN .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-cKWvZywK9UsrnaMN .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-cKWvZywK9UsrnaMN .noteText,#mermaid-svg-cKWvZywK9UsrnaMN .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-cKWvZywK9UsrnaMN .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cKWvZywK9UsrnaMN .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cKWvZywK9UsrnaMN .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-cKWvZywK9UsrnaMN .actorPopupMenu{position:absolute;}#mermaid-svg-cKWvZywK9UsrnaMN .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-cKWvZywK9UsrnaMN .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-cKWvZywK9UsrnaMN .actor-man circle,#mermaid-svg-cKWvZywK9UsrnaMN line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-cKWvZywK9UsrnaMN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} mode = PROBE_RTTcwnd 恢复 → prior_cwnd cwnd 被截断回 4 ✗ 下一个 ACKmode == PROBE_RTT →cwnd = min(cwnd, 4)
修复
kcc_set_cwnd kcc_undo_cwnd kcc_set_cwnd kcc_undo_cwnd #mermaid-svg-lZYyhJCjmShWURny{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-lZYyhJCjmShWURny .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lZYyhJCjmShWURny .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lZYyhJCjmShWURny .error-icon{fill:#552222;}#mermaid-svg-lZYyhJCjmShWURny .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lZYyhJCjmShWURny .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lZYyhJCjmShWURny .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lZYyhJCjmShWURny .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lZYyhJCjmShWURny .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lZYyhJCjmShWURny .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lZYyhJCjmShWURny .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lZYyhJCjmShWURny .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lZYyhJCjmShWURny .marker.cross{stroke:#333333;}#mermaid-svg-lZYyhJCjmShWURny svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lZYyhJCjmShWURny p{margin:0;}#mermaid-svg-lZYyhJCjmShWURny .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lZYyhJCjmShWURny text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-lZYyhJCjmShWURny .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-lZYyhJCjmShWURny .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-lZYyhJCjmShWURny .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-lZYyhJCjmShWURny .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-lZYyhJCjmShWURny #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-lZYyhJCjmShWURny .sequenceNumber{fill:white;}#mermaid-svg-lZYyhJCjmShWURny #sequencenumber{fill:#333;}#mermaid-svg-lZYyhJCjmShWURny #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-lZYyhJCjmShWURny .messageText{fill:#333;stroke:none;}#mermaid-svg-lZYyhJCjmShWURny .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lZYyhJCjmShWURny .labelText,#mermaid-svg-lZYyhJCjmShWURny .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-lZYyhJCjmShWURny .loopText,#mermaid-svg-lZYyhJCjmShWURny .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-lZYyhJCjmShWURny .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-lZYyhJCjmShWURny .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-lZYyhJCjmShWURny .noteText,#mermaid-svg-lZYyhJCjmShWURny .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-lZYyhJCjmShWURny .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lZYyhJCjmShWURny .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lZYyhJCjmShWURny .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lZYyhJCjmShWURny .actorPopupMenu{position:absolute;}#mermaid-svg-lZYyhJCjmShWURny .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-lZYyhJCjmShWURny .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lZYyhJCjmShWURny .actor-man circle,#mermaid-svg-lZYyhJCjmShWURny line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-lZYyhJCjmShWURny :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} mode = PROBE_RTTcwnd 恢复 → prior_cwnd cwnd 保持恢复值 ✓ kcc_reset_mode → PROBE_BW下一个 ACKmode ≠ PROBE_RTT钳制不触发
kcc_undo_cwnd 中检测当前模式,若为 PROBE_RTT 调用 kcc_reset_mode 强制退出。此后 kcc_set_cwnd 不再执行钳制。
附加修复 :Undo 中剥离 saturation_hold_cnt 重置------在已饱和路径上过早释放保持使 undo 自身制造了新振荡,保留注释 "Do NOT reset"。另外 kcc_set_state 处理 TCP_CA_Loss 时遗漏 full_bw_cnt = 0(BBR 置两者),导致 RTO 后过早进入 DRAIN,补全该重置。
6. kzalloc 失败导致部分初始化
问题
kzalloc 失败后函数不设置 initialized 标志即返回。下次 socket 复用时,kcc_init 读取未初始化的 bitfield 值(模式枚举、增益值、计数器)当作合法状态。
#mermaid-svg-hyWPZCybKEbS4YY6{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-hyWPZCybKEbS4YY6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hyWPZCybKEbS4YY6 .error-icon{fill:#552222;}#mermaid-svg-hyWPZCybKEbS4YY6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hyWPZCybKEbS4YY6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hyWPZCybKEbS4YY6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hyWPZCybKEbS4YY6 .marker.cross{stroke:#333333;}#mermaid-svg-hyWPZCybKEbS4YY6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hyWPZCybKEbS4YY6 p{margin:0;}#mermaid-svg-hyWPZCybKEbS4YY6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster-label text{fill:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster-label span{color:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster-label span p{background-color:transparent;}#mermaid-svg-hyWPZCybKEbS4YY6 .label text,#mermaid-svg-hyWPZCybKEbS4YY6 span{fill:#333;color:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 .node rect,#mermaid-svg-hyWPZCybKEbS4YY6 .node circle,#mermaid-svg-hyWPZCybKEbS4YY6 .node ellipse,#mermaid-svg-hyWPZCybKEbS4YY6 .node polygon,#mermaid-svg-hyWPZCybKEbS4YY6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hyWPZCybKEbS4YY6 .rough-node .label text,#mermaid-svg-hyWPZCybKEbS4YY6 .node .label text,#mermaid-svg-hyWPZCybKEbS4YY6 .image-shape .label,#mermaid-svg-hyWPZCybKEbS4YY6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-hyWPZCybKEbS4YY6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hyWPZCybKEbS4YY6 .rough-node .label,#mermaid-svg-hyWPZCybKEbS4YY6 .node .label,#mermaid-svg-hyWPZCybKEbS4YY6 .image-shape .label,#mermaid-svg-hyWPZCybKEbS4YY6 .icon-shape .label{text-align:center;}#mermaid-svg-hyWPZCybKEbS4YY6 .node.clickable{cursor:pointer;}#mermaid-svg-hyWPZCybKEbS4YY6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hyWPZCybKEbS4YY6 .arrowheadPath{fill:#333333;}#mermaid-svg-hyWPZCybKEbS4YY6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hyWPZCybKEbS4YY6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hyWPZCybKEbS4YY6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hyWPZCybKEbS4YY6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hyWPZCybKEbS4YY6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hyWPZCybKEbS4YY6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster text{fill:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 .cluster span{color:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 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-hyWPZCybKEbS4YY6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hyWPZCybKEbS4YY6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-hyWPZCybKEbS4YY6 .icon-shape,#mermaid-svg-hyWPZCybKEbS4YY6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hyWPZCybKEbS4YY6 .icon-shape p,#mermaid-svg-hyWPZCybKEbS4YY6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hyWPZCybKEbS4YY6 .icon-shape .label rect,#mermaid-svg-hyWPZCybKEbS4YY6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hyWPZCybKEbS4YY6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hyWPZCybKEbS4YY6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hyWPZCybKEbS4YY6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
kcc_init(sk)
kzalloc ext 成功?
初始化 → return
ext = NULL
bitfield 未全部初始化
无 initialized 守卫
下次 kcc_init(sk)
读取未初始化 bitfield ✗
修复
#mermaid-svg-4rT8uUrvHlg1jLqF{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-4rT8uUrvHlg1jLqF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4rT8uUrvHlg1jLqF .error-icon{fill:#552222;}#mermaid-svg-4rT8uUrvHlg1jLqF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4rT8uUrvHlg1jLqF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4rT8uUrvHlg1jLqF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4rT8uUrvHlg1jLqF .marker.cross{stroke:#333333;}#mermaid-svg-4rT8uUrvHlg1jLqF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4rT8uUrvHlg1jLqF p{margin:0;}#mermaid-svg-4rT8uUrvHlg1jLqF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster-label text{fill:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster-label span{color:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster-label span p{background-color:transparent;}#mermaid-svg-4rT8uUrvHlg1jLqF .label text,#mermaid-svg-4rT8uUrvHlg1jLqF span{fill:#333;color:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF .node rect,#mermaid-svg-4rT8uUrvHlg1jLqF .node circle,#mermaid-svg-4rT8uUrvHlg1jLqF .node ellipse,#mermaid-svg-4rT8uUrvHlg1jLqF .node polygon,#mermaid-svg-4rT8uUrvHlg1jLqF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4rT8uUrvHlg1jLqF .rough-node .label text,#mermaid-svg-4rT8uUrvHlg1jLqF .node .label text,#mermaid-svg-4rT8uUrvHlg1jLqF .image-shape .label,#mermaid-svg-4rT8uUrvHlg1jLqF .icon-shape .label{text-anchor:middle;}#mermaid-svg-4rT8uUrvHlg1jLqF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4rT8uUrvHlg1jLqF .rough-node .label,#mermaid-svg-4rT8uUrvHlg1jLqF .node .label,#mermaid-svg-4rT8uUrvHlg1jLqF .image-shape .label,#mermaid-svg-4rT8uUrvHlg1jLqF .icon-shape .label{text-align:center;}#mermaid-svg-4rT8uUrvHlg1jLqF .node.clickable{cursor:pointer;}#mermaid-svg-4rT8uUrvHlg1jLqF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4rT8uUrvHlg1jLqF .arrowheadPath{fill:#333333;}#mermaid-svg-4rT8uUrvHlg1jLqF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4rT8uUrvHlg1jLqF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4rT8uUrvHlg1jLqF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4rT8uUrvHlg1jLqF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4rT8uUrvHlg1jLqF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4rT8uUrvHlg1jLqF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster text{fill:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF .cluster span{color:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF 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-4rT8uUrvHlg1jLqF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4rT8uUrvHlg1jLqF rect.text{fill:none;stroke-width:0;}#mermaid-svg-4rT8uUrvHlg1jLqF .icon-shape,#mermaid-svg-4rT8uUrvHlg1jLqF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4rT8uUrvHlg1jLqF .icon-shape p,#mermaid-svg-4rT8uUrvHlg1jLqF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4rT8uUrvHlg1jLqF .icon-shape .label rect,#mermaid-svg-4rT8uUrvHlg1jLqF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4rT8uUrvHlg1jLqF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4rT8uUrvHlg1jLqF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4rT8uUrvHlg1jLqF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
kcc_init(sk)
initialized ?
return: 幂等
kzalloc ext ?
显式初始化 59 字段
→ initialized = 1
ext = NULL
initialized 保持 0
下次 kcc_init 重试 ✓
入口检查 kcc->initialized 实现幂等。全部 struct kcc(34 字段)和 struct kcc_ext(25 字段)在设置 initialized = 1 前显式赋值。分配失败路径不设置该标志位,保证下次调用重试。
7. p_est 初始化量纲错误
问题
pest=max( pest_init⏟μs2, rtt_us/div⏟μs )p_{\text{est}} = \max(\; \underbrace{p_{\text{est\init}}}{\mu s^2},\; \underbrace{\text{rtt\us} / \text{div}}{\mu s} \;)pest=max(μs2 pest_init,μs rtt_us/div)
p_est_init 单位 µs²(方差),rtt_us/div 单位 µs(线性时间)。在 max_t 中无换算直接比较------量纲不一致。长 RTT 路径(100 ms)上线性项以错误单位主导,初始 p_est 高估约 100 倍。
修复
pest=pest_initμs2p_{\text{est}} = p_{\text{est\_init}} \quad \\mu s\^2pest=pest_initμs2
仅使用 p_est_init_val。卡尔曼滤波器通过 Riccati 方程自动调节------稳态收敛与初始值无关。3 次迭代内 p_est 从初始值过渡到稳态值。RTT 项移除消除了量纲错位。
8. 早期漂移协方差不一致
问题
早期漂移步长 K 无关(Keff=0.25K_{\text{eff}} = 0.25Keff=0.25),但协方差缩减沿用 K 相关公式(K×ppred/4K \times p_{\text{pred}} / 4K×ppred/4)。步长大而协方差下降不足------滤波器实际修正幅度与其置信度不匹配。
#mermaid-svg-3u4h6LcRTLXUzfY9{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-3u4h6LcRTLXUzfY9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3u4h6LcRTLXUzfY9 .error-icon{fill:#552222;}#mermaid-svg-3u4h6LcRTLXUzfY9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3u4h6LcRTLXUzfY9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .marker.cross{stroke:#333333;}#mermaid-svg-3u4h6LcRTLXUzfY9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3u4h6LcRTLXUzfY9 p{margin:0;}#mermaid-svg-3u4h6LcRTLXUzfY9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster-label text{fill:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster-label span{color:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster-label span p{background-color:transparent;}#mermaid-svg-3u4h6LcRTLXUzfY9 .label text,#mermaid-svg-3u4h6LcRTLXUzfY9 span{fill:#333;color:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .node rect,#mermaid-svg-3u4h6LcRTLXUzfY9 .node circle,#mermaid-svg-3u4h6LcRTLXUzfY9 .node ellipse,#mermaid-svg-3u4h6LcRTLXUzfY9 .node polygon,#mermaid-svg-3u4h6LcRTLXUzfY9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .rough-node .label text,#mermaid-svg-3u4h6LcRTLXUzfY9 .node .label text,#mermaid-svg-3u4h6LcRTLXUzfY9 .image-shape .label,#mermaid-svg-3u4h6LcRTLXUzfY9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-3u4h6LcRTLXUzfY9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .rough-node .label,#mermaid-svg-3u4h6LcRTLXUzfY9 .node .label,#mermaid-svg-3u4h6LcRTLXUzfY9 .image-shape .label,#mermaid-svg-3u4h6LcRTLXUzfY9 .icon-shape .label{text-align:center;}#mermaid-svg-3u4h6LcRTLXUzfY9 .node.clickable{cursor:pointer;}#mermaid-svg-3u4h6LcRTLXUzfY9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .arrowheadPath{fill:#333333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3u4h6LcRTLXUzfY9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3u4h6LcRTLXUzfY9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3u4h6LcRTLXUzfY9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster text{fill:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 .cluster span{color:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 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-3u4h6LcRTLXUzfY9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3u4h6LcRTLXUzfY9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-3u4h6LcRTLXUzfY9 .icon-shape,#mermaid-svg-3u4h6LcRTLXUzfY9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3u4h6LcRTLXUzfY9 .icon-shape p,#mermaid-svg-3u4h6LcRTLXUzfY9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3u4h6LcRTLXUzfY9 .icon-shape .label rect,#mermaid-svg-3u4h6LcRTLXUzfY9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3u4h6LcRTLXUzfY9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3u4h6LcRTLXUzfY9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3u4h6LcRTLXUzfY9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 修复前
步长: innov/4
协方差: K×p_pred/4
K=0.39 → ~0.1×p_pred
不匹配
修复
#mermaid-svg-IqzGFvhjnznBu9U3{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-IqzGFvhjnznBu9U3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IqzGFvhjnznBu9U3 .error-icon{fill:#552222;}#mermaid-svg-IqzGFvhjnznBu9U3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IqzGFvhjnznBu9U3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IqzGFvhjnznBu9U3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IqzGFvhjnznBu9U3 .marker.cross{stroke:#333333;}#mermaid-svg-IqzGFvhjnznBu9U3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IqzGFvhjnznBu9U3 p{margin:0;}#mermaid-svg-IqzGFvhjnznBu9U3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster-label text{fill:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster-label span{color:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster-label span p{background-color:transparent;}#mermaid-svg-IqzGFvhjnznBu9U3 .label text,#mermaid-svg-IqzGFvhjnznBu9U3 span{fill:#333;color:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 .node rect,#mermaid-svg-IqzGFvhjnznBu9U3 .node circle,#mermaid-svg-IqzGFvhjnznBu9U3 .node ellipse,#mermaid-svg-IqzGFvhjnznBu9U3 .node polygon,#mermaid-svg-IqzGFvhjnznBu9U3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IqzGFvhjnznBu9U3 .rough-node .label text,#mermaid-svg-IqzGFvhjnznBu9U3 .node .label text,#mermaid-svg-IqzGFvhjnznBu9U3 .image-shape .label,#mermaid-svg-IqzGFvhjnznBu9U3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-IqzGFvhjnznBu9U3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IqzGFvhjnznBu9U3 .rough-node .label,#mermaid-svg-IqzGFvhjnznBu9U3 .node .label,#mermaid-svg-IqzGFvhjnznBu9U3 .image-shape .label,#mermaid-svg-IqzGFvhjnznBu9U3 .icon-shape .label{text-align:center;}#mermaid-svg-IqzGFvhjnznBu9U3 .node.clickable{cursor:pointer;}#mermaid-svg-IqzGFvhjnznBu9U3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IqzGFvhjnznBu9U3 .arrowheadPath{fill:#333333;}#mermaid-svg-IqzGFvhjnznBu9U3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IqzGFvhjnznBu9U3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IqzGFvhjnznBu9U3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IqzGFvhjnznBu9U3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IqzGFvhjnznBu9U3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IqzGFvhjnznBu9U3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster text{fill:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 .cluster span{color:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 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-IqzGFvhjnznBu9U3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IqzGFvhjnznBu9U3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-IqzGFvhjnznBu9U3 .icon-shape,#mermaid-svg-IqzGFvhjnznBu9U3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IqzGFvhjnznBu9U3 .icon-shape p,#mermaid-svg-IqzGFvhjnznBu9U3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IqzGFvhjnznBu9U3 .icon-shape .label rect,#mermaid-svg-IqzGFvhjnznBu9U3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IqzGFvhjnznBu9U3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IqzGFvhjnznBu9U3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IqzGFvhjnznBu9U3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 修复后
步长: innov/4
K_eff = 0.25
协方差: p_pred/4
匹配
Tier-1: K×innov/4
协方差: K×p_pred/4
匹配
Tier-2: K×innov/8
协方差: K×p_pred/8
匹配
新增 KCC_DRIFT_EARLY(层级 id = 3)。协方差代码中检测此层级,使用 preduction=ppred/4p_{\text{reduction}} = p_{\text{pred}} / 4preduction=ppred/4。三个层级各自一致性:步长的 K 因子与协方差缩减的 K 因子匹配。
9. 约瑟夫形式边界条件:亚微秒噪声引起的 p_est 振荡
问题
innovation < 0 执行约瑟夫形式 p_est = max(R, floor) ≈ 400。innovation = 0 走标准卡尔曼缩减。持续 ±1 缩放单位抖动下,p_est 在 400 与收敛值之间反复跳变,永远达不到收敛阈值(≈ 33)。
#mermaid-svg-Z7unp8VL3jCd4GlE{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-Z7unp8VL3jCd4GlE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Z7unp8VL3jCd4GlE .error-icon{fill:#552222;}#mermaid-svg-Z7unp8VL3jCd4GlE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z7unp8VL3jCd4GlE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z7unp8VL3jCd4GlE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z7unp8VL3jCd4GlE .marker.cross{stroke:#333333;}#mermaid-svg-Z7unp8VL3jCd4GlE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z7unp8VL3jCd4GlE p{margin:0;}#mermaid-svg-Z7unp8VL3jCd4GlE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster-label text{fill:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster-label span{color:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster-label span p{background-color:transparent;}#mermaid-svg-Z7unp8VL3jCd4GlE .label text,#mermaid-svg-Z7unp8VL3jCd4GlE span{fill:#333;color:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE .node rect,#mermaid-svg-Z7unp8VL3jCd4GlE .node circle,#mermaid-svg-Z7unp8VL3jCd4GlE .node ellipse,#mermaid-svg-Z7unp8VL3jCd4GlE .node polygon,#mermaid-svg-Z7unp8VL3jCd4GlE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z7unp8VL3jCd4GlE .rough-node .label text,#mermaid-svg-Z7unp8VL3jCd4GlE .node .label text,#mermaid-svg-Z7unp8VL3jCd4GlE .image-shape .label,#mermaid-svg-Z7unp8VL3jCd4GlE .icon-shape .label{text-anchor:middle;}#mermaid-svg-Z7unp8VL3jCd4GlE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Z7unp8VL3jCd4GlE .rough-node .label,#mermaid-svg-Z7unp8VL3jCd4GlE .node .label,#mermaid-svg-Z7unp8VL3jCd4GlE .image-shape .label,#mermaid-svg-Z7unp8VL3jCd4GlE .icon-shape .label{text-align:center;}#mermaid-svg-Z7unp8VL3jCd4GlE .node.clickable{cursor:pointer;}#mermaid-svg-Z7unp8VL3jCd4GlE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Z7unp8VL3jCd4GlE .arrowheadPath{fill:#333333;}#mermaid-svg-Z7unp8VL3jCd4GlE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z7unp8VL3jCd4GlE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z7unp8VL3jCd4GlE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z7unp8VL3jCd4GlE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Z7unp8VL3jCd4GlE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z7unp8VL3jCd4GlE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster text{fill:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE .cluster span{color:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE 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-Z7unp8VL3jCd4GlE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Z7unp8VL3jCd4GlE rect.text{fill:none;stroke-width:0;}#mermaid-svg-Z7unp8VL3jCd4GlE .icon-shape,#mermaid-svg-Z7unp8VL3jCd4GlE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z7unp8VL3jCd4GlE .icon-shape p,#mermaid-svg-Z7unp8VL3jCd4GlE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Z7unp8VL3jCd4GlE .icon-shape .label rect,#mermaid-svg-Z7unp8VL3jCd4GlE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z7unp8VL3jCd4GlE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Z7unp8VL3jCd4GlE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Z7unp8VL3jCd4GlE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是, ∀ν<0
否, ν=0
innovation < 0 ?
p_est = 400
p_est = K×p_pred
±1 unit 抖动
p_est: 400 ↔ 收敛值
振荡, 永不收敛
修复
#mermaid-svg-tPixPY9iysHA1pSA{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-tPixPY9iysHA1pSA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tPixPY9iysHA1pSA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tPixPY9iysHA1pSA .error-icon{fill:#552222;}#mermaid-svg-tPixPY9iysHA1pSA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tPixPY9iysHA1pSA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tPixPY9iysHA1pSA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tPixPY9iysHA1pSA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tPixPY9iysHA1pSA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tPixPY9iysHA1pSA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tPixPY9iysHA1pSA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tPixPY9iysHA1pSA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tPixPY9iysHA1pSA .marker.cross{stroke:#333333;}#mermaid-svg-tPixPY9iysHA1pSA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tPixPY9iysHA1pSA p{margin:0;}#mermaid-svg-tPixPY9iysHA1pSA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tPixPY9iysHA1pSA .cluster-label text{fill:#333;}#mermaid-svg-tPixPY9iysHA1pSA .cluster-label span{color:#333;}#mermaid-svg-tPixPY9iysHA1pSA .cluster-label span p{background-color:transparent;}#mermaid-svg-tPixPY9iysHA1pSA .label text,#mermaid-svg-tPixPY9iysHA1pSA span{fill:#333;color:#333;}#mermaid-svg-tPixPY9iysHA1pSA .node rect,#mermaid-svg-tPixPY9iysHA1pSA .node circle,#mermaid-svg-tPixPY9iysHA1pSA .node ellipse,#mermaid-svg-tPixPY9iysHA1pSA .node polygon,#mermaid-svg-tPixPY9iysHA1pSA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tPixPY9iysHA1pSA .rough-node .label text,#mermaid-svg-tPixPY9iysHA1pSA .node .label text,#mermaid-svg-tPixPY9iysHA1pSA .image-shape .label,#mermaid-svg-tPixPY9iysHA1pSA .icon-shape .label{text-anchor:middle;}#mermaid-svg-tPixPY9iysHA1pSA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tPixPY9iysHA1pSA .rough-node .label,#mermaid-svg-tPixPY9iysHA1pSA .node .label,#mermaid-svg-tPixPY9iysHA1pSA .image-shape .label,#mermaid-svg-tPixPY9iysHA1pSA .icon-shape .label{text-align:center;}#mermaid-svg-tPixPY9iysHA1pSA .node.clickable{cursor:pointer;}#mermaid-svg-tPixPY9iysHA1pSA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tPixPY9iysHA1pSA .arrowheadPath{fill:#333333;}#mermaid-svg-tPixPY9iysHA1pSA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tPixPY9iysHA1pSA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tPixPY9iysHA1pSA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tPixPY9iysHA1pSA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tPixPY9iysHA1pSA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tPixPY9iysHA1pSA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tPixPY9iysHA1pSA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tPixPY9iysHA1pSA .cluster text{fill:#333;}#mermaid-svg-tPixPY9iysHA1pSA .cluster span{color:#333;}#mermaid-svg-tPixPY9iysHA1pSA 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-tPixPY9iysHA1pSA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tPixPY9iysHA1pSA rect.text{fill:none;stroke-width:0;}#mermaid-svg-tPixPY9iysHA1pSA .icon-shape,#mermaid-svg-tPixPY9iysHA1pSA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tPixPY9iysHA1pSA .icon-shape p,#mermaid-svg-tPixPY9iysHA1pSA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tPixPY9iysHA1pSA .icon-shape .label rect,#mermaid-svg-tPixPY9iysHA1pSA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tPixPY9iysHA1pSA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tPixPY9iysHA1pSA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tPixPY9iysHA1pSA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
是
否, |ν| < 1µs
否, ν=0
innovation < 0 || G3 ?
G3 或 |ν| ≥ scale ?
p_est = 400
p_est = K×p_pred
约瑟夫形式要求 ∣ν∣≥scale|\nu| \geq \text{scale}∣ν∣≥scale(约 1 µs)。亚微秒量级负更新走标准卡尔曼。
物理依据:RTT 测量精度为微秒级。scale = 1024 时 1 单位 = 1 ns------低于物理可观测 RTT 变化三个数量级。亚微秒 ν < 0 必为量化噪声或 fixed-point 舍入误差,对其实施约瑟夫形式重置破坏收敛。G3 路径偏移检测始终使用约瑟夫形式------它是真实物理信号。
10. 内存序:smp_store_release / smp_load_acquire 替代 smp_wmb / smp_rmb
问题
全局卡尔曼 BDP 滤波器(kcc_kf_x、kcc_kf_P、kcc_kf_active)由单个连接带锁写入,由多个连接无锁读取。原有实现使用 atomic_set + smp_wmb(写方)和 atomic_read + smp_rmb(读方)。
#mermaid-svg-jloexn4CksyeY5HT{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-jloexn4CksyeY5HT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jloexn4CksyeY5HT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jloexn4CksyeY5HT .error-icon{fill:#552222;}#mermaid-svg-jloexn4CksyeY5HT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jloexn4CksyeY5HT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jloexn4CksyeY5HT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jloexn4CksyeY5HT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jloexn4CksyeY5HT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jloexn4CksyeY5HT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jloexn4CksyeY5HT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jloexn4CksyeY5HT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jloexn4CksyeY5HT .marker.cross{stroke:#333333;}#mermaid-svg-jloexn4CksyeY5HT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jloexn4CksyeY5HT p{margin:0;}#mermaid-svg-jloexn4CksyeY5HT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jloexn4CksyeY5HT .cluster-label text{fill:#333;}#mermaid-svg-jloexn4CksyeY5HT .cluster-label span{color:#333;}#mermaid-svg-jloexn4CksyeY5HT .cluster-label span p{background-color:transparent;}#mermaid-svg-jloexn4CksyeY5HT .label text,#mermaid-svg-jloexn4CksyeY5HT span{fill:#333;color:#333;}#mermaid-svg-jloexn4CksyeY5HT .node rect,#mermaid-svg-jloexn4CksyeY5HT .node circle,#mermaid-svg-jloexn4CksyeY5HT .node ellipse,#mermaid-svg-jloexn4CksyeY5HT .node polygon,#mermaid-svg-jloexn4CksyeY5HT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jloexn4CksyeY5HT .rough-node .label text,#mermaid-svg-jloexn4CksyeY5HT .node .label text,#mermaid-svg-jloexn4CksyeY5HT .image-shape .label,#mermaid-svg-jloexn4CksyeY5HT .icon-shape .label{text-anchor:middle;}#mermaid-svg-jloexn4CksyeY5HT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jloexn4CksyeY5HT .rough-node .label,#mermaid-svg-jloexn4CksyeY5HT .node .label,#mermaid-svg-jloexn4CksyeY5HT .image-shape .label,#mermaid-svg-jloexn4CksyeY5HT .icon-shape .label{text-align:center;}#mermaid-svg-jloexn4CksyeY5HT .node.clickable{cursor:pointer;}#mermaid-svg-jloexn4CksyeY5HT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jloexn4CksyeY5HT .arrowheadPath{fill:#333333;}#mermaid-svg-jloexn4CksyeY5HT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jloexn4CksyeY5HT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jloexn4CksyeY5HT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jloexn4CksyeY5HT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jloexn4CksyeY5HT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jloexn4CksyeY5HT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jloexn4CksyeY5HT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jloexn4CksyeY5HT .cluster text{fill:#333;}#mermaid-svg-jloexn4CksyeY5HT .cluster span{color:#333;}#mermaid-svg-jloexn4CksyeY5HT 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-jloexn4CksyeY5HT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jloexn4CksyeY5HT rect.text{fill:none;stroke-width:0;}#mermaid-svg-jloexn4CksyeY5HT .icon-shape,#mermaid-svg-jloexn4CksyeY5HT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jloexn4CksyeY5HT .icon-shape p,#mermaid-svg-jloexn4CksyeY5HT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jloexn4CksyeY5HT .icon-shape .label rect,#mermaid-svg-jloexn4CksyeY5HT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jloexn4CksyeY5HT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jloexn4CksyeY5HT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jloexn4CksyeY5HT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原有: smp_wmb/rmb
手工屏障
无形式化保证
atomic_set(kf_x)
atomic_set(kf_P)
smp_wmb()
atomic_set(kf_active)
atomic_read(kf_active)
smp_rmb()
atomic_read(kf_x)
此模式存在两个问题。其一,smp_wmb 仅保证写方内部的顺序,不保证读方可见性------需要一个读方屏障 smp_rmb 来配对,但配对关系存在于注释中而非形式语义中。其二,atomic_set 不隐含任何内存序约束,编译器理论上可重排 atomic_set 之间的顺序。
修复
#mermaid-svg-N1CDclTVmLRJTaWJ{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-N1CDclTVmLRJTaWJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-N1CDclTVmLRJTaWJ .error-icon{fill:#552222;}#mermaid-svg-N1CDclTVmLRJTaWJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-N1CDclTVmLRJTaWJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-N1CDclTVmLRJTaWJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-N1CDclTVmLRJTaWJ .marker.cross{stroke:#333333;}#mermaid-svg-N1CDclTVmLRJTaWJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-N1CDclTVmLRJTaWJ p{margin:0;}#mermaid-svg-N1CDclTVmLRJTaWJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster-label text{fill:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster-label span{color:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster-label span p{background-color:transparent;}#mermaid-svg-N1CDclTVmLRJTaWJ .label text,#mermaid-svg-N1CDclTVmLRJTaWJ span{fill:#333;color:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ .node rect,#mermaid-svg-N1CDclTVmLRJTaWJ .node circle,#mermaid-svg-N1CDclTVmLRJTaWJ .node ellipse,#mermaid-svg-N1CDclTVmLRJTaWJ .node polygon,#mermaid-svg-N1CDclTVmLRJTaWJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-N1CDclTVmLRJTaWJ .rough-node .label text,#mermaid-svg-N1CDclTVmLRJTaWJ .node .label text,#mermaid-svg-N1CDclTVmLRJTaWJ .image-shape .label,#mermaid-svg-N1CDclTVmLRJTaWJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-N1CDclTVmLRJTaWJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-N1CDclTVmLRJTaWJ .rough-node .label,#mermaid-svg-N1CDclTVmLRJTaWJ .node .label,#mermaid-svg-N1CDclTVmLRJTaWJ .image-shape .label,#mermaid-svg-N1CDclTVmLRJTaWJ .icon-shape .label{text-align:center;}#mermaid-svg-N1CDclTVmLRJTaWJ .node.clickable{cursor:pointer;}#mermaid-svg-N1CDclTVmLRJTaWJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-N1CDclTVmLRJTaWJ .arrowheadPath{fill:#333333;}#mermaid-svg-N1CDclTVmLRJTaWJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-N1CDclTVmLRJTaWJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-N1CDclTVmLRJTaWJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N1CDclTVmLRJTaWJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-N1CDclTVmLRJTaWJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N1CDclTVmLRJTaWJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster text{fill:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ .cluster span{color:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ 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-N1CDclTVmLRJTaWJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-N1CDclTVmLRJTaWJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-N1CDclTVmLRJTaWJ .icon-shape,#mermaid-svg-N1CDclTVmLRJTaWJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-N1CDclTVmLRJTaWJ .icon-shape p,#mermaid-svg-N1CDclTVmLRJTaWJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-N1CDclTVmLRJTaWJ .icon-shape .label rect,#mermaid-svg-N1CDclTVmLRJTaWJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-N1CDclTVmLRJTaWJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-N1CDclTVmLRJTaWJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-N1CDclTVmLRJTaWJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 修复: store_release/load_acquire
happens-before
(形式化)
atomic64_set(kf_x)
atomic64_set(kf_P)
smp_store_release(kf_active)
smp_load_acquire(kf_active)
smp_load_acquire(kf_x)
写方:smp_store_release(&kcc_kf_active, 1) --- 所有先前的内存写入(kf_x、kf_P)在此 store 对其它 CPU 可见之前必定完成。
读方(5 处无锁读取点):smp_load_acquire(&kcc_kf_active) --- 后续读取(kf_x)必定看到写方的值。
C11 内存模型下,release-store 与 acquire-load 配对建立形式化 happens-before 边------不依赖注释,不依赖手工屏障配对。
Reader (CPU 1) Writer (CPU 0) Reader (CPU 1) Writer (CPU 0) #mermaid-svg-krT0drSyfSq1Wur9{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-krT0drSyfSq1Wur9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-krT0drSyfSq1Wur9 .error-icon{fill:#552222;}#mermaid-svg-krT0drSyfSq1Wur9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-krT0drSyfSq1Wur9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-krT0drSyfSq1Wur9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-krT0drSyfSq1Wur9 .marker.cross{stroke:#333333;}#mermaid-svg-krT0drSyfSq1Wur9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-krT0drSyfSq1Wur9 p{margin:0;}#mermaid-svg-krT0drSyfSq1Wur9 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-krT0drSyfSq1Wur9 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-krT0drSyfSq1Wur9 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-krT0drSyfSq1Wur9 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-krT0drSyfSq1Wur9 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-krT0drSyfSq1Wur9 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-krT0drSyfSq1Wur9 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-krT0drSyfSq1Wur9 .sequenceNumber{fill:white;}#mermaid-svg-krT0drSyfSq1Wur9 #sequencenumber{fill:#333;}#mermaid-svg-krT0drSyfSq1Wur9 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-krT0drSyfSq1Wur9 .messageText{fill:#333;stroke:none;}#mermaid-svg-krT0drSyfSq1Wur9 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-krT0drSyfSq1Wur9 .labelText,#mermaid-svg-krT0drSyfSq1Wur9 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-krT0drSyfSq1Wur9 .loopText,#mermaid-svg-krT0drSyfSq1Wur9 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-krT0drSyfSq1Wur9 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-krT0drSyfSq1Wur9 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-krT0drSyfSq1Wur9 .noteText,#mermaid-svg-krT0drSyfSq1Wur9 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-krT0drSyfSq1Wur9 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-krT0drSyfSq1Wur9 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-krT0drSyfSq1Wur9 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-krT0drSyfSq1Wur9 .actorPopupMenu{position:absolute;}#mermaid-svg-krT0drSyfSq1Wur9 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-krT0drSyfSq1Wur9 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-krT0drSyfSq1Wur9 .actor-man circle,#mermaid-svg-krT0drSyfSq1Wur9 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-krT0drSyfSq1Wur9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} === happens-before === 观测到 active=1 保证看到 Writer 写入的值 kf_x = estimatekf_P = covariancesmp_store_release(kf_active, 1)smp_load_acquire(kf_active)smp_load_acquire(kf_x)
影响范围 :这是一个次要优化。即使某次 ACK 读到过期值------smp_rmb 方案下的风险同样存在------下一次 ACK(约 1 RTT 内)几乎必定读到正确值。跨连接 BDP 共享对时序不敏感,单次 ACK 的延时不影响稳态行为。形式化 happens-before 的价值在于消除读者对"注释配对正确性"的依赖,使代码可被形式验证工具接受。
六个推导参数
| 参数 | 默认 | 推导 | 理论依据 |
|---|---|---|---|
kcc_drain_timeout_rtts |
24 | tdrain=1.53t_{\text{drain}} = 1.53tdrain=1.53 RTT, 3σ=4.63\sigma = 4.63σ=4.6, 3×23=243\times 2^3 = 243×23=24 | 15.7× 余量;按 RTT 自适应缩放 |
kcc_probe_up_max_rtts |
16 | BDP / 0.25C = 4 RTT, 3σ→123\sigma \to 123σ→12, 24=162^4 = 1624=16 | 4× 余量;应用受限流安全 |
kcc_tier1_blocked_thresh |
3 | 死区 41 RTT, 3×41=1233\times 41 = 1233×41=123 RTT ≈ 2 s | 无线漫游窗口匹配;2−3=12.5%2^{-3} = 12.5\%2−3=12.5% 虚警率 |
kcc_saturation_hold_rtts |
30 | Tosc=56T_{\text{osc}} = 56Tosc=56, 半周期 28, 30 > 28 | 最小安全整数抑制上升沿 |
kcc_ecn_ewma_floor |
4 | 保留率 3/4, ss(p)=4p\text{ss}(p) = 4pss(p)=4p, 4/256=2−64/256 = 2^{-6}4/256=2−6 | 最小可分辨的 2 的幂分量 |
kcc_neg_persist_time_shift |
1 | TSO 突发 ~µs ≪ Tprop/2T_{\text{prop}}/2Tprop/2 ~ms | 全链路速率有效分离 |