23

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

据我了解,我不明白为什么它可能会失败,这是我迄今为止所知道的:


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

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

4 回答 4

15

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

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

等等。

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


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

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

于 2014-04-20T00:07:29.370 回答
4

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

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

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

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

于 2016-05-27T05:17:44.473 回答
3

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

于 2014-04-19T23:44:45.890 回答
2

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

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

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

客户端 1--> 连接(客户端 2)--互联网-- 连接(客户端 1)<-- 客户端 2

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

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

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

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

对于 ubuntu 用户:sudo ufw disable

于 2017-08-25T07:23:24.963 回答