TCP 实现 P2P 通信、TCP 穿越 NAT 的方法、TCP 打洞(附源代码)
◆◆◆ 作者 ◆◆◆
谢红伟 · chrys · chrys@163.com · http://www.howa.com.cn
◆◆◆ 日期 ◆◆◆
2007-07-24 01:34:57
这个标题用了两个顿号三个名称,其实说得是同一个东西,只是网上有不同的说法罢了,
另外好像还有人叫 TCP 打孔(我的朋友小妞听说后问“要打孔啊,要不要我帮你去借个电
钻过来啊?”“~!·¥%……·!”)。
闲话少说,我们先看一下技术背景:
Internet 的迅速发展以及 IPv4 地址数量的限制使得网络地址翻译(NAT,Network Address
Trans2lation)设备得到广泛应用。NAT 设备允许处于同一 NAT 后的多台主机共享一个公网
(本文将处于同一 NAT 后的网络称为私网,处于 NAT 前的网络称为公网) IP 地址。一个私网
IP 地址通过 NAT 设备与公网的其他主机通信。公网和私网 IP 地址域,如下图所示:
一般来说都是由私网内主机(例如上图中“电脑 A-01”)主动发起连接,数据包经过 NAT
地址转换后送给公网上的服务器(例如上图中的“Server”),连接建立以后可双向传送数据,
NAT 设备允许私网内主机主动向公网内主机发送数据,但却禁止反方向的主动传递,但在一
些特殊的场合需要不同私网内的主机进行互联(例如 P2P 软件、网络会议、视频传输等),
TCP 穿越 NAT 的问题必须解决。网上关于 UDP 穿越 NAT 的文章很多,而且还有配套源代
码,但是我个人认为 UDP 数据虽然速度快,但是没有保障,而且 NAT 为 UDP 准备的临时
INTERNET
202.103.142.29
NAT-A
192.168.0.1
电脑 A-01
192.168.0.2
电脑 A-02
192.168.0.3
电脑 A-01
192.168.1.12
电脑 A-02
192.168.1.13
Server ( Web、FTP、POP3、SMTP、
IIS、Database … )
129.208.12.38
221.10.145.84
NAT-B
192.168.1.1
广域网与私网示意图