UDP 打洞指南

UDP 打洞指南

我正在尝试使用 UDP 打洞技术连接两台计算机。我尝试连接的两台计算机位于由同一路由器创建的两个不同的 Wifi 上。我将这些计算机称为 C1 和 C2。因此,我想在 C1 和 C2 之间建立连接。我有 2 个可用的公共服务器 IP,我在其中运行 UDP 侦听器服务器。这些服务器是 S1 和 S2。

实验一:

  1. 从 C1 向 S1 发送一个 UDP 数据包,并打印传入数据包的 IP 和端口。我得到了 IP_C1 和 PORT_C1。
  2. 使用 IP_C1 和 PORT_C1 从 S1 向 C1 发送回一条消息。这按预期工作正常,并且保持连接。所以在某种程度上,我已经为 S1 直接与 C1 通信打了一个洞。

实验2:

  1. 从C1向S1发送UDP数据包,获取IP_C1和PORT_C1。
  2. 从C2向S1发送UDP数据包,获取IP_C2和PORT_C2。
  3. 使用 S1 通过 IP_C1 和 PORT_C1 将消息发送回 C1。这与之前一样有效。
  4. 使用 S1 通过 IP_C2 和 PORT_C2 将消息发送回 C2。这也可以正常工作。

因此现在 C1 和 C2 都可以从 S1 访问。注意:我看到的是 IP_C1 和 IP_C2 相同,所以我们称它们为 IP_C。但是端口不同。

继续,我尝试使用 IP_C 和 PORT_C2 作为目的地从 C1 向 C2 发送消息。C2 没有按预期收到消息,然后我使用 IP_C 和 PORT_C1 从 C2 向 C1 发送消息。这就是我开始陷入困境的地方:我预计现在 C2 的消息将到达 C1,因为 C1 已经在通往 C2 的 NAT 中打了一个洞。但 C1 没有收到消息。如果我现在继续从 C1 和 C2 发送另一条消息。C2 没有收到它。但即使现在,如果我从 S1 向 C1 或 C2 发送消息,它也能正常工作。

实验3:

为了检查客户端发送另一个 UDP 数据包时 IP 和端口是否保持不变,我执行以下操作:

  1. 从C1向S1发送UDP数据包,获取IP_C1和PORT_C1。
  2. 从C2向S1发送UDP数据包,获取IP_C2和PORT_C2。
  3. 从C1向S2发送UDP数据包,获取IP_C1_S2和PORT_C1_S2。
  4. 从C2向S2发送UDP数据包,获取IP_C2_S2和PORT_C2_S2。

与 S1 一样,S2 也可以轻松连接,我看到 IP_C1=IP_C1_S2=IP_C2=IP_C2_S2=IP_C 且 PORT_C1=PORT_C1_S1 且 PORT_C2=PORT_C2_S2。

因此端口得以维护。

即使在这种情况下,我也无法在 C1 和 C2 之间建立通信。所以我不确定为什么 C1 和 C2 之间的通信不起作用。如何才能让它正常工作?

谢谢

相关内容