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

本文关键字:MMORPG 网络协议 作为 UDP TCP 还是 我应该 | 更新日期: 2023-09-27 18:10:09

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

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

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

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

我知道你没有使用Unity,但这里有一个链接,讨论了游戏中多人使用的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/

在阅读完这些链接后,它们非常彻底地解释了这些概念,并且应该能够帮助你根据自己的游戏玩法风格做出决定。gafferongames的链接似乎是最有用的——它很有深度地解释了这些事情。我建议你至少看一看

等待?为什么我不能同时使用UDP和TCP?

最后一个链接的引用表明,它很大程度上取决于项目的不同:

这要视情况而定。当涉及到服务器到服务器的通信时,没有"通常"的方法。您可以使用任何自定义的超轻量级UDP协议,或者您自己设计和构建的更复杂的协议,范围包括JDBC/ODBC等标准化系统,甚至基于REST的调用。网络基础设施工程师的薪酬如此之高的一个原因是,他们知道在个别场景中应该选择什么。: -)

这最终取决于你在做什么,以及你想从应用程序中得到什么。有些人不同意两者同时使用,因为这可能会引起问题。最好的办法是通读这些网站,然后根据使用它们的利弊来决定。

编辑:我发现更多的网站更具体地讨论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协议。第二个链接讨论了使用每种方法的优缺点以及相关的开销。

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

做两个可能是有益的,但我建议现在使用TCP,把钩子留给UDP以后。我认为让项目启动并运行比这么早担心延迟问题更有益。正如我在《雷神之锤3》的文章中所指出的那样,同时使用TCP和UDP会引入有趣且很难追踪的漏洞。

TCP很方便,但要为这种简单性付出开销。每个TCP包将发送一个ACK包,表示"谢谢",并告诉发送者他们收到了该段#。在大下载的情况下,这些ACK数据包代表了大量的流量。请记住,主要的互联网只丢失1000个数据包中的1个,因此单独验证每个数据包的传输基本上是浪费信息。大多数最聪明的游戏都使用UDP,并使用最狡猾的技巧来紧密打包发送的数据包。有一个只能是1…10的数字?,那么你只使用4位。

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

使用足够好的老式的位处理,您可以压缩传输的信息,并支持大量用户,但许多人只想将数据从A点移动到B点而不考虑它,这就是TCP存在的原因。我特别不喜欢TCP花很长时间来识别事情已经出错,我的老式心态是你应该完全控制这个过程,而UDP是非常简单的。

我喜欢UDP的另一件事是,你可以告诉当连接已经坏了,可以警告用户。TCP在很大程度上向您隐藏了问题,而使用UDP意味着您可以通知用户他们的播放正在降级。对用户来说,让他们知道自己的网络连接很糟糕比让他们认为你的游戏很糟糕要好得多。

TCP有很多妥协。它的设计非常巧妙,可以处理流控制和纠错,但对于大多数游戏来说,它的效率非常低。你可能会惊讶于游戏行业中很少有人真正了解网络;这是一个为许多游戏构建网络模块的小团队,因为这确实是一个棘手的子领域。不幸的是,当你进入web平台时,你所拥有的只是HTTP,甚至不是完整的TCP,而UDP出于安全原因被禁止。