3、NAT技术原理:什么是NAT、NAT的四种类型、NAT的工作原理
聊WebRTC,绕不开NAT。说句实话,我早年刚接触P2P通信时,觉得NAT就是个“捣乱的”——它把本来可以直接握手的两个终端硬生生隔开了。但后来做项目多了,我慢慢意识到:没有NAT,IPv4早就撑不住了。所以这一章,咱们把NAT彻底讲透。
3.1 什么是NAT?
NAT,全称Network Address Translation,网络地址转换。说白了,就是把你家里的私有IP(比如192.168.1.x)映射成公网IP的一个过程。
你想想看,全球几十亿设备,IPv4地址只有43亿个,根本不够分。于是NAT就充当了“门卫”的角色:内部设备用私有IP通信,出门时统一换成公网IP。这样,一个公网IP就能养活一整个局域网。
我在做第一个WebRTC项目时,就踩过这个坑。当时两台设备都在NAT后面,我以为直接传IP就能连上,结果死活不通。后来才明白:NAT把内部IP藏起来了,你拿到的只是“门卫”的地址。
3.2 NAT的四种类型
NAT不是铁板一块。根据映射行为和过滤行为,业界把它分成四种类型。这四种类型,直接决定了WebRTC能不能打通。
我个人习惯用一张图来理解这四种类型的关系:
3.3 四种类型详解
3.3.1 完全锥形NAT (Full Cone NAT)
这是最“开放”的一种NAT。内部设备A(192.168.1.10:5000)映射到公网IP(1.2.3.4:8000)后,任何外部主机只要知道这个公网地址,就能主动给A发数据。
换句话说,NAT只做映射,不做过滤。谁都能通过这个“门”进来。
3.3.2 受限锥形NAT (Restricted Cone NAT)
这个比完全锥形严格了一步。外部主机B想给A发数据,光知道A的公网地址还不够——A必须先给B发过数据才行。
我打个比方:完全锥形是“门一直开着”,受限锥形是“你敲过门,我才让你进”。
具体规则:
- A映射到公网地址后,外部主机B可以给A发数据
- 前提条件: A之前向B的IP地址发送过数据包
- 不限制端口——只要IP对了,端口随意
3.3.3 端口受限锥形NAT (Port Restricted Cone NAT)
这个更严格了。不仅要求A先给B的IP发过数据,还要求A给B的特定端口发过数据。
举个例子:A给B的IP 10.0.0.1:8080发过包,那么B只能用10.0.0.1:8080这个端口给A回数据。换一个端口,NAT直接丢弃。
3.3.4 对称NAT (Symmetric NAT)
这是最难穿透的NAT,也是WebRTC的“头号敌人”。
对称NAT的特点是:每次连接都分配不同的公网端口。A向B发数据,映射成1.2.3.4:8000;A向C发数据,映射成1.2.3.4:8001。端口变了。
为什么会这样?因为对称NAT把“目的IP+端口”也作为映射的输入参数。源IP+源端口+目的IP+目的端口,四元组决定了映射结果。
我曾经在一个客户现场遇到对称NAT,折腾了两天。最后发现是某运营商的企业光猫默认开启了“严格NAT模式”。关掉之后,WebRTC就通了。
| NAT类型 | 映射规则 | 过滤规则 | 穿透难度 | 常见场景 |
|---|---|---|---|---|
| 完全锥形 | 固定映射 | 无过滤 | ★☆☆☆☆ | 少见 |
| 受限锥形 | 固定映射 | 限制IP | ★★☆☆☆ | 部分企业网 |
| 端口受限锥形 | 固定映射 | 限制IP+端口 | ★★★☆☆ | 家庭路由器 |
| 对称NAT | 动态映射 | 限制IP+端口 | ★★★★★ | 运营商/企业 |
3.4 NAT的工作原理
NAT的核心工作流程,我总结成三步:
- 映射建立: 内部设备发出第一个数据包时,NAT设备在映射表中创建一条记录。记录内容包括:内部IP:端口 → 公网IP:端口。
- 数据转发: 后续数据包到达NAT时,设备查找映射表。如果找到匹配项,就做地址转换并转发;如果没找到,直接丢弃。
- 映射老化: 映射表条目有生命周期(通常30秒到5分钟)。如果一段时间没有数据流量,条目会被删除。
嗯,这里要注意一个细节:NAT映射的建立,必须由内部设备主动发起。外部设备想“敲门”,除非NAT配置了端口转发(Port Forwarding),否则数据包会被丢弃。
3.5 NAT与WebRTC的关系
WebRTC要做P2P连接,就必须穿越NAT。ICE(Interactive Connectivity Establishment)协议就是干这个的。
ICE的工作流程大致是:
- 收集所有可能的候选地址(本地IP、NAT映射后的公网IP、TURN服务器中继地址)
- 两端交换候选地址列表
- 尝试建立连接,从最优的候选开始
- 如果直连失败,回退到TURN中继
说白了,ICE就是在“碰运气”——先试试最快的直连,不行就换中继。而NAT的类型,直接决定了“直连”这条路能不能走通。
我个人习惯在开发阶段用chrome://webrtc-internals查看ICE候选类型。如果看到srflx(STUN反射地址)能成功连接,说明NAT类型比较友好;如果只有relay(TURN中继)才能连,那基本可以断定是对称NAT。
好了,这一章的内容就到这里。NAT是WebRTC穿透的基础,理解了这四种类型,后面讲ICE、STUN、TURN时你就能更快上手。
公众号:蓝海资料掘金营,微信deep3321