我应该使用 TCP 还是 UDP 作为 MMORPG 的网络协议?

Should I use TCP or UDP for the networking protocol for an MMORPG?

我正在使用 C# 和 Monogame 开发 MMORPG。现在,我正在为它开发网络协议。我应该指出,我是 CCNA,所以我对这两种协议的工作原理有非常扎实的了解。但是,我过去只编写过单人游戏。但是,我有点难以弄清楚我应该使用哪种协议。我最初使用 UDP 开始我的实现,并成功地通过我的本地网络发送了单个数据包,但我担心一旦我开始添加越来越多的客户端,UDP 可能会失败。考虑到这是游戏连接,我最初得出的结论是我需要一个快速、低延迟的连接。但很快意识到我需要发送的一些数据包的大小可能会开始测量许多 KB,例如当客户端进入地图上的新区域时,或者尝试连接的客户端需要更新其本地纹理缓存。

我的问题是那些在制作多人游戏方面有经验的人:即使 TCP 的开销更大,是否值得使用它,或者调整游戏的协议以提高 UDP 的可靠性?

我知道有几个游戏实际上会同时使用 TCP 和 UDP 协议。

我知道您没有使用 Unity,但这里有一个 link 讨论 TCP/UDP 游戏中多人使用的协议 http://forum.unity3d.com/threads/should-we-use-udp-or-tcp.257217/

我还找到了其他几个资源:

http://ael.gatech.edu/cs4455f13/files/2013/08/Networking_Multiplayer.pdf

http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/

http://www.gamedev.net/topic/665565-game-master-server-udp-tcp-or-both/

通读这些 link 后,它们对概念的解释非常透彻,应该能够帮助您根据自己的游戏风格做出决定。 gafferongames 的 link 看起来是最有帮助的 - 它对这些内容进行了深入的解释。我建议至少阅读名为:

的部分

Wait? Why can’t I use both UDP and TCP?

最后一个 link 的引述表明这在很大程度上取决于项目:

It depends on the situation. When it comes to server-to-server communication there is no 'usual' method. You could go with anything from a custom ultra light UDP protocol, or your own more complex protocols that you design and build, ranging through standardized systems like JDBC/ODBC, or even REST based calls. The knowledge of what to pick in individual scenarios is a reason network infrastructure engineers are paid so well. :-)

这最终取决于你在做什么,以及你想从应用程序中得到什么。有些人不同意同时使用这两种方法,因为这会导致问题。最好的办法是通读这些网站,并根据使用每个网站的利弊来决定。

编辑:我找到了更多专门针对 MMORPG 游戏讨论此问题的网站:

http://www.gamedev.net/topic/319003-mmorpg-and-the-ol-udp-vs-tcp/

https://gamedev.stackexchange.com/questions/431/is-the-tcp-protocol-good-enough-for-real-time-multiplayer-games

其中一个网站建议仅对 MMORPG 游戏使用 TCP 协议,另一个建议仅对非实时游戏使用 TCP。第二个 link 讨论了使用每个的优缺点以及相关的开销。

这是我找到的最好的建议,基本上我对你的问题的回答总结如下:

Doing two may be benificial, but I'd suggest working with TCP now, leaving in hooks for UDP later. I think it would be more benificial to get the project up and running then worrying about latancy issues this early. As pointed out in that Quake 3 article I linked, doing both TCP and UDP at the same time introduces intresting and very hard to track bugs.

TCP 很方便,但您要为这种简单性付出开销。每个 TCP 数据包都会发送一个 ACK​​ 数据包,上面写着 "thank you" 并告诉发送方他们得到了那个段 #。这些ACK包,在大下载的情况下,代表着很大的流量。请记住,主网上只有 1000 个数据包中大约有 1 个丢失,因此单独验证每个数据包的传输主要是浪费信息。大多数最聪明的游戏都使用 UDP,并使用最多 bit-twiddly 的技巧将发送的数据包紧紧打包。有一个只有 1..10 的数字吗?那么你只使用 4 位。

他们还将来自多个数据包的数据合并到一个数据包中,以便获得最大吞吐量。每秒的数据包数量才是真正的限制因素,只要您将数据包大小保持在 non-split 数据包的最大值以下(这不完全是 1500,但稍微少一点,这是一件棘手的事情确定)您可以充分利用传输硬件。对于用户群较小的休闲游戏来说,这可能无关紧要,但这些大型多人游戏拥有全世界最大的用户群,当你拥有大量用户时,浪费的传输机制将需要昂贵的服务器群。

有了足够好的老式位操作,你可以压缩你传输的信息,并支持大量用户,但很多人只想将数据从 A 点移动到 B 点而不会考虑太多,这这就是 TCP 存在的原因。我特别不喜欢 TCP 需要多长时间才能识别出问题,并且 old-fashioned 认为您应该完全控制该过程,而 UDP 非常简单。

我喜欢 UDP 的另一件事是,您可以知道连接何时变得糟糕,并可以警告用户。 TCP 在很大程度上向您隐瞒了问题,而使用 UDP 意味着您可以通知用户他们的游戏正在降级。让用户知道他们的互联网连接很糟糕比让他们认为你的游戏很糟糕要好得多。

TCP 有很多妥协。它非常巧妙地设计用于处理流量控制(有点)和纠错,但对于大多数游戏来说,它的效率非常低。您会惊讶于游戏行业中很少有人了解网络胆量;它是一小群人为许多游戏构建网络模块,因为它确实是一个棘手的问题sub-area。不幸的是,当您访问 Web 平台时,您所拥有的只是 HTTP,它甚至不是完整的 TCP,而且 UDP 出于安全原因被禁止。