p2p打孔有什么困难?

时间:2014-04-19 23:36:16

标签: networking p2p hole-punching

我正在尝试一些p2p网络。在做了一些研究之后,我学到的最大障碍之一就是“如果客户端在NAT /防火墙后面会怎么样”,后来我发现了关于打孔的问题,但并不总能保证能够正常工作。

据我所知,我不明白它为什么会失败,这是我目前所知道的:

<小时/> enter image description here
基于上图,这就是我如何理解如何建立成功的连接。

  1. Alice 通过创建与目录服务器的连接来加入网络(1)。发生这种情况时, Alice的 NAT会创建从公共IP到本地ip的映射。
  2. 目录服务器接收连接并将 Alice的公共ip:port存储在目录
  3. Bob 执行相同的(2),加入网络并在目录中发布他的ip:port
  4. Alice 想要与 bob 进行通信。所以她从目录中查找 Bob的 ip:port。的(3)
  5. Alice 会发送她从服务器获取的 Bob ip:port的数据。的(5)
  6. 由于 Bob 还有从ip:port到其本地ip:port的映射,因此NAT只会转发在 Bob public {上收到的所有数据{1}}到他的电脑。
  7. Alice 同样适用
    我希望我能清楚地解释我的理解。我的问题是,这有什么困难或不可靠的?我必须清楚地遗漏一些东西。你能解释一下它是什么吗?

4 个答案:

答案 0 :(得分:7)

一个问题是,Alice的NAT服务器中的NAT映射会在固定时间之后或一段时间不活动后超时。

第二个潜在的问题是NAT服务器可以限制Alice的NAT映射仅对Alice建立的TCP连接“好”,或者Alice与初始IP“她”连接的连接。 (换句话说,Alice和Bob之间的直接通信可能会被阻止。)

等等。

问题是NAT服务器的行为高度依赖于管理组织的配置/策略决策。其中许多决策可能意味着您的特定P2P使用模式无法可靠地运行......或者根本无法运行。


  

那么我对打孔的整个想法是错误的吗?

没有。这只意味着它不会一直有效。

答案 1 :(得分:3)

防火墙通常是有状态的。 Bob(2)与外部目录服务器建立通信在其NAT服务器中建立规则,允许Bob和目录服务器进行通信。当NAT服务器看到来自Alice的数据包时,它拒绝/丢弃它们,因为它没有看到Bob与Alice建立通信。

答案 2 :(得分:1)

NAT挖洞中最大的问题可能是缺乏端口一致性。为了使您的实现起作用,两个NAT中至少有一个必须支持它。

端口一致性是指将(local ip, local port)映射到同一(external ip, external port)而不管(destination ip, destination port)的位置。如果没有这个,目录服务器看到的端口对clies是没有帮助的,因为它不会是客户端需要相互通信的相同端口。

(请注意,这是一个比 port preservation 更弱的要求,其中external port == local port。)

不幸的是,对于P2P通信,大多数NAT都是Symmetric NAT的某种风格,并且具有一致的端口映射。

答案 3 :(得分:0)

首先,有两种类型的打孔 1.UDP打孔 2.TCP打孔

UDP打孔成功率为82% TCP打孔成功率为64% 我做了很多UDP打孔实验,它们大部分都是成功的,但在TCP打孔的情况下并不相同。

TCP打孔失败的原因只是路由器NAT表。我会尽力解释一下:

客户1 - &gt; connect(client2)--Internet--connect(client1)&lt; - Client 2

现在,如果 Client1 ** SYN Packet ****到达client2并且** client2 ** SYN数据包未发布**,则client2的ROUTER可以做两件事: 1.当连接拒绝client1时,返回RST数据包。 2.立即丢弃数据包,没有回复发送给client1。

如果发生这种情况,将不会建立连接。

我只能建议一个解决方案,来自客户端的连接呼叫之间的时差应该非常小。连接呼叫差异应以毫秒为单位

提示:如果您在本地网络中,请禁用防火墙

对于ubuntu用户: sudo ufw disable