【问题标题】:Nat Punchthrough understanding P2P concept [closed]Nat Punchthrough 理解 P2P 概念
【发布时间】:2023-10-23 21:09:01
【问题描述】:

所以,我一直在阅读 NAT-Punchthrough。我似乎明白了这个想法,但我很难实现它,而且我觉得我在这里错过了一步。 测试这个功能有点困难,因为当涉及到基于互联网的连接时,我几乎无法控制环境。

我有一个 SQL 服务器作为我的“促进者”运行,它保存服务器和客户端的外部地址,以及外部看到的它们的端口。

目前的步骤如下: - 我通过存储服务器/客户端 IP/PORT 的 Web 请求(PHP 脚本)连接到我的 SQL 服务器 - 当两者都知道时,客户端和服务器都尝试连接(服务器主机在设置的端口上,客户端通过设置的端口连接) - 没有什么重大的事情发生

这里有 2 个未知数,我想和你一起检查一个。 NAT-Punchthrough 确实要求我使用我计划在之后的步骤中连接的确切(内部/LAN)端口执行第一步吗?

如果是这样,我不知道我的服务器在水下究竟是如何工作的,所以它可能需要比我最初给定的静态端口更多的端口来连接,但这至少给了我一个提示。

如果有人比我有更多这方面的文档,请告诉我。

来源:
Programming P2P application
http://www.mindcontrol.org/~hplus/nat-punch.html

【问题讨论】:

    标签: port p2p nat hole-punching nat-traversal


    【解决方案1】:

    NAT 穿透的工作原理是有根据的猜测。它通常用于创建与进行 IP 伪装的设备的连接。这是大多数家庭互联网调制解调器中使用的技术,以至于 NAT 已经可以互换地用来指代 IP 伪装。

    当您从位于 NAT 系统(如家庭调制解调器)后面的设备连接时。您无法控制将用于 Internet 出站连接的端口。然而,许多这些设备使用特定模式分配端口。例如,增量数字。

    NAT 穿透涉及尝试直接连接两个位于独立 NAT 设备后面的源系统。第三个系统,您的“促进者”充当检测器,用于检测当前由两个 NAT 设备在出站连接上分配的源端口号。然后将源端口号与 IP 地址一起发送给其他方。

    所以现在回答你的问题很聪明。想要直接连接的两个系统都开始尝试与另一个系统通信。他们尝试连接到服务商检测到的已知端口号周围的一系列端口。这是猜测。

    重要的是,两个源系统都开始尝试连接,因为这将在本地设备中建立允许来自 Internet 的流量的 NAT 会话。如果任一源设备正确猜到了其中一个 NAT 会话端口号,则连接是成立。

    实际上,使用 NAT 穿透的组织的工程师可能已经花费了一些时间来检查更流行的 NAT 端口分配算法并调整他们的软件。如果您可以通过 NAT 设备控制连接,那么设置一些测试并查看端口号在与不同服务器的连接之间的变化是相当容易的。

    【讨论】:

    • 所以,长话短说。认为我们可以仅从 1 个端口或线性增量创建自己的 NAT-Punchthrough 是幼稚的,因此应该找到一个服务来为我们做这种“魔术”?
    • 没有理由你不能尝试,但this previous study 建议通过一些技巧,成功率可能在 60% 左右。如果您确实尝试并获得任何结果 - 其他人知道您做了什么将是很好的反馈。
    • 因为我们需要能够至少达到 90% 才能在生产中通过它,所以我们将放弃这一点。有一些服务可以为您提供 NAT-Punchtrough。然而据我所知,他们都做一些类似套接字的东西,所以你被困在运行一个 linux 服务器来为你做这个魔术。他们得到了声称的 90% 的成功率。如果您想要 100% 的可靠性,那么您将无法使用 RELAY 服务器,这类似于 Photon Networking。这通常会变得很昂贵,尤其是在我们要发送的数据负载很大的情况下。在一个小团队中要正确太难了! #延迟