[英]What's so hard about p2p Hole Punching?
我正在尝试使用一些 p2p.networking 进行试验。 在做一些研究后,我了解到的最大障碍之一是“如果客户端在 NAT/防火墙后面怎么办” ,后来我发现了打孔,但它并不总是能保证工作。
据我所知,我不明白为什么它会失败,这是我目前所知道的:
ip:port
存放在目录中ip:port
ip:port
。 (3)ip:port
上发送数据。 (5)ip:port
到他的本地ip:port
的映射,NAT 只是将在Bob 的公共ip:port
上收到的任何数据转发到他的计算机。一个问题是 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 分配。 冲孔过程简述:
NAT 可以是任何类型。 如果 NAT 是对称 NAT RFC 8489,则无法进行打孔。 因为只有从内部主机接收到数据包的外部主机才能发回数据包。 如果是这种情况,那么唯一可能的方法就是Relaying 。
了解更多关于当前 state 的 P2P 通信:阅读 RFC 5128。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.