一次失败的NAT穿透尝试记录
mob 发布于 2022-01-05

NAT穿透或者说打洞,是很多P2P软件的基础,提示,因为TCP同个端口可以使用端口复用,所以不管是TCP还是UDP,流程基本是一样的,所以目前网上看到大部分的解决方案总结起来都是下面这样的方法:

一台有公网IP的服务器Server,两台没有公网IP的客户端ClientA和ClientB,

1、ClientA向Server发送数据包(TCP则是连接),Server记录ClientA的IP和端口,这里的IP和端口是ClientA的网络NAT设备转换后的IP和Port,而不是ClientA所在内网的IP和端口,记录为ClientA-NAT-IP:Port,

2、ClientB向Server发送数据包,Server记录客户端的IP和端口,这里的端口是ClientB的网络NAT设备转换后的IP和Port,记录为ClientB-NAT-IP:Port,

3、Server将ClientA-NAT-IP:Port发给ClientB,将ClientB-NAT-IP:Port发给ClientA,

4、ClientA向ClientB-NAT-IP:Port发送数据,ClientB向ClientA-NAT-IP:Port发送数据,可以重复多次

实际上无论TCP还是UDP都测试过,就是无法穿透,一开始也比较纳闷,在github上找了一个程序检测NAT类型,显示是Port-Restricted Cone NAT,然后检测服务器的也是Port-Restricted Cone NAT

后来参考资料说对称型的NAT无法用这种方法穿透,要使用TURN协议,看了TURN协议后发现其实还是需要服务器中转数据,因为本来就不想占用服务器带宽啊。

不知道是否是这个检测NAT类型的程序不准确,找了一个可以检测NAT类型的网站(https://clients.dh2i.com/NatTest/)检测下,发现我的客户端是对称型的,服务器的是Permissive NAT,这个网上的资料很少提到,不知道具体属于哪种。

mob
关注 私信
文章
61
关注
0
粉丝
0