如何使多人游戏在NAT之后可靠地工作?


20

当客户端位于NAT之后,即使是100%客户端/服务器的游戏有时也会出现问题。小便对等游戏甚至是更大的问题。某些游戏需要使用多种传输方式(例如UDP和TCP)或多种连接方式(例如用于语音的其他UDP端口)。

有什么方法可以确保游戏在NAT路由器后面运行时可靠运行?

  • 对等:不存在集中式服务器。玩家A开始游戏,而玩家B想加入
  • 客户端-服务器:知名地址(主机名)上的集中式服务器接受所有传入连接。每个客户端仅与该服务器通信。
  • 组合:服务器只是配对,但游戏更新是对等的。不同的对等方可能会看到每个播放器具有不同的IP /端口(例如,某些客户端位于同一NAT之后,而某些客户端位于不同的路由器上)

Answers:


9

最常用的技术称为NAT穿通。这是一个不错的介绍:http : //www.mindcontrol.org/~hplus/nat-punch.html

至少有一个针对UDP的OSS项目:http : //udt.sourceforge.net/index.html

我相信RakNet也支持穿通。这是商业广告,但是有免费的“独立”许可证。看到这里:http : //www.jenkinssoftware.com/

搜寻“ NAT打孔器”将为您提供更多阅读材料


1
我知道这是一个非常古老的问答,但是如果有人读过,RakNet被OculusVR收购,现在开源并获得了两句BSD许可证。github.com/OculusVR/RakNet

9
  • 没有客户端将其自己的地址通知服务器或对等方。换句话说,不要将客户A的IP嵌入游戏包中,而要让客户B或服务器回复该地址。始终回复邮件来源的地址/端口。

  • 最小化用于游戏的不同UDP或TCP端口。这使设置NAT规则更加容易。

  • 允许用户覆盖游戏中使用的默认端口。这样,可以将多个服务器托管在同一个NAT之后。

  • 在游戏文档中记录端口和它们遵循的所有规则(感谢该Zorba)。在Descent 3中,我致力于创建一个独立的测试应用程序,该应用程序通过将数据包发送到测试服务器来帮助您排除路由器或NAT配置的故障。

7
除了本来不错的答复外,请在游戏文档中包括游戏端口的注释。令人惊讶的是,有多少游戏没有这样做-人们使用“ netstat”手动根除端口,并弄错了其中一半。
ZorbaTHut 2010年

使用UDP,您实际上并不知道消息的来源。任何内容都可以写在寄信人地址中。
MickLH

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.