近一周时间都在玩p2p,本来以为实现很简单,但做起来实属不易 。
Udp穿透Nat会遇到多种Nat类型:
1.FULL CORE
2. RESTRICT
3. PORT-RESTRICT
4. SYMMETRIC
1-3三种NAT实现穿透很简单,问题在于处理第4种类型:对等NAT
SYMMETRIC NAT的工作模式区分在于内网通过NAT时分配的外部端口的方式不同,这又有三种情况:
1. 端口递增: 通常新端口号会是前一次分配端口号加1或者加固定值
2. 端口在当前NAT最新端口的左右区间: 例如当前NAT外网端口P,那新的分配端口会落在 -N < P < N
3. 随机分配SR (这个根据当时NAT的网络情况参数等作为函数f(x)的因子决定)
这第三种分配方式,目前无解,只要任意一端存在SR,则无法穿透
当然很多技术研究者提出了如何猜测动态端口的方案,例如:统计技术的使用,服务器可对固定NAT进行采样分析等等。。
这个很难哦!
面对SR我直接放弃了,还真不巧,测试了3,4个网络环境的NAT,居然50%是SR,50%是SYMMETRIC的1,2种类型 。
还是老实的服务器中转把!
一些p2p资料供参考:
http://114.215.178.29/static/p2p