NAT转换不在网络内部工作(发夹条件)

Jul*_*éon 4 networking routing p2p nat

我正在写一个P2P应用程序.对等体定期ping主服务器以更新其当前的IP /端口,因此当对等体想要到达另一个时,它可以向服务器询问该信息.现在,对等体使用UPnP配置NAT(用于经典家庭设置)可从外部访问.

所以一切正常,除非对等方的客户端试图到达另一个(或同一个)对等方的服务器,并且两者都在同一个NAT之后.由于在这种情况下客户端试图从NAT后面到达其自己的"外部"(公共)IP地址,因此NAT不执行端口转发并且无法路由IP数据包.

现在我想到两个解决方案:

  • 使用UPnP查询NAT以查看端口转发到的本地IP
  • 在主服务器上存储对等体的内部IP

你能想到其他解决方案吗?主流P2P应用程序实施哪些策略来解决这个问题?

Jér*_*nge 6

由于在这种情况下客户端试图从NAT后面到达其自己的"外部"(公共)IP地址,因此NAT不执行端口转发并且无法路由IP数据包.

这被称为发夹状况.并非所有路由器/ NAT都能正确解决此问题 解决方案是:

a)检查您的路由器/ NAT是否可以配置为启用"发夹".如果您控制部署中的所有路由器/ NAT,则此解决方案有效.

b)购买另一个允许此操作的路由器/节点.就像a)一样,如果您控制部署中的所有路由器/ NAT,它都可以工作.

c)如果您可以从UPnP获取端口信息,这也是一个解决方案,但并非所有路由器/ NAT都知道或支持UPnP.它不包括大型部署中的所有情况.

d)使用多播来"发现"局域网上的其他节点,甚至与它们通信是这个问题的常见解决方案.您需要就IP地址达成一致并让对等方听取它.

e)在服务器上存储私有IP地址也是一种解决方案,但它需要比解决方案d更多的服务器存储容量.还要处理超时(即数据有效期到期).

f)在对等体之间使用类似TURN的通信(即,节点之间的通信通过中央服务器).这种解决方案非常坚固,但在带宽消耗方面并不是最有效的.

希望这可以帮助.