[feat] pin expanded UDP punching and update validation records

This commit is contained in:
dijunkun
2026-09-14 15:48:17 +08:00
parent 0b1328eeee
commit 4a44b3109e
3 changed files with 368 additions and 21 deletions
+63 -20
View File
@@ -1,10 +1,10 @@
# CrossDesk 双端 UDP 打洞增强实现方案
状态:P0 门槛已通过;P1–P4 默认关闭原型、受控运行与跨平台构建已实现;P5 实验工具已交付,真实未知 NAT 对照和最终双端应用切换验收待执行。日期:2026-09-14。第 15 节保留 P0 历史记录,最新进展与边界见第 16 节。
状态:P0 门槛已通过;P1–P4 默认关闭原型、受控运行与跨平台构建已实现;真实异网 C 组已有两次增强直连通过双端日志及抓包核验,正式 P5 对照仍待执行。按用户要求,画面、声音、控制和切换质量不纳入本次验收。日期:2026-09-14。第 15 节保留 P0 历史记录,最新进展与边界见第 16 节。
源码基线:CrossDesk `73e3bf709d7c054df7bd75cfafceda0721c6cda1`;MiniRTC 子模块 `f169a696cb4e6cb59037ec02e85532e30d3c1262`;libnice `0.1.24` 加仓库已有补丁。
本文规定第一版的范围、接口职责、协议、资源预算、开发顺序和验收条件。第 1–14 节保留设计基线,实际接口及完成情况以第 15–16 节和所链接的执行报告为准。实现和受控测试不代表真实 NAT 成功率已得到验证。
本文规定第一版的范围、接口职责、协议、资源预算、开发顺序和验收条件。第 1–14 节以设计基线为基础,第 6 节同步当前实验参数;调整理由、实际接口及完成情况以第 15–16 节和所链接的执行报告为准。实现和受控测试不代表真实 NAT 成功率已得到验证。
## 1. 目标与取证依据
@@ -184,14 +184,14 @@ SDP 的能力行不是命令;资源数量由本地配置和认证后的协商
### 6.1 anchor 的行为
1. 保留与稳定公网观测对应的实际 host socket,沿用当前物理接口绑定。
2. 在已确认的对端公网 IP 上,从 1024–65535 无放回抽取目的端口,默认 512 个。先生成完整集合再按随机顺序调度,使用可注入的 CSPRNG;测试使用固定种子。
2. 在已确认的对端公网 IP 上,从 1024–65535 无放回抽取目的端口,默认 1024 个。先用可注入的 CSPRNG 生成随机集合,再将选中的离散端口按数值递增调度;测试使用固定种子。只对抽样结果排序,避免退化为从最低端口开始的连续扫描。
3. 现有普通候选和邻近预测继续由原 ICE 调度;新探索集合避免重复消耗这些目标的探测预算。低于 1024 的探测以及非均匀采样留待后续实验,不声称第一版覆盖 UU 的全部端口范围。
4. 每个新目标默认发一次 PROBE。收到 pool 的认证 PROBE 时,从同一 socket 向该包实际来源端点回 PROBE_ACK;该源 IP 必须仍属于本轮批准的对端公网 IP。
5. 原始来包地址用于路径发现;不能用包内宣称的地址替代源地址,也不能把 TURN 逻辑地址当成直接源地址。
### 6.2 pool 的行为
1. 在同一选定物理接口上分配默认 64 个不同 UDP 本地端口;绑定地址和接口遵循原 ICE socket 的平台规则。
1. 在同一选定物理接口上分配默认 128 个不同 UDP 本地端口;绑定地址和接口遵循原 ICE socket 的平台规则。本地端口仍由系统分配,不要求其数值递增,也不据此推断公网映射顺序。
2. 新 socket 不为每个端点申请 TURN allocation、启动独立 DTLS 或开展完整多 STUN 采集,只向 anchor 已协商的公网端点探索。
3. 以 round-robin 调度 PROBE,最多 3 轮;相邻轮至少间隔 1 秒。全部端点保持可接收至本轮停止或被接入 ICE,不能发完就关闭。
4. 收到 anchor 的有效 PROBE 或匹配 ACK 后,对该具体 socket 请求提升并启动普通 ICE 检查;收到 PROBE 时先从同一 socket 回复 ACK。
@@ -199,18 +199,18 @@ SDP 的能力行不是命令;资源数量由本地配置和认证后的协商
两侧时间窗需要重叠,但不要求包在同一毫秒发出。允许丢失第一包、控制消息重传和两端系统时钟有偏差。
### 6.3 初始配置
### 6.3 当前实验配置
以下是第一轮实验参数,不是从 UU 反推的最佳值。所有值通过经过校验的不可变 `PunchConfig` 进入每个 IceAgent。
以下是按用户要求扩大数量并改为离散递增发送后的实验参数,不是从 UU 反推的最佳值。调整理由见第 16.3 节;历史测试仍保留其原始参数。所有值通过经过校验的不可变 `PunchConfig` 进入每个 IceAgent。
| 参数 | 默认实验值 | v1 硬上限 / 规则 |
| --- | --- | --- |
| enabled | false | 必须双方开启 |
| trigger_delay_ms | 1500 | 从首次选中 relay 计时,并等待 DTLS 指纹已验证 |
| mapping_sample_max_age_ms | 15000 | 不跨 generation 或接口变化复用 |
| pool_size | 64 | 每会话最多 128;禁止远端扩容越过本地上限 |
| target_port_count | 512 | 最多 1024,唯一端口数 |
| probe_pps | 100 | 本端全部新增 PROBE/ACK 合计最多 200 包/秒 |
| pool_size | 128 | 每会话最多 128;禁止远端扩容越过本地上限 |
| target_port_count | 1024 | 最多 1024,唯一端口数 |
| probe_pps | 128 | 本端全部新增 PROBE/ACK 合计最多 200 包/秒 |
| burst_packets | 8 | token bucket;事件循环滞后时不能瞬间补发整个积压队列 |
| pool_probe_rounds | 3 | v1 最多 3;重发也计入总预算 |
| round_duration_ms | 10000 | 探索阶段时长,最多 15000,并受原 relay upgrade 截止时间限制 |
@@ -282,7 +282,7 @@ SDP 的能力行不是命令;资源数量由本地配置和认证后的协商
### 7.4 候选数量与 end-of-candidates
探索 socket 在命中之前不参加全量候选配对,不为 64×512 个组合建立检查对象;控制提升数量,逐个接入正常检查。
探索 socket 在命中之前不参加全量候选配对,不为端点与目标端口的全部组合建立检查对象;控制提升数量,逐个接入正常检查。
内部增强端点不通过普通 `new_candidate` 信令发送。为这些端点明确添加内部来源标记,并在现有 `new-candidate-full` 回调处处理,防止在已发送 end-of-candidates 后又误发一批普通候选。既有 host/srflx/relay 的正常收集和结束标记不受影响。
@@ -357,7 +357,7 @@ INFO 记录阶段和结论;逐包记录放入可选调试日志。所有记录
- 满足增强条件并实际启动的连接中的增强成功比例。
- 普通 ICE 自行成功、增强成功、继续 relay、连接失败的数量。
分母包含失败/超时,不把“跳过增强”混入增强失败,也不能只汇总成功样本。记录 P50/P95 建立耗时、额外包数、峰值句柄、CPU 和切换期间的媒体间隙。每条结论都能追到 session ID、二进制版本和抓包。
分母包含失败/超时,不把“跳过增强”混入增强失败,也不能只汇总成功样本。记录 P50/P95 建立耗时、额外包数、峰值句柄和 CPU。切换期间的媒体间隙为可选观测,缺测记 null,不作为本次验收门槛。每条结论都能追到 session ID、二进制版本和抓包。
## 10. 分阶段实施与验收
@@ -414,6 +414,10 @@ P0 工具只能使用实验提供的明确对端地址,不含广范围探测
先验收机制和无回归,再评价收益:每个增强成功样本必须能证明直接命中 → 标准 STUN → nomination → 直接媒体;默认关闭路径无行为变化;资源全部在上限内。报告成功比例的不确定性,不从小样本承诺固定提升幅度。
验收范围调整(2026-09-14,用户明确要求):不验收画面、声音、控制和切换质量,
不再将这些项目列为阻塞项,也不将免验记为测试通过。仍需证明同一命中 socket
完成标准 ICE 提名并持续承载应用数据,保留 DTLS、兼容性及资源生命周期检查。
在真实网络证明净收益且兼容/退出检查通过之前,保持默认关闭;通过后再单独形成默认启用及参数调整变更。
## 11. 测试设计
@@ -654,8 +658,8 @@ P0 后端接口、所有权与取消语义按 15.2 冻结,允许进入 P1。P0
| P1 | 配置/能力、指纹验证后 exporter、认证协议与协商完成;默认关闭,新旧/未知能力纯逻辑及实际生成能力检查通过 |
| P2 | 同源观测、角色、CSPRNG 采样、本地与进程预算完成;首次实现时 Mac/Windows/Linux 各 2,952 个单元断言通过,后续清理回归见验证记录 |
| P3 | 独立 ABI 2、64/128 端点、同 socket 提升/标准检查/提名/媒体闭环实现;三个平台受控 runtime 各 12/12 |
| P4 | owner context 清理、DRAINING、取消、重连身份和接口/base 检查实现;百次 source/agent 生命周期、Mac/Windows 完整应用、Linux ICE smoke、iOS 静态库已验证。物理网卡真实切换和最终应用互连仍待双端验证 |
| P5 | 90 次交错清单与核验工具已准备;有 1 次增强成功双端日志但无该轮物理抓包。后续双端抓包取得 A/off 的 3 个完整窗口样本(均中继),B/wide-only 的 2 次已启动未命中和 1 次启动前跳过。跳过暴露的 READY 重查时序问题已修复,真实双端修复后复测及正式随机 A/B/C 仍待进行;保留先前 SDP 失败,不作收益或默认开启决定 |
| P4 | owner context 清理、DRAINING、取消、重连身份和接口/base 检查实现;百次 source/agent 生命周期、Mac/Windows 完整应用、Linux ICE smoke、iOS 静态库已验证。另有新版 Mac→旧 Windows 的非 SRTP 与 DTLS/SRTP 普通中继互通及清理日志;后者本地增强资格满足、旧端不支持,正确不启动增强。物理网卡真实切换和其余旧版连接组合仍待验证 |
| P5 | 90 次交错清单与核验工具已准备;完整窗口 A/off 3 次均中继,READY 重查修复后 B/wide-only 3 次均启动但未命中,C/pool-wide 3 次为 2 次增强直连、1 次中继。两个成功会话已补齐 Windows 日志并由仓库 wire 脚本核验 2/2 通过。正式随机 A/B/C、运行版本和捕获统计仍需补齐,不作收益或默认开启决定;画面/声音/控制/切换质量按用户要求免验 |
### 16.1 对实际源码的必要调整
@@ -697,10 +701,49 @@ Windows 64 端点百次压力测试在单一窗口到期后拒绝分配;工具
各实际收到至少 10 个认证 SRTP 包后才开池。所有初次失败和修正理由保存在报告中,
不追溯认定所有历史媒体缺包原因相同。
用户已报告完成的普通画面/声音/控制/三次重连回归属于 P0 时点,不代表后续原型
已通过真实应用切换验收。后续已有异网配对的双端成功日志,下一步补齐物理抓包,
并在同步接收端修复后,用同一版本、同一信令
与 STUN/TURN 配置,按文档交错执行 A/B/C;首先确认新鲜多 STUN 观测符合一侧稳定、
另一侧目的相关。每个增强成功必须核验双端物理报文、标准提名、同一命中 socket、
同一 DTLS/SRTP 会话以及实际画面/声音/控制。至少每组 30 次、保留全部失败/缺测。
在这些工作完成前,原型仍默认关闭,不能声称已提高真实网络成功率。
真实异网 C 组已有两个成功会话完成双端日志、命中 handle、标准提名和物理抓包
关联;Windows 的 handle 38/44 分别对应命中本地端口 54058/51630,随后持续直连。
成功停止探测后额外 socket 计数各为 1,第三次未命中超时后归零;两端每次均只有
一次 DTLS 握手。完整技术证据及限制见所链接的验证记录。
14:18–14:22 的后续故障实验另记录五个 generation:一轮增强直连、四轮中继。
增强直连在约 10.3 秒入站 UDP 中断后沿用命中 socket 恢复,两轮中继在约 29.9/
17.2 秒中断后恢复;每次均单次 DTLS,并完成连接清理及后续新 generation 建连。
包含 DRAINING 未命中时取消、探测超时及 HELLO 超时;该轮增强成功的仓库 wire
核验 1/1 通过。用户补充确认 clumsy 丢包率为 100%;过滤范围、方向、启停时间及
真实网卡切换尚未确认,不将观察到的间隙当作精确配置时长或物理接口变化通过,
也不并入正式 A/B/C 分母,详见验证记录。
UU 与 CrossDesk 的端口发现及通道复用差异,按
[双端对照测试](p2p-uu-comparison-test-plan.md) 先做 8 次诊断连接。进程重启与保留
进程重连分开记录,不把短暂静默当作 NAT 映射清空,也不混入正式 P5 成功率。
用户在 2026-09-14 明确取消画面、声音、控制和切换质量验收;这些项目免验,
不再要求人工回归或质量指标,不追溯标记为已测试。后续用同一版本、同一信令与
STUN/TURN 配置交错执行 A/B/C,核对有效观测、双端物理报文、标准提名、同一命中
socket、同一 DTLS/SRTP 会话和持续应用数据。至少每组 30 次,保留全部失败/缺测,
并完成真实接口变化、重连及连接兼容性检查。在真实收益结论完成前保持默认关闭。
### 16.3 离散递增与数量调整(2026-09-14,U01/X01 之后)
按用户要求,将 anchor 的随机无重复目标集合改为按端口数值递增发送,默认目标
512 → 1024、pool 64 → 128、每端 PROBE/ACK 速率 100 → 128 PPS。先完成随机
抽样再排序,保留原来的全范围抽样分布及候选排除;pool 本地端口继续由系统分配。
源码确认 runtime 每 10 ms 最多处理 8 个包,因此 128 PPS 不受“一次回调一个包”
限制。单轮无 ACK、无争用的理想调度约 8 秒可完成 1024 个目标;100 PPS 在原
10 秒窗口内不能保证覆盖这些目标,因而配套调整速率,没有延长探索或 ICE 截止。
保留 1024 次 PROBE/ACK 合计预算、8 包突发、200 PPS 进程限速和最多 256 个额外
socket。命中、ACK、发送失败、同进程会话争用、原窗口剩余时间不足都可能减少
实际新目标数量,1024 是计划上限,不承诺每次发完。双方使用 HELLO 逐项取较小
预算,旧参数对端仍收敛到 64/512/100;没有增强能力的旧端保持普通 ICE/中继。
本次不改变后端 ABI、仓库 libnice 补丁、选路、命中 socket 接入和 DTLS 生命周期。
这是一组新的实验配置,历史 U01/X01 结论及参数不改写。需要双方重新构建并重启
才能使用完整新参数;旧 P5 manifest 保留显式参数,新批次应重新生成 manifest。
数量增加及发送顺序本身不构成真实 NAT 成功率提高的证明。
本机 Mac 完整构建、5,430 个单元断言、Python 工具 10/10、三种模式兼容性及
各 36 个传输层 SDP 组合通过;128 端点 runtime 8/8、DRAINING 2/2 通过。
这些是本机回环受控网络结果,Windows 新配置及真实异网尚未运行;详情见
[本次回归记录](../deps/submodules/minirtc/tests/ice/lab/punch-runtime-validation-2026-09-14.md#离散递增及扩大默认数量2026-09-14u01x01-之后)。