总结P2P程序中UDP穿透难点

发布: 2014-05-21 14:33

最难的一种NAT,这是从对称型NAT演变过来折和中NAT,叫做动态类型NAT。

使用traceroute/tcptraceroute确定动态NAT网络到目标主机的出口IP,为对方的NAT打洞提供目标IP信息。

有一种动态类型的NAT,这种NAT的网络出口IP是一个出口IP池中选出来的。

选择的方式可能是随机,也有可能按照目标IP做hash,从而固定选择。

即使是随机的,在一段时间内,很有可能也会使用相同的NAT出口IP,

从实现结果可以看到,这可能是为了保证NAT能够正常工作。

但是,有些NAT却不支持traceroute,一个中间路由都trace不到的情况,

这就非常难办了。

对于普通的对称型NAT,穿透方式已经有前人研究,而且成功率很高,

比较好的方式有multi hole punching方式,通过猜测下一个可能使用的NAT端口实现。

猜测端口,现在的NAT端口选择大概有两种常见方式,一种是累加模式,

每次使用的NAT端口在之前的端口基础上加n(n>=1,并且一般来说n<=9)。

另一种方式是完全随机选择未使用的端口,这种不太好猜测,

当然,如果用的是非动态NAT,只使用一个固定IP的情况下,可以考虑把可用端口全部占用,

那么剩下的端口还好猜测一些。

multi hole punching论文:。

猜测端口的另一篇文章:。


相比来说,其他几种NAT方式,则非常容易了,也有许多资料和实现代码供参考。

以上说的都是UDP协议穿透,TCP协议穿透也类似,但在实现上更复杂,如需了解查询资料。

当然,在无法实现P2P穿透的情况下,也就是使用中继这种方式了。


原文: http://qtchina.tk/?q=node/810

Powered by zexport