繁体   English   中英

p2p 打孔有什么难的?

[英]What's so hard about p2p Hole Punching?

我正在尝试使用一些 p2p.networking 进行试验。 在做一些研究后,我了解到的最大障碍之一是“如果客户端在 NAT/防火墙后面怎么办” ,后来我发现了打孔,但它并不总是能保证工作。

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


在此处输入图像描述
根据上图,这就是我理解如何建立成功连接的方式。

  1. Alice通过创建到目录服务器的连接来加入 .network (1) 发生这种情况时, Alice 的NAT 会创建一个从她的公共 ip 到她的本地 ip 的映射。
  2. 目录服务器收到连接,将Alice的公共ip:port存放在目录中
  3. Bob同样做(2) ,加入.network并在目录中发布他的ip:port
  4. Alice想与bob通信。 所以她从目录中查找Bob 的ip:port (3)
  5. 爱丽丝在她从服务器获得的鲍勃的ip:port上发送数据。 (5)
  6. 由于Bob也有一个从ip:port到他的本地ip:port的映射,NAT 只是将在Bob 的公共ip:port上收到的任何数据转发到他的计算机。
  7. 同样适用于爱丽丝
    我希望我对我的理解的解释很清楚。 我的问题是,这有什么难或不可靠的? 我一定很明显遗漏了什么。 你能解释一下它是什么吗?

一个问题是 Alice 的 NAT 服务器中的 NAT 映射将超时,无论是在固定时间后,还是在一段时间不活动后。

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

等等。

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


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

不,这只是意味着它不会总是有效。

NAT 打孔的最大问题可能是缺乏端口一致性 要使您的实现工作,两个 NAT 中的至少一个必须支持它。

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

(请注意,这是比端口保留更弱的要求,其中external port == local port 。)

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

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

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

UDP 打孔成功率为 82% TCP 打孔成功率为 64% 我做过很多 UDP 打孔实验,大部分都是成功的,但在 TCP 打孔的情况下不一样。

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

客户端 1 --> 连接(客户端 2)--Internet-- 连接(客户端 1)<-- 客户端 2

现在,如果Client1 **SYN Packet**** 到达 client2 并且 **client2 **SYN packet was not Released** ,client2 的 ROUTER 可以做两件事: 1. 发送 RST 数据包作为连接被拒绝给 client1 . 2. 立即丢弃数据包并且没有回复发送到 client1。

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

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

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

对于 ubuntu 用户: sudo ufw disable

我认为了解Hole Punching的真正工作原理将有助于了解它可能失败的原因。

它首先由 Dan Kagel 探索,请阅读此处 在这种技术中,通常假设两个对等点都位于两个不同的 NAT 之后。 两个点都必须连接到称为 Rendezvous/Signaling 服务器的中间服务器; 有许多著名的 Rendezvous 协议,SIP (RFC 3261) 是最著名的一个。 当他们连接到服务器时,他们通过服务器了解彼此的公共交通地址。 公共交通地址由前面的 NAT 分配。 冲孔过程简述:

在此处输入图像描述

  1. Peer 1 和 Peer 2 首先使用 STUN 绑定请求发现它们的公共传输地址,如 RFC 8589 中所述。
  2. 他们使用信令/消息传递机制交换公共交通地址。 SDP(Session Description Protocol)[16]可以用来完成这个。 Peer 1 和 Peer 2 的公共传输地址将分别由 NAT 1 和 NAT 2 分配。
  3. 然后,两个对等点都尝试使用接收到的公共传输地址相互连接。 对于大多数 NAT,第一条消息将被 NAT 丢弃,但 Full Cone NAT 除外。 但随后的数据包将成功 p.netrate NAT,因为此时 NAT 将具有映射。

NAT 可以是任何类型。 如果 NAT 是对称 NAT RFC 8489,则无法进行打孔。 因为只有从内部主机接收到数据包的外部主机才能发回数据包。 如果是这种情况,那么唯一可能的方法就是Relaying

了解更多关于当前 state 的 P2P 通信:阅读 RFC 5128。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM