NAT 与打洞技术简明说明
NAT(网络地址转换)把私有网络地址映射到公网地址/端口,节省 IPv4 地址并隔离内网。打洞(hole punching)是绕过中继,让两端直接建立点对点连接的常用技术,但其可行性取决于 NAT 类型。
常见 NAT 类型(简要)
- Full Cone NAT(完全锥形):内外映射固定,最容易打洞。
- Restricted Cone NAT(受限锥形):仅允许被内部主机主动访问过的外部地址返回流量,UDP 打洞通常可行。
- Port-Restricted Cone NAT(端口受限锥形):更严格,需要匹配端口,UDP 打洞仍经常可行。
- Symmetric NAT(对称 NAT):对每个目标分配不同的映射,端到端打洞通常失败或极其不稳定。
结论:非对称(非-Symmetric)NAT 对 UDP 打洞友好;Symmetric NAT 常需要中继(TURN)或其他穿透手段。
打洞(Hole Punching)概述
UDP 打洞流程(常见):
- 双方向公共服务(如 STUN)注册并获取各自公网映射。
- 服务把双方的公网地址:端口互相告知。
- 双端开始向对方的公网地址:端口发包(触发 NAT 映射),从而建立直接路径。
TCP 打洞:比 UDP 更难,通常依赖同时发起连接或特殊中间协调,兼容性和成功率低于 UDP。
对称 NAT 问题:
- 因为映射依赖目标地址/端口,直接用 STUN 得到的映射对其它目标无效。
- 结果是无法预测或复用端口,打洞失败,需要 TURN 等中继服务。
实践要点(简洁)
- 首选:先尝试 UDP 打洞 + STUN;若失败,降级到 TURN 中继。
- 保持短周期 keepalive(NAT 过期)以维持映射,但不要过于频繁以免浪费带宽。
- 使用
EPOLL/异步 I/O 在高并发场景处理大量打洞/心跳包时更高效。 - 对称 NAT 环境:设计时假定需要中继,或尝试结合多路径/UDP 穿透库(libp2p/ICE 等)。