【问题标题】:How do games handle NAT router problems?游戏如何处理 NAT 路由器问题?
【发布时间】:2012-04-11 23:10:03
【问题描述】:

在过去的几天里,我一直在开发一款在线游戏,这是一款 2 人游戏,其中一个人启动服务器(侦听某个端口),另一个人通过输入他的 IP 连接到他。这种方法有两个问题:

  • 输入对方IP很不舒服。
  • 服务器不得位于路由器后面,因为 NAT 会阻止它工作。

第一个问题可以通过匹配服务来解决,该服务会在用户不关心的情况下处理所寻址的 IP。但我不确定如何解决第二个问题。我已经阅读了有关“TCP 打孔”的信息,但根据我所阅读的内容,当两个玩家都在路由器后面时,不可能执行此操作。如果这是真的,那么像 Halo 3 这样的匹配服务游戏(其中一名玩家是主机)如何运作?

提前致谢。

【问题讨论】:

  • 这个问题在GameDev.SE 上会更热门吗?
  • @raveturned - 适用于非游戏开发程序员,我宁愿看到它留在这里。
  • @raveturned,我想过,但这个主题是关于建立连接,而不是通过它进行通信。它也不关心游戏本身。所以这基本上是一个关于网络的问题,而不是任何特定的游戏开发过程。
  • 对 uPNP 做一些研究。现在大多数路由器都支持这一点。

标签: c# tcp nat hole-punching


【解决方案1】:

您可以使用一种称为 UDP Hole Punching 的技术,因为游戏 UDP 无论如何可能是更好的选择。但是您仍然需要某种集合服务器来启用客户端的初始握手。

here for general information

【讨论】:

  • 我花了很长时间,但最终我学到了更多,昨天我用python实现了一个匹配服务器,带有UDP打孔。像魅力一样工作,谢谢!
【解决方案2】:

我相信您的第二个问题也可以通过您的配对服务/服务器来解决。该服务器应该能够知道他们各自 NAT 后面的 2 个玩家的公共 IP 和端口。服务器将收到的数据包将包含每个玩家的公共 IP。服务器所要做的就是将一个玩家的公共 IP+端口转发给另一个。当每个玩家都知道对方的公共 IP 时,他们应该能够直接相互交谈。但是,NAT 穿越技术的成功很大程度上取决于每个 NAT 设备的配置。

在 VOIP/SIP 领域,他们有几个 RFC 来处理这个问题。检查使用STUNTURNICEICE-TCP(用于TCP)。如果您在游戏中实现这些协议可能有点矫枉过正,但我​​认为它们是学习 NAT 穿越技术的好资源。

【讨论】:

  • 我了解这应该如何工作,但有一些事情让我感到困惑:当我在 C# 中使用套接字时,一个用户在某个端口上侦听,而其他用户使用该端口进行连接。那么,如何不自己设置端口,而是让连接的 NAT 设置呢?
  • 幸运的是,您不必自己实现所有协议。 Lumisoft.NET 对 STUN 有很好的干净实现(我已经成功使用它),ZeroC 似乎是 ICE 的一个相当受欢迎的选择。 Lumisoft.NET 还包括 uPNP-PMP(upnp 端口映射协议)的实现。
  • 不过,这似乎是值得我自己实现的东西,尤其是为了更多地了解它的工作原理。
  • 您能回答我上次评论中的问题吗?
【解决方案3】:

GameDev.SE 上的This question 有几个有用的答案,包括指向 NAT 穿透介绍的链接:http://www.mindcontrol.org/~hplus/nat-punch.html

【讨论】:

    【解决方案4】:

    您不应该编写只负责查找匹配项(AKA 服务器列表)的匹配服务。

    更好的解决方案是创建一个玩家可以自动加入的主服务器。主服务器允许创建或加入现有的比赛。玩家不应该相互连接,他们应该始终连接到主服务器。

    例如,Halo 的“主服务器”是 Xbox Live。

    【讨论】:

    • 好的,但是一旦两个用户都连接到主服务器,我该如何连接他们?
    • 你没有。玩家可以创建和加入现有的比赛。一旦两名或更多球员在同一场比赛中,您就向他们发送数据,让他们了解世界或同一场比赛中的其他球员。
    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2016-05-16
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多