我正在尝试一些p2p网络。 经过研究后,我了解到的最大障碍之一是“如果客户端位于NAT /防火墙后面怎么办” ,后来我发现了打孔技术,但并不一定保证它能正常工作。

据我所知,我不理解为什么它可能会失败,这是我到目前为止所知道的:


在此处输入图片说明
根据上图,这就是我了解如何建立成功连接的方式。

  1. 爱丽丝通过创建与目录服务器的连接来加入网络(1) 发生这种情况时, Alice的 NAT将创建一个从其公共ip到其本地ip的映射。
  2. 目录服务器接收连接并将Alice的公共ip:port存储在目录中
  3. 鲍勃 (2)做同样的事情,加入网络并在目录中发布他的ip:port
  4. 爱丽丝想和鲍勃交流。 因此,她从目录中查找Bob的 ip:port (3)
  5. 爱丽丝鲍勃的 ip:port上发送她从服务器获取的数据。 (5)
  6. 由于Bob还具有从is ip:port到其本地ip:port的映射,因此NAT仅将在Bob的公共ip:port上接收到所有数据转发到他的计算机。
  7. 爱丽丝的同作品
    我希望我对自己了解的解释很清楚。 我的问题是,对此有何困难或不可靠? 我肯定很想念一些东西。 你能解释一下这是什么吗?

===============>>#1 票数:10 已采纳

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

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

等等。

问题在于NAT服务器的行为高度依赖于管理组织的配置/策略决策的方式。 这些决定中的许多决定可能意味着您特定的P2P使用模式将无法可靠地工作……或根本无法工作。


那么,我关于打孔的整个想法是错误的吗?

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

===============>>#2 票数:3

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

===============>>#3 票数:3

可能是NAT穿孔的最大问题是缺乏端口一致性 为了使实施正常工作,两个NAT中至少有一个必须支持它。

端口一致性是将相同(local ip, local port)映射到相同(external ip, external port)而不考虑目标(destination ip, destination port) 否则,目录服务器所看到的端口将对客户端没有帮助,因为它与客户端之间需要彼此通信的端口不同。

(请注意,这比端口保留external port == local port )要弱。)

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

===============>>#4 票数:1

首先有2种打孔1.UDP打孔2.TCP打孔

UDP穿孔成功率达82%TCP穿孔成功率达64%我做了很多UDP穿孔实验,它们大多都成功了,但在TCP穿孔方面却不尽相同。

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

客户端1-> connect(client2)--Internet-- connect(client1)<-客户端2

现在,如果Client1 ** SYN数据包****到达client2且** client2 ** SYN数据包未释放**,则client2的ROUTER可以执行以下两项操作:1.将RST数据包发送回,因为连接被拒绝到client1 。 2.立即丢弃数据包,并且没有答复发送到client1。

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

我只能提出一种解决方案,即从两个客户端进行的连接调用之间的时间差应该很小。 连接呼叫差异应以毫秒为单位

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

对于ubuntu用户: sudo ufw disable

  ask by Krimson translate from so

未解决问题?本站智能推荐: