MMO 如何为真人游戏计算和发送数以千计玩家的数据包?

How would an MMO deal with calculating and sending packets for thousands of players every tick for a live action game?

我正在开发一款游戏,并且正在考虑进入网络领域。我已经编程了大约 5 年,最近 2 年开始从事游戏开发。我只真正利用自己的时间在网上和书本上学习。我计划为 Amazon AWS EC2 创建一个 java 服务器,但我只是想知道 MMO 是如何处理多个玩家的。

仅仅是服务器的强大功能吗?我不是在寻找代码或任何东西,只是一般来说服务器是如何工作的。

服务器是不是只对所有玩家和数万或数十万个对象进行所有计算,然后每次发送和接收数以千计的数据包?单台电脑看起来很多,但它确实是一台服务器。

大多数 MMO 都有大量的客户端逻辑,因此服务器不需要一直向每个玩家发送大量数据包。服务器不为所有玩家进行计算,客户端负责繁重的工作,服务器处理数据库中的客户端和虚拟世界的状态。

例如,您的客户端和服务器可以具有相同的世界模型。这样你的玩家就可以在世界上导航,客户端代码以相当的时间间隔(比如 100 毫秒)告诉服务器。

通常您希望客户端自行更新到服务器,并让服务器响应处理保持客户端同步的问题。

MMO 也在他们的农场中 运行 多台服务器,从几十到几百。这些服务器通常与大型高性能数据库对话——虚拟世界的状态基本上都在数据库中,服务器介于保持数据库最新和与客户端应用程序通信之间。

服务器的工作原理和工作是什么?

  • 您的服务器创建一个套接字并打开一个端口。

  • 网络游戏的协议一般是UDP,因为速度快

  • 您的服务器必须处理所有客户端连接。

  • 你可以添加一个可以登录账号的服务器,然后将他重定向到游戏服务器(所有大型MMO都是如此)

  • 你的服务器必须管理数据库中的所有计算:当一个敌人击中另一个敌人时,当你买东西时减去你的一部分钱...

  • 所以服务器是网络游戏的主体

事实上,计算机做一些计算真的很快,现代视频游戏最重的部分是物理和图形......幸运的是,这两个部分都在客户端。

但是,服务器一定要强大!不像客户端,因为他不需要大 GPU,但他需要大量 RAM/CPU(取决于游戏),他还需要 保持冷静

事实上,由于 UDP 协议,游戏服务器能够处理大量连接,因为程序的所有 重部分 都在 客户端。你可以在这里看看:Creating a Multiplayer game in python 并阅读我解释UDP和TCP协议之间的区别的部分。

All the others informations about how work an MMO server are linked at the end of this topic.

现在可以尝试搭建服务器了!

首先,你知道如何创建服务器吗?

  • 编程或下载服务器进行测试(例如:TeamSpeak 或 Mumble)。

  • 从您的计算机启动他并允许他从您的防火墙进行输入连接。

  • 登录调制解调器,forward/redirect将服务器端口连接到计算机。

对于最后一部分,您需要做一些研究:我的服务器使用哪个端口以及如何使用我的调制解调器转发端口(每个调制解调器都不同)。

现在您可以尝试登录您的服务器。但是...!

您的电脑有3个IP:

  • Loopback地址:localhost,127.0.0.0(“0”可以改)

  • 内网地址(IP link给你的电脑):192.168.0.0, 172.16.0.0, 10.0.0.0

  • 和互联网地址(IP linked 到您的调制解调器):0.0.0.0

如何知道您的 Intranet/internet IP?这取决于您的操作系统和调制解调器。对于 Intranet,请使用您的终端并输入 "ifconfig" 或 "ipconfig"。对于您的互联网地址,有时会在您登录调制解调器时写入,或者您必须访问能够显示您的 IP 的网站。

如果您创建了一个服务器并且没有从您的调制解调器转发端口,您仍然可以使用您的 Loopback 地址在本地访问您的服务器,并且连接到同一调制解调器的其他计算机也可以访问该服务器与内网地址。此外,如果您需要测试您的服务器是否可以从 Internet 访问,您必须测试与您的 Internet IP 的连接,但是某些调制解调器不允许来自 Intranet 的外部连接......所以如果您与 Internet IP 的连接不起作用,请尝试从另一个调制解调器(朋友的 PC、Cyber​​-Coffee...)登录到您的服务器。

最后,如何保护你的服务器?

这真的很难,您无法创建完美的安全性...尤其是如果您听从了我的建议,但没有通过自己的研究来完善我的知识。

  • 根权限

这是最重要的部分。当 lamer 尝试访问您的服务器时,他可以尝试像 http/ssh/ftp 这样的简单连接。如果他可以访问您的硬盘并且您没有选择强限制,他可以简单地 read/modify/delete 您游戏的数据库。数据库包含有关帐户的所有信息。

  • 防火墙

我们已经讨论过服务器必须处理的 connections/calculation 数量。在某些攻击中,lamer 尝试创建大量连接并且没有关闭它们。我们称其为 DOS(一台计算机)或 DDOS(多于一台计算机)。所以你需要一个好的防火墙:只允许你的服务器的端口,只允许来自一个唯一 IP 的 X 个连接,并且每分钟只允许 X 个新连接。

  • 更新

这是最简单的部分:让您的操作系统(和其他应用程序)保持最新。

  • 越少越好

不要在服务器上安装很多无用的软件。如果一个软件不是为你的服务器导入的,你不应该安装他,因为:首先,它可能是病毒。其次,恶意软件可以利用此软件安装病毒或窃取根访问权限。

  • 加密

加密对于阻止黑客来说非常重要。例如,使用 https 协议,您可以保护用户的密码免受 MITM 攻击。使用 Bluefish/SHA/others,您可以加密您的数据库以保护她,即使黑客可以读取它。最重要的是始终阻止黑客的 write/modify/deletion/execute 权限(实际上,您游戏的所有客户端都需要读取权限)。

  • 杀毒?

对于在线游戏,杀毒软件并不是很重要(但仍然建议 所有操作系统,Linux/Unix 也一样)。

  • 有一个好的服务器

如果您的服务器在没有考虑安全性的情况下进行编程,您可能会有麻烦。示例:C/C++.

中的缓冲区溢出攻击

If you need more informations about how work an MMO, I recommend you:

提示 - 如果你通过创建一个在线游戏很有趣,你必须做很多研究,我不能真正回答这个问题,因为这不是主题的目的。而且这个主题太大了,无法在每个问题上写一个新的答案...哪个软件用于编写游戏程序?如何构建套接字?从哪里开始?但是我已经回答了一些类似的问题。即使编程语言有时不同,我给你link,逻辑总是一样的,所以它可能对你有帮助:

  • Creating a Multiplayer game in python

  • Xcode Mass Multiplayer (Not What You're Probably Thinking)