[feat] enable SRTP by default and pin pool-wide UDP punching

This commit is contained in:
dijunkun
2026-09-14 16:53:57 +08:00
parent e09be46c24
commit cc5e74c6b3
20 changed files with 111 additions and 100 deletions
+27 -5
View File
@@ -1,6 +1,6 @@
# CrossDesk 双端 UDP 打洞增强实现方案
状态:P0 门槛已通过;P1–P4 默认关闭原型、受控运行与跨平台构建已实现;真实异网 C 组已有两次增强直连通过双端日志及抓包核验,正式 P5 对照仍待执行。按用户要求,画面、声音、控制和切换质量不纳入本次验收。日期:2026-09-14。第 15 节保留 P0 历史记录,最新进展与边界见第 16 节。
状态:P0 门槛已通过,P1–P4 原型、受控运行与跨平台构建已实现。按用户最新要求,原生桌面默认且仅提供 pool-wide,CrossDesk 本机 SRTP 固定开启;无指纹旧端保留原有兼容回退。真实异网已有增强直连证据,默认调整不代表正式收益验收通过。按用户要求,画面、声音、控制和切换质量不纳入本次验收。日期:2026-09-14。第 15 节保留 P0 历史记录,最新进展与边界见第 16 节。
源码基线:CrossDesk `73e3bf709d7c054df7bd75cfafceda0721c6cda1`;MiniRTC 子模块 `f169a696cb4e6cb59037ec02e85532e30d3c1262`;libnice `0.1.24` 加仓库已有补丁。
@@ -54,7 +54,7 @@ Mac 先前发往 :11968 的短包没有出现在 Windows 捕获中;成功开
3. **新 socket 由 libnice 管理。** 不在 GUI、业务数据通道或独立线程中建立脱离 ICE 生命周期的临时 socket 池。
4. **探索和 ICE 检查分开调度。** 数百个目的端口属于有限的探索集合;只有少量命中端点进入普通检查表。
5. **保留普通 ICE 与已有 30 秒升级窗口。** 增强操作不能重置该窗口、重启 DTLS,或延迟正常的中继可用状态。
6. **默认关闭。** 编译扩展存在、运行配置开启、双方声明支持、网络和连接状态满足条件时才启动。
6. **默认 pool-wide。** 原生桌面包含扩展、无公开模式选择;双方声明支持、加密认证、网络和连接状态满足条件时才启动。未满足条件仍使用原 ICE/中继。iOS/WebRTC 不启用。
这会使第一版主要改善“已通过中继连接,但希望随后升为 P2P”的场景。将来需要在没有中继时运行同类算法,应另行设计可验证的信令协调通道。
@@ -232,7 +232,7 @@ HELLO 的重发额度耗尽只停止主动发送,在原升级截止内继续
控制包与新增 PROBE/ACK 单独计数;提升后的普通 STUN 检查遵循 libnice 原节拍,但需要记录它们带来的额外事务和重传。媒体包不计入探测预算。
首次实现用内部配置和明确命名的实验环境变量加载配置,仅读取一次,不增加公开 `Params` 布局或 GUI 开关;例如 `MINIRTC_UDP_PUNCH=off|wide-only|pool-wide`。无效值禁用增强并打印原因。端口池大小等调参入口统一由同一校验函数处理。
当前原生桌面配置仅读取一次,固定使用 pool-wide,不增加公开 `Params` 布局或 GUI 模式开关。原 `MINIRTC_UDP_PUNCH` 模式变量不再读取,公开编译开关已移除。端口池大小等诊断调参入口仍由同一校验函数处理;无效预算禁用增强并打印原因,不绕过资源上限。
`wide-only` 保留同样的协议、角色和锚点选择,但 pool 侧只用一个端点;`pool-wide` 使用配置的端点池。基线 `off` 仍保留已有附近端口预测。不能让实验分组顺带改变其他 ICE、TURN 或重试配置。
@@ -423,7 +423,7 @@ P0 工具只能使用实验提供的明确对端地址,不含广范围探测
不再将这些项目列为阻塞项,也不将免验记为测试通过。仍需证明同一命中 socket
完成标准 ICE 提名并持续承载应用数据,保留 DTLS、兼容性及资源生命周期检查。
在真实网络证明净收益且兼容/退出检查通过之前,保持默认关闭;通过后再单独形成默认启用及参数调整变更。
原计划将收益验收作为默认启用门槛;用户现明确要求默认且仅用 pool-wide,因此调整默认策略。网络适用范围、认证、原截止和资源预算不变;历史 A/B 记录保留,新程序不再提供 A/B 模式,详见 16.5。
## 11. 测试设计
@@ -487,7 +487,7 @@ P0 工具只能使用实验提供的明确对端地址,不含广范围探测
如果 P0 证明某个后端接口或 selected-pair 路径不可按本文实现,应先根据实际 libnice 代码修订这一处设计并给出替代路径,再继续后续阶段;不要把未完成的直接验证改成强制选路或延长超时。
本方案当前的执行目标是一个默认关闭、可复现实验、完整管理 socket 生命周期的原型。通过 P5 后,才讨论默认启用、扩大网络适用范围,以及首次连接阶段的增强。
本方案原始执行目标是默认关闭的实验原型;当前默认策略按用户要求改为 pool-wide,见 16.5。扩大网络适用范围及首次连接阶段增强不属于这次默认调整。
## 14. 技术依据
@@ -777,3 +777,25 @@ socket。命中、ACK、发送失败、同进程会话争用、原窗口剩余
TURN → 标准 ICE → 同一命中 socket 上持续 SRTP。默认开关、128/1024/128 PPS
实验参数、30 秒升级截止及 DTLS 生命周期不变。结果和 Windows 操作见
[修复验证记录](../deps/submodules/minirtc/tests/ice/lab/punch-runtime-validation-2026-09-14.md#hello-启动错位与映射地址碰撞修复2026-09-14)。
### 16.5 默认 pool-wide 与本机 SRTP 固定开启(2026-09-14)
按用户要求,原生桌面不再提供 off/wide-only/pool-wide 三选一入口,也移除公开
构建开关。读取进程配置时直接选择 pool-wide;遗留模式环境变量不再生效,诊断
TRACE 与有界预算调参仍保留。内部 Off 是不支持平台/无效参数状态,WideOnly
仅保留 v1 协议及 P0/单端点夹具用途,不是产品选项。
CrossDesk 移除 Slint 和旧 ImGui 设置中的 SRTP 控件、对应 setter 与可变 UI 状态。
INI 中旧 false/缺失/无效 SRTP 值迁移为 true,其他配置保留;新建连接始终请求
SRTP。用户对旧版兼容提出疑问,因此保留无 DTLS 指纹旧端的原明文回退:这是
默认请求加密,不是拒绝所有明文旧端。该回退不能启动增强打洞。原来只根据本地
设置显示的加密盾牌被移除,避免在旧端回退时误报已加密。
没有改变候选/认证门槛、128 个端点、1024 个目标、128 PPS、30 秒总窗口,
没有强制选路或重启 DTLS。旧端没有增强能力时继续普通 ICE/中继;iOS 和 WebRTC
不启用此增强。默认启用是用户选择,不能从中推导所有 NAT 都能直连。
实验工具新计划只生成 C/pool-wide,拒绝启动旧 A/B 条目;历史结果仍可读取汇总。
同机自动入口、旧端能力与无指纹兼容、SRTP 配置迁移及真实 TURN/DTLS/SRTP
验证详见 [本次记录](../deps/submodules/minirtc/tests/ice/lab/punch-runtime-validation-2026-09-14.md#默认-pool-wide-与本机-srtp-固定开启2026-09-14)。