一种能比较准确地猜测NAT的影射端口的方法

来源:互联网 发布:汉中阿里云代理 编辑:程序博客网 时间:2024/04/29 18:13
版权声明:本文由SkyMountain发表,引用地址为http://blog.csdn.net/skymountain/。作者保留一切版权,转载务必注明出处,否则视作侵权。

昨晚忽然想到一种方法能比较准确地猜测NAT的影射端口。我指的是那种目标端口敏感的NAT,这种NAT以前是很难穿透的。

这种方法使用了三个新socket(也即新的本地端口)来探测。新建三个socket,每个socket与以前没用过的端口绑定。然后按时间顺序,第一个socket给stun服务器发送数据包,第二个socket给目标服务器发送数据包,也即执行打孔动作,第三个socket再次给stun服务器发送数据。三个动作均会在服务器上新开一个影射端口。三个动作时间间隔很短,大约100ms即可。这样,我们有理由相信,第二个socket所分配的映射端口很可能在第一个影射端口和第二个影射端口之间。也即port2>port1同时 port2<port3。可能性最大的是:
port2 = (port1+port3)/2

如果服务器发现port3<port1,或者port1与port3之间差距过大,那么很可能是NAT上的端口号已经开始重新分配,那么应当让客户端重复一下这个流程。重复多几次,猜测成功的几率会大很多。

一个例外情况是所谓端口保持NAT,也即NAT分配新端口时,尽量使新端口号与内网端口号保持一致。但这种情况很容易识别,服务器简单比较客户端的内网端口和映射端口即可。如果发现是这类NAT,那么上面的公式就要修改了:
port2 = 第二个socket的内网端口号

当然,端口猜测方法无论如何也是猜测而已,内网之间的用户仍然不可能有100%的连结率。但是猜测端口的方法可以提高跨NAT连接率,从而降低数据中转服务器的负担。