游戏如何处理NAT路由器问题?

3
在过去的几天里,我一直在开发一个在线游戏,这是一个2人游戏,其中一人启动服务器(监听某个端口),另一个通过输入IP连接到他。这种方法存在两个问题:
- 输入对手的IP非常不方便。 - 服务器不能在路由器后面,因为NAT会阻止它工作。
第一个问题可以通过匹配服务来解决,该服务负责处理IP地址,而不需要用户关注。但是我不确定如何解决第二个问题。我已经了解了“TCP打洞”的相关知识,但根据我的了解,当两个玩家都在路由器后面时,无法执行此操作。如果这是真的,那么像《光环3》这样具有匹配服务的游戏是如何工作的呢?
提前感谢您的回答。

这个问题是否更适合在GameDev.SE上讨论? - raveturned
2
@raveturned - 这适用于非游戏开发程序员,我宁愿看到它留在这里。 - Oded
@raveturned,我思考了一下,但是这个主题是关于建立连接,而不是在连接上进行通信。它也与游戏本身无关。因此,这基本上是一个关于网络的问题,而不是任何特定的游戏开发过程的问题。 - Itamar Marom
对uPNP进行一些研究。现在大多数路由器都支持它。 - leppie
4个回答

1
你可以使用一种称为UDP穿透的技术,对于游戏来说,UDP可能是更好的选择。但是你仍然需要某种约会服务器来启用客户端的初始握手。
请参见这里获取一般信息

我花了相当一段时间,但最终我学到了更多东西,昨天我用Python实现了一个匹配服务器,采用UDP打洞技术。运行得很好,谢谢! - Itamar Marom

1

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

在VOIP/SIP领域,他们有一些处理这个问题的RFC。请查看ICEICE-TCP(用于TCP),它们使用STUNTURN。如果你在你的游戏中实现这些协议可能有点过头了,但我认为它们是学习NAT穿透技术的好资源。


我理解这应该如何工作,但有一些令我困惑:当我在C#中使用套接字时,一个用户在特定端口上侦听,另一个用户使用该端口连接。那么,我该如何让连接的NAT设置端口,而非自己设置端口? - Itamar Marom
幸运的是,你不必自己实现所有协议。Lumisoft.NET有一个良好干净的STUN实现(我已经成功使用过),而ZeroC似乎是ICE的一个相当受欢迎的选择。Lumisoft.NET还包括uPNP-PMP(upnp端口映射协议)的实现。 - M.Babcock
不过,这似乎是值得我自己实现的东西,特别是为了更多地了解它的工作原理。 - Itamar Marom
你能回答我上一条评论中的问题吗? - Itamar Marom

0

-1

你不应该编写一个仅负责查找匹配(即服务器列表)的配对服务。

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

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


好的,但是一旦两个用户都连接到主服务器,我该如何将它们彼此连接? - Itamar Marom
你不需要这样做。玩家可以创建和加入现有的比赛。一旦两个或更多玩家在同一场比赛中,您会发送给他们应该知道的关于世界或其他玩家的数据。 - Alon Gubkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接