首先要知道内网地址是不能直接和外网通信的。这里就牵涉到了一个 NAT 协议。现在用的最多的是 NAT 的一种 NAPTNetwork Address/Port Translator 的技术。 简单来说 NAPT 就是:当你与外网建立连接时,本地 IP 为 192.168.0.11:4000,要与外网 202.160.4.40:3300 建立连接。NAT 做的工作就是把本地地址映射成为外网地址(想连上 internet 都得至少有个外网 IP)如外网 IP 为 202.202.202.202,那么 NAT 就把它映射为 202.202.202.202:5000(端口号随机的)。那么连接就变为 202.202.202.202:5000 到 202.160.4.40:3300。那么如果 Server 发送来的包就又被 NAT 逆向转换为内网 IP。就可以通信了。 当然其他 IP 如果向 202.202.202.202:5000 发送信息是会被丢弃的,如何连接呢? 这就是内网与内网通信 这里需要一个 Server,两方都登陆,Server 记录下 a,b 双方的 IP。a,b 双方都能和 Server 通信,那么 a,b 怎么通信呢,这就需要神奇的打洞技术。a 欲发信息与 b,a 把此事告知中间人 S,S 转告 b,由于匿名的 IP 会被 b 丢弃,所以,要把 a 的地址变为不是匿名。所以 b 向 a 的地址发送信息(此为打洞),显然连不上,但是网关却记录下了 a 的地址,此时 a 再发信息到 b 就搞定了。反过来就能发信息给 a,因此连接建立!a—>b? a->s s->b b->a? a->b ok!