目录
[1. NAT问题的本质](#1. NAT问题的本质)
[2. NAT类型的严格定义](#2. NAT类型的严格定义)
[2.1 映射行为与过滤行为的分离](#2.1 映射行为与过滤行为的分离)
[2.2 三类锥形NAT](#2.2 三类锥形NAT)
[2.3 Symmetric NAT](#2.3 Symmetric NAT)
[3. STUN与TURN的协作方案](#3. STUN与TURN的协作方案)
[3.1 STUN:NAT类型探测与地址发现](#3.1 STUN:NAT类型探测与地址发现)
[3.2 TURN:中继转发的绝对回退](#3.2 TURN:中继转发的绝对回退)
[3.3 ICE:多层候选中择优](#3.3 ICE:多层候选中择优)
[4. 工程实践的广泛约束](#4. 工程实践的广泛约束)
[4.1 运营商级NAT的双层嵌套](#4.1 运营商级NAT的双层嵌套)
[4.2 保活与超时](#4.2 保活与超时)
[5. 结语](#5. 结语)
1. NAT问题的本质
NAT使多台主机通过同一个公网IP访问互联网,内网主机使用私有地址,NAT网关在出站时将源地址替换为公网地址并在端口上做映射,入站时根据已有映射逆向恢复内网目标。NAT本为解决IPv4地址数量问题而设计,其副作用是使公网侧无法直接向NAT内部的设备主动发起连接------未建立映射的入站包在NAT处不知应发给哪个内网主机,只能丢弃。
对于P2P通信场景------VoIP音视频通话、在线游戏、文件共享------通信双方通常都位于各自的NAT后面,既不拥有公网IP也不在同一内网,必须解决NAT穿透问题。NAT穿透的核心诉求是在双方均无公网可达地址的条件下,寻找一条使数据能够穿透两道NAT网关的路径。
2. NAT类型的严格定义
2.1 映射行为与过滤行为的分离
NAT的行为可以从两个独立维度进行分类:映射行为描述内网地址端口如何被映射为公网地址端口,过滤行为描述公网侧入站包的接收条件。这两个维度的组合决定了NAT的穿透可行性。
映射行为的保守度指示NAT是否为同一内网端点在不同外部目的地的通信分配不同的公网映射。过滤行为的保守度指示在映射已存在的情况下,来自公网侧哪些源地址的包能通过NAT。
2.2 三类锥形NAT
Full Cone NAT的映射行为和过滤行为均最宽松。从内网地址(IP_A:Port_A)发出的数据包被映射为固定的公网映射地址(IP_N:Port_N)。一旦该映射存在,来自任何公网外部地址目标为(IP_N:Port_N)的包均被转发至内网(IP_A:Port_A)。映射完全不会根据通信对端不同而改变,过滤条件为无任何限制。
Restricted Cone NAT(受限制锥形NAT)映射行为与Full Cone相同------所有出站包共用一个公网映射。但过滤规则强制目标映射后只接受从内网主机曾发送过数据的外部IP地址发回的包。外部IP X向内网端点A发送过数据的目标端口被A回复后,后续来自X指向该公网映射的所有包被放行;来自Y的包即使目标为该公网映射也被拒绝。
Port Restricted Cone NAT(端口受限锥形NAT)在Restricted Cone的基础上将过滤粒度从IP精确到IP:Port。只有内网主机之前发送过数据的目标IP:Port发回的包才能通过过滤。同一外部IP的不同端口若未被发送过数据,对应包被拒绝。
2.3 Symmetric NAT
Symmetric NAT(对称NAT)的映射行为与锥形NAT有本质区别。从同一个内网端点(IP_A:Port_A)发往不同目标(IP_B:Port_B)和(IP_C:Port_C)时,NAT分配的公网映射端口也不同------端口1对应目标B,端口2对应目标C。过滤行为与端口受限锥形NAT相同------只接受内网主机已经向其发送过数据的目标IP:Port发回的包。
Symmetric NAT的映射行为决定了它不能通过常规的间接地址传递来实现P2P穿透------即使内网端点A通过STUN服务器了解到自己通向服务器端的公网映射(IP_N:Port_S),也无法将此端口告知对等端点,因为该映射只对服务器IP有效。对等端点使用该目标端口发送数据包会因映射不匹配被Symmetric NAT拒绝。
3. STUN与TURN的协作方案
3.1 STUN:NAT类型探测与地址发现
STUN允许NAT后的主机向公网STUN服务器发送探测请求,服务器从接收到的UDP包源地址和源端口中提取该内网主机的公网映射信息(IP和端口),在响应中返回给客户端。客户端由此获知自己在NAT上的公网存在。
STUN还支持NAT类型探测:通过向STUN服务器请求从不同IP或端口进行响应,测试NAT对不同外部来源的过滤行为,从而判断NAT类型。但STUN探测的NAT类型是对映射和过滤行为组合的推断结果,仅依赖STUN响应无法百分之百逐类精确区分所有NAT实现------NAT行为并不总是与RFC规范严格一致。
3.2 TURN:中继转发的绝对回退
某些NAT组合下两个端点无法建立直接P2P连接------例如两方均为Symmetric NAT,或一方为Symmetric NAT另一方为端口受限锥形NAT。TURN提供中继级别的通信方式:客户端向TURN服务器请求分配中继转发地址,将对端数据发送到TURN服务器,服务器将数据复制转发给目标端点。数据路径不是双方直连,而是通过TURN服务器的中继。
TURN的代价在于带宽成本------所有流量经过TURN服务器,服务器带宽需求等于所有客户端的双向流总和。TURN应作为ICE框架中的最低优先级候选,仅在直接连接完全不可行时启用。
3.3 ICE:多层候选中择优
ICE将通信双方的可用地址统一为三种候选类型,按优先级排序后通过信令通道交换,再进行双向连通性检查,选择第一对成功通信的候选地址作为实际通信路径。
主机候选地址 取自本地网卡上的IP地址(包括内网私有地址和本机公网地址)。服务器反射候选地址 通过STUN从NAT获得的公网映射地址。中继候选地址通过TURN分配的中继转发地址。
ICE的连通性检查流程是一种配对探测。每个端点生成候选地址对列表,按优先级排序后,使用STUN消息逐对发送连通性检查。端点A向端点B的候选地址发送包含用户名和密码的STUN请求(认证信息通过信令通道预先交换)。若端点B收到请求检测通过,回复STUN成功响应,暗示该对候选地址可达。第一个成功收发STUN请求响应的候选对被选为激活通道,后续检查停止,媒体数据流在该通道上传输。
如果直接候选对全部失败(一方或双方为Symmetric NAT导致映射不匹配),ICE回退到TURN中继候选对。TURN中继必然成功------双方各自连接自己的TURN服务器分配中继地址,这两个地址在公网上直接可达。
4. 工程实践的广泛约束
4.1 运营商级NAT的双层嵌套
移动网络和某些住宅宽带网络部署了运营商级NAT(CGN),使数据包经过两层NAT------客户端的私有地址先映射为运营商级私有地址(100.64.0.0/10网段),再由运营商NAT网关映射为公网地址。双层NAT使NAT保活和映射超时行为更加复杂,STUN获知的映射地址是运营商NAT的外部公网地址,但该映射在运营商NAT内部超时可能早于客户端侧NAT映射,导致失配。
4.2 保活与超时
UDP在NAT中是无连接的,NAT设备依靠超时机制清理无活动的映射。不同NAT设备的UDP超时间距差异大------从几十秒到数分钟不等。P2P应用需周期性发送保活包维持NAT映射,典型间隔为15-30秒。若保活频率过低,NAT映射超时被回收,通信中断;频率过高则浪费设备和带宽。
5. 结语
NAT穿透问题的解决依赖对NAT行为的精确分类与多层回退策略的组合部署。锥形NAT通过STUN反射地址实现直接P2P穿透,Symmetric NAT迫使通信回退到TURN中继。ICE框架将这些策略统一为候选地址优先级排序和配对连通性检查的完整协商流程,在可用性与带宽成本之间以优先顺序逐层尝试。对于P2P应用开发者,理解NAT映射行为与STUN/TURN/ICE的协作关系,是实现其稳健部署的前提。
参考文献
1\] Rosenberg, J., et al. RFC 5389: Session Traversal Utilities for NAT (STUN). IETF, 2008. \[2\] Mahy, R., Matthews, P., \& Rosenberg, J. RFC 5766: Traversal Using Relays around NAT (TURN). IETF, 2010. \[3\] Rosenberg, J. RFC 8445: Interactive Connectivity Establishment (ICE). IETF, 2018. \[4\] Srisuresh, P., \& Holdrege, M. RFC 2663: IP Network Address Translator (NAT) Terminology and Considerations. IETF, 1999.