【问题标题】:Should I use TCP or UDP for the networking protocol for an MMORPG?我应该使用 TCP 还是 UDP 作为 MMORPG 的网络协议?
【发布时间】:2015-08-26 21:09:42
【问题描述】:

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

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

【问题讨论】:

  • 真正的答案是你不应该......有很多现有的库/提供者可以处理所有这些东西。到目前为止,您的问题是非常基于意见的......即使是基本的 HTTP 对许多游戏来说也可能足够了(而且支持起来非常简单)。
  • .Net 的套接字实现使用起来非常简单,我宁愿使用自己的代码,也不愿依赖可能包含或不包含我可能无法修复的错误的其他人的代码。我也在使用我自己的代码来尝试最小化带宽需求。虽然 HTTP 可能是一个非常简单的协议,但以我们必须使用的带宽向潜在的数千个客户端发送这么多数据是不可行的。这就是为什么我要使用 Google 的 Protocol Buffers 协议对对象进行序列化。

标签: c# tcp udp monogame multiplayer


【解决方案1】:

我知道有几款游戏实际上会同时使用 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

其中一个网站建议仅将 TCP 协议用于 MMORPG 游戏,另一个建议仅将 TCP 用于非实时游戏。第二个链接讨论了使用每个链接的利弊以及相关的开销。

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

做两个可能是有益的,但我建议现在使用 TCP,稍后将挂钩留给 UDP。我认为让项目启动并运行然后这么早担心延迟问题会更有益。正如我链接的 Quake 3 文章中指出的那样,同时执行 TCP 和 UDP 会引入有趣且非常难以跟踪的错误。

【讨论】:

  • 对于迟到的回复,我深表歉意,在发布我的问题几个小时后,我的电源爆炸了,感谢您提供的信息,到目前为止,这些文章读起来很好。我决定使用 TCP 来发送文件和其他需要可靠性的敏感流量,而 UDP 用于协议的其余部分
  • 是的,没问题。很高兴我能帮上忙!
【解决方案2】:

TCP 很方便,但您要为这种简单性付出代价。每个 TCP 数据包都会发送一个 ACK​​ 数据包说“谢谢”并告诉发送者他们得到了那个段#。这些 ACK 数据包,在大下载的情况下,代表了大量的流量。请记住,主网络上的互联网仅丢失 1000 个数据包中的大约 1 个,因此单独验证每个数据包的传输主要是浪费信息。大多数最聪明的游戏都使用 UDP,并使用最复杂的技巧将发送的数据包紧密打包。有一个只有 1..10 的数字,那么你只使用 4 位。

它们还将来自多个数据包的数据组合成一个数据包,以便获得最大吞吐量。每秒的数据包数才是真正的限制因素,只要您将数据包大小保持在非拆分数据包的最大值以下(不完全是 1500,但稍微小一点,而且很难确定)您可以充分利用传输硬件。对于用户基数较小的休闲游戏来说,这可能无关紧要,但这些大型多人游戏拥有一些全球最大的用户基数,当您拥有大量用户时,浪费的传输机制将需要昂贵的服务器场。

有了足够好的老式bit twiddling,你可以压缩你传输的信息,并支持大量的用户,但是很多人只是想将数据从A点移动到B点而不考虑太多,这就是为什么TCP就在身边。我特别不喜欢 TCP 需要多长时间才能识别出事情已经发生了变化,而且我有一种过时的心态,即您应该完全控制该过程,而 UDP 非常简单。

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

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

【讨论】:

  • 请编辑您的帖子,使其不像wall of text
  • 感谢您的宝贵见解!您能否详细说明“并且只要您将数据包大小保持在非拆分数据包的最大值以下(不完全是 1500,但稍微小一点,而且很难确定)”?
猜你喜欢
  • 2011-08-20
  • 2016-06-10
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多