打洞是否需要 UDP 会合服务器或者可以是 TCP 会合服务器?

打洞是否需要 UDP 会合服务器或者可以是 TCP 会合服务器?

我正在努力理解这个问题......

我想连接两个用户...

这些用户已经连接到 TCP 服务器,该服务器知道公共 IP 和连接 TCP 端口。我希望使用现有的服务器连接来在我的用户之间创建 p2p 连接,因为要求他们连接到另一个 UDP 服务器以了解他们所连接的公共端口有点多余。

是否有可能在不创建另一个服务器(这次是 UDP)的情况下解决这个问题?

答案1

我知道这个问题已经存在两年了,但是一直没有答案,所以我想提出一种处理这个问题的方法。

这实际上只适用于 UDP,因为它是无状态的,并且不适用于 TCP。您描述的与第三个“控制”服务器建立 TCP 连接的设置实际上是此设置的完美设置。我们将此处的各方称为“用户 A”、“用户 B”和“控制”。其工作原理如下:

  • 用户 A 和用户 B 与控制端建立 TCP 连接。建立连接后,两个用户都会向控制端发送一个可以联系他们的端口。我们将用户 A 的端口称为“端口 X”,将用户 B 的端口称为“端口 Y”。
  • 控制与用户 B 共享用户 A 的端口信息,反之亦然。
  • 用户 A 从端口 X 向端口 Y 上的用户 B 发送一个 UDP 数据包。用户 B 的防火墙当然会拒绝这个数据包。
  • 用户 B 从端口 Y 向端口 X 上的用户 A 发送一个 UDP 数据包。用户 A 的防火墙将在内部将此端口转发给用户 A,因为用户 A 的防火墙刚刚看到一个数据包通过端口 X 离开用户 A 并到达端口 Y 上的用户 B(由于它是 UDP,它不知道它被拒绝了),所以它假定从端口 Y 上的用户 B 发往端口 X 上的用户 A 的数据包是响应数据包,因此它让其通过。
  • 用户 A 从端口 X 向端口 Y 上的用户 B 发送另一个 UDP 数据包,并且由于同样的原因,该数据包也被允许通过用户 B 的防火墙。
  • 用户A和B现在可以来回发送UDP数据包,并且不再需要控制的参与。

相关内容