1. 为什么需要NAT穿透?
写过网络程序的人,多少都遇到过这个问题:两台电脑,一台在北京,一台在上海,想直接建立连接,互相发数据。听起来简单,但实际做起来,你会发现根本连不上。
为什么?因为这两台电脑大概率都在NAT后面。
什么意思?你在家里用WiFi上网,路由器给你分配的IP是192.168.1.100。这个地址只在你家局域网内有效,出了你家大门,这个地址就没人认识了。你的所有流量都要经过路由器"翻译"成公网IP才能出去,这个翻译过程就是NAT。
问题来了。你想让北京的朋友直接连你的电脑,他往192.168.1.100发包,包根本到不了你——因为全国有几百万个192.168.1.100,路由器不知道该把包送到谁那里。
这就是P2P面临的核心难题:两个NAT后面的设备,如何直接通信?
在游戏、视频通话、文件传输等场景中,如果所有数据都要经过服务器中转,带宽成本会很高,延迟也会增加。我们希望两个客户端能直接通信,这就需要NAT穿透技术。
根据Bryan Ford等人2005年的经典研究统计(见参考资料"P2P NAT Traversal"),大约82%的NAT设备支持UDP打洞,64%支持TCP打洞。虽然这个数据距今已近20年,现代网络环境(运营商级CGN普及、Symmetric NAT增多)下比例可能有所变化,但这仍是目前被广泛引用的参考数据。实际经验表明,只要方法得当,大多数情况下我们都能穿透NAT,实现点对点通信。
本文会系统讲解NAT穿透的原理和实现,包括:
- NAT的工作原理和四种类型
- UDP打洞和TCP打洞的原理
- STU