工程上最危险的不是完全不可用,而是在理想环境里正常、进入真实网络和真实数据量后悄悄失去边界。 浏览器通常看不到路由器 WAN 地址,因此无法可靠比较 WAN 与 STUN 公网地址。100.64/10 是强信号,但缺失它不代表没有 CGNAT。
网络诊断必须区分观察事实与推断结论。候选类型、选中路径和阶段耗时可以证明连接过程,完整 IP 或一次探测结果既不必要,也不足以代表真实可达性。
工程边界与取舍
先把下面几项写成可评审的规则,而不是散落在回调和界面判断里。规则越清楚,后续扩容、兼容和排错越少靠猜。
- 诊断只给概率与依据:多 STUN 映射、端口不稳定和已知运营商网络提高可能性;连接策略仍让 ICE 实测并准备 TURN。
- 把协议事实、用户意图和自动恢复分层;自动化只能恢复事实,不能推翻用户明确选择。
- 重试必须带幂等键、退避和截止时间;超过截止时间后建立新任务,而不是继续复活旧回调。
“CGNAT 能否检测:可以找迹象,不能靠一个 IP 下定论”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
生产环境会怎样出错
边界条件会把隐藏假设变成真实事故。弱网、刷新、并发和容量上限必须组合测试,因为单独出现时它们往往都能被重试掩盖。
- 把 srflx 地址属于公网当作非 CGNAT 结论是错误的,因为 CGNAT 最终也映射到公网;主动扫描 NAT 又会侵犯隐私。
- 旧响应在新任务建立后迟到,如果没有版本隔离,会把健康状态覆盖成失败或再次启动已取消工作。
- 降级路径从未压测,主路径故障时所有流量同时进入更慢、更昂贵的后备方案。
把测试跑成闭环
发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。
- 在家庭公网、双层 NAT、移动热点和真实 CGNAT 网络采样,比较诊断置信度与最终 pair,记录误报和漏报而非硬标签。
- 在操作中途断网、切换网络并恢复,核对两端状态、持久化记录和资源计数最终一致。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
可以上线的标准是:用户知道当前发生了什么,系统在异常后能停止或恢复,资源不会无界增长,运维也能从最小必要证据定位阶段。