我创建了一个完全分散的P2P应用程序,并使用Kademlia算法来实现这一目标。这已经在本地网络上进行了测试,并且完全成功。
我听说过UDP打孔,但是打孔需要对手知道客户端IP,反之亦然,但正如设计所说,这是不可能的。因为它需要每个对等体继续向超级节点\服务器询问新到达并保持它们被分配,所以自然它不太可靠,特别是如果超级节点已关闭。
由于算法的设计1对等体不知道其他对等体的IP地址所以我需要1个对等体来完全打开一个端口,以便PUBLIC能够连接到,我该怎么做呢,在Windows中?也许有人也可能给我合适的链接,可能会给我一个方向?
如果他们使用c ++ \ c作为示例
,那将是更好的(但不是绝对的)答案 0 :(得分:0)
我认为你必须稍微改变你的架构。除非您将NAT配置为端口转发(我认为您不希望这样),否则没有其他方法可以进行NAT遍历。您可能需要实现三个层:
答案 1 :(得分:0)
首先,您需要检查您的设计。如果它需要所有节点之间100%连接(没有中继),它可能会在IPv4下失败,因为并非所有NAT都是可遍历的。由于状态防火墙,可能在IPv6下。
现在,对于nat遍历:DHT辅助NAT遍历的解决方案是NATed节点具有集合点节点。
要保持UDP NAT映射打开,必须定期ping该集合点节点。
此外,它必须宣布DHT上的会合点的地址,例如在hash("rendezvous" + node ID)
下或仅在其可到达的邻居节点上。
集合点节点可以作为打孔的协调点。
这不需要任何特殊的“超级节点”,只需要网络中的其他(可能是多个,因此消除SPOF)节点,这些节点没有NAT并且可以提供帮助。
其他机制,如UPnP IGP,NAT-PMP,PCP,最终指示用户转发所需的端口,也有助于减少nat遍历的需要。
答案 2 :(得分:0)
由于算法的设计1对等体不知道其他对等体的IP地址所以我需要1个对等体来完全打开一个端口,以便PUBLIC能够连接到
首先,这只适用于Full cone NAT。对于其他类型的NAT,公共IP:您打开的端口仅适用于特定目的地。在你的情况下,你不知道目的地,所以它是不可能的。
如果是全锥形NAT,则将数据包发送到具有低TTL值的随机地址,以便数据包在中间丢弃并且不会到达该地址。如果达到该地址,则NAT可能会阻止您。如果你这样做,那么将打开一个端口供任何人发送一个数据包。您需要在一段短暂的间隔后继续发送数据包,以使该端口保持打开状态。这是一个问题,您无法选择在NAT中打开哪个端口。 NAT将为您自己分配一个空闲端口。
最后,如果对等方无法相互交换IP信息,我就不会发现上述任何一点。您应该使用SIP或XMPP等信令协议在对等体之间交换IP信息。
要了解有关NAT的更多信息,请阅读此answer.