我一直在考虑做一个纯粹的 P2P 通信系统,中间不需要任何服务器。在本地工作的套接字上制作了一个原型。
但后来发现我的提供商使用的是运营商级 NAT。实际上,我国的所有提供商都使用它。我打电话给他们,他们告诉我他们正在阻止所有入站端口,打开它们的唯一方法是购买静态 IP。而且,他们不使用 IPV6。
听起来故事结束了。但如果是这样的话,那么多人游戏服务器如何工作呢?显然他们必须通过某个端口向我发送数据,而这些端口应该被提供商阻止。一般来说,如果两个客户端都在 NAT/CGNAT 后面,是否可以建立 P2P 连接(至少是短暂的)?
答案1
运营商级 NAT 通常会阻止客户端使用端口转发。当两个客户端都位于 CGNAT 后面时,可以使用各自的 IP 地址建立 P2P 连接。这取决于 ISP 是否允许基于 IP 地址的流量。有些 ISP 会将此类流量视为垃圾邮件进行拦截,甚至可能封禁用户的 IP。
您应该首先检查您的 ISP 关于在其网络内使用 IP 地址的政策。
当 ISP 网络内允许连接时,纯 P2P 系统可以工作。一旦客户端设法联系任何一个初始节点,它就会从该节点接收其他已知节点的列表。通过联系这些其他节点,它会以动态方式扩大和删减其列表,并将其进一步传递到整个网络。
NAT 对数据流向没有影响,因为一旦建立连接,连接就是双向的。一对节点的每一端都可以发起连接,也可以接受另一个节点发起的连接。唯一的问题是找到初始连接。
P2P 系统还使用许多其他方法来让节点连接自身。您可以在 Wikipedia 中找到这些方法的列表。 NAT 遍历。
加入 P2P 的成功取决于找到至少一个节点来启动该过程。对于你的情况,我能想到几种方法:
- 将节点列表保存在知名且可访问的地方,例如 Google Drive
- 使用非标准端口并扫描网络(很危险,因为你的 ISP 可能会把你的节点列入黑名单)
- 将一个中心节点保持在已知地址上,例如使用静态 IP 或租用的服务器
- 使用 动态 DNS 让中心节点动态地宣布自己。