@
mrzx 详细地说,原理是这样的。
假设本机获得了运营商分配的局域网 IP (100.64.32.10):
当本地 100.64.32.10 向
www.qq.com (109.244.211.100) 发起 HTTP 请求时,NAT 会做转换。
1. 本地发起请求,来源端口为 100.64.32.10:3456 ,想建立 (100.64.32.10:3456 至 109.244.211.100:80) 的连接。
2. ISP NAT Server 察觉到本地想要请求,在公网 IP 空闲端口中挑一个,在映射表中新增 (100.64.32.10:3456 ~ 203.0.113.10:14500) 映射关系。
3. 100.64.32.10:3456 转发 203.0.113.10:14500 至 109.244.211.100:80 ,本机和
www.qq.com 成功建立连接。
4. 本机断开与
www.qq.com 的连接,NAT Server 释放端口,清除 (100.64.32.10:3456 ~ 203.0.113.10:14500) 映射关系
因此,在第 4 步之前,第 3 步的时候 (100.64.32.10:3456 ~ 203.0.113.10:14500) 已经成立了映射关系,NAT1 下,两者是等同关系。此时,端口被“临时地”暴露至公网。
当该端口还提供服务时,相当于开了一个“洞”,外部的连接就能“趁虚而入”。
一旦到达第 4 步,NAT Server 回收 14500 端口,就无法继续“趁虚而入”了。
然而,这是上帝视角看整个连接的过程。实际操作中,我们不知道出口的 IP 和端口号,
www.qq.com 也不会告诉我。
因此,我们需要问一个路人:“打扰一下,您看看我外面 IP 和端口号是多少”。这个路人就是 STUN 服务器。
STUN 服务器没那么多闲工夫,告诉你 IP 端口之后就立即关闭连接了。而
www.qq.com 比较客气,只要你提出我想要保持连接不关闭,它就不会关闭,外部端口也就不会被回收。
Natter 会每 10 秒说一次:“求求你别关连接”。
如果没有 STUN 服务器,但您知道自己的出口 IP ,就可以做全端口扫描,不过这就很费事了。