基于UDP穿越非对称NAT建立P2P网络的Windows实现(UDP打洞)
AB设备在连接的时候访问一次服务器,服务器协助他们获取对方端口。 辅助完成后服务器断线,剩下的通讯由两个设备进行。
并不是所有网络环境都可以打洞,完全圆锥形NAT(Full Cone NAT)可以实现全程P2P连接,其中一方为对称锥形NAT(symmetric NAT)不能通过此方法直接打洞,但是可以尝试通过猜测上下文端口来进行连接。若双方设备都在对称锥形NATT(symmetric NAT)之后,则无法打洞。
若在交换机处部署了防火墙或系统内开启了域防火墙等过滤端口的情况,有可能穿越失败。建议关闭~
需要防止NAT设备所分配的临时端口被回收,可以通过维持一个心跳包来保证连接。
A设备连接S服务器,B设备连接S服务器。S服务器同时记录A、B临时端口和IP。然后S告诉A,B目前的临时端口,S告诉B,A目前的临时端口。此时A、B均拿到对方此时的临时IP和临时端口,就可以断开服务器连接,由他们自己之间完成剩下通信,然后服务器接着协调下一次的两台设备连接。但有点要注意的是这个临时端口长时间不使用会被NAT设备回收,所以A、B他们之间还需要通过心跳包维持通信状态。
感谢 吴米/阿毛/ian 提供的帮助