0

我创建了一个完全去中心化的 P2P 应用程序,并使用 Kademlia 算法来实现它。这已经在本地网络上进行了测试,并且完全成功。

我听说过 UDP 打孔,但是打孔需要对等方了解客户端 IP,反之亦然,但是由于设计原因,这是不可能的。因为这将要求每个对等方继续向超级节点\服务器询问新的到达并保持分配它们,所以自然它不太可靠,尤其是在超级节点关闭的情况下。

由于算法的设计 1 个对等点不知道其他对等点的 IP 地址,所以我需要 1 个对等点完全打开一个端口,以便 PUBLIC 能够连接,在 Windows 中我该怎么做?有人可能还会给我合适的链接,可能会给我一个方向吗?

如果他们使用 c++\c 作为示例,那将是可取的(但不是绝对的)

4

3 回答 3

0

由于算法的设计,1 个对等点不知道其他对等点的 IP 地址,所以我需要 1 个对等点完全打开一个端口,以便 PUBLIC 能够连接到

首先,这仅适用于全锥 NAT。对于其他类型的 NAT,您打开的公共 IP:Port 仅适用于特定目标。在您的情况下,您不知道目的地,所以这是不可能的。

在全锥 NAT 的情况下,您将数据包发送到具有低 TTL 值的随机地址,以便数据包在中间丢弃并且不会到达该地址。如果它到达该地址的 NAT 可能会阻止您。如果您这样做,那么将打开一个端口供任何人向您发送数据包。您需要在一段时间后继续发送数据包,以使该端口保持打开状态。这里有一个问题,你不能选择在 NAT 中打开哪个端口。NAT 会自行为您分配一个空闲端口。

最后,如果对等方无法相互交换 IP 信息,我认为上述任何操作都没有任何意义。您应该使用 SIP 或 XMPP 等信令协议在对等方之间交换 IP 信息。

要了解有关 NAT 的更多信息,请阅读此答案。

于 2015-07-23T04:14:35.370 回答
0

我认为你将不得不稍微改变你的架构。除非您将 NAT 配置为端口转发(我认为您不希望这样),否则 NAT 遍历没有其他方法。您可能需要实现三层:

  • 底层 1:它知道 IP 地址和端口,可以解决诸如打孔或处理服务器之类的问题(可能会关闭,但首先您别无选择,其次您可以添加连接替代方案)。
  • 第 2 层:为您的解决方案实施特殊的命名、寻址和定位服务(而不是使用 IP 地址)。
  • 上层 3:使用下层命名和位置服务实现您的 p2p 解决方案。
于 2015-07-22T22:24:54.753 回答
0

首先,您需要检查您的设计。如果它需要所有节点之间的 100% 连接(没有中继),它可能会在 IPv4 下失败,因为并非所有 NAT 都是可遍历的。由于有状态防火墙,可能在 IPv6 下。

现在,对于 nat 遍历:DHT 辅助 NAT 遍历的一种解决方案是让 NATed 节点拥有一个集合节点。

为了保持 UDP NAT 映射打开,它必须定期 ping 该集合节点。

此外,它必须在 DHT 上宣布会合点的地址,例如在其可到达的邻居节点下hash("rendezvous" + node ID)或仅在其可到达的邻居节点上。

然后集合节点可以充当打孔的协调点。

这不需要任何特殊的“超级节点”,只需要网络中未经过 NAT 且可以提供帮助的其他(可能是多个,从而消除 SPOF)节点。

其他机制,例如 UPnP IGP、NAT-PMP、PCP以及最终指示用户转发所需端口也有助于减少对 nat 遍历的需求。

于 2015-07-22T22:28:26.323 回答