通过NAT连接P2P?

use*_*988 35 networking p2p bittorrent network-protocols nat

我开始探索使用p2p连接与其他连接的选项,所以我在JAVA中为Android设备编写了一个简单的套接字程序,其中用户可以共享简单的消息p2p(我当时对NAT没有任何想法).我了解了NAT,所以我现在需要与另一个用户建立TCP连接,该用户使用服务器进行发现,但有效载荷是p2p传输的.我也看了一下XMPP(协议如何工作的一个很好的和详细的说明是这里)和UPnP,但我不知道如何实现它们.

另一个有趣的问题是BitTorrent,因为它们可以在任何设备上工作,甚至可以在NAT后面工作.我无法解释BitTorrent的工作原理.

我研究了很多,但我被卡住了.

我的问题是:

  1. BitTorrent的详细解释(就像这里,不是种子如何工作)以及如何解决NAT问题?
  2. 有没有办法以编程方式进行NA​​T输入?
  3. 套接字编程是否足以支持p2p?
  4. 创建自己的协议有多难,我该如何建立?
  5. 如果两个设备D1和D2想要通信p2p并且他们知道彼此的IP.D1向D2发送请求并且无法通过D2的NAT,但是应该在D1的NAT中创建一个条目.所以当D2尝试发送一些东西时,D1的NAT应该会发现一个带有D2的IP的条目.那么为什么数据包不被它允许呢?

the*_*472 20

另一个有趣的问题是BitTorrent,因为它们可以在任何设备上工作,甚至可以在NAT后面工作.我无法解释BitTorrent的工作原理.

这个陈述看起来像你认为bittorrent需要完全连接才能运行.

那是不对的.

在NAT设备后面,您仍然可以建立传出的 TCP连接.只要网络中有其他非NAT(或NAT但正确端口转发)的客户端可以接受传入的连接,这对于bittorrent来说通常就足够了.

NAT对数据的流向没有影响,因为一旦建立连接就是双向的.它只对初始连接设置有问题.

这对于bittorrent来说非常好,因为bittorent并不关心从哪个特定节点获取数据.虽然更好的连接通常可以提高性能.

如果节点的身份很重要或一对一传输是一个重要的用例,那么其他p2p协议通常首先尝试NAT遍历,如果失败则依赖于第三方节点在那些无法直接相互连接的节点之间中继流量.

此外,IPv6支持将成为维持端到端连接的必要条件,因为越来越多的ISP开始为IPv4 推出运营级NAT,而IPv6将保持非NAT


Tah*_*lil 9

有一点需要明确的是,现在所有类型的NAT之间100%的P2P是不可能的.在**对称和对称/ PRC NAT之间建立P2P连接没有实用的方法.在此方案中,通过名为TURN的中继服务器建立连接.

我正在回答你的第二个问题,因为我对第一个问题知之甚少.

2)是的.您可以通过NAT发送数据包,并且内部IP:端口与NAT的外部IP:端口之间将存在映射.您可以通过发送眩晕请求来了解这些外部IP:端口.请注意,此技术不适用于对称NAT.

3)是套接字编程足以满足p2p.

4)为什么在已存在多个协议时需要协议.ICE协议是NAT遍历的最佳选择,我不认为它很容易创建.UPnP和NAT-PMP在安全性方面确实很脆弱.

5)我认为发生的事情通常是NAT阻止来自它的未知数据包.因此,当D1向D2发送数据包时,其NAT会阻止从D1s IP:Port传入的所有数据包.这就是连接建立失败的原因.您必须为D1和D2采用打孔技术才能成功建立P2P连接.

**通过对称NAT,我指的是具有随机端口分配的对称NAT.


Far*_* K. 7

有一篇关于" 跨网络地址转换器的点对点通信 "的论文描述了UDP打孔方法,并将其扩展为通过TCP使用.

当然,对于不支持打孔的情况,您总是需要一个中继服务器.


jch*_*jch 5

  1. BitTorrent的最新版本使用µTP,它位于UDP之上,而不是TCP之上。µTorrent使用ut_holepunch执行UDP穿孔的专用扩展(),大多数其他实现都不会打扰(Tixati值得注意的例外)。

  2. 某些NAT路由器使用uPNPPMP协议接受端口转发请求。是否支持此功能取决于路由器的特定品牌及其配置。

  3. 是的,套接字编程足以用于P2P。

  4. 很难回答。我建议您先阅读带有注释的BitTorrent规范

  5. 是的,这是UDP穿孔的原理。

  • @ user3439988,如果我今天正在编写一个P2P应用程序,我会使其成为纯IPv6,并使其陷入困境。 (2认同)