c# - 严肃的高性能服务器的 Tcp 可靠性与 Udp 负担

标签 c# .net-3.5 sockets tcp udp

速度、优化和可伸缩性是 Udp 和 Tcp 协议(protocol)之间的典型比较。 Tcp 吹捧可靠性,缺点是有一点额外的开销,但速度非常好。一旦 Tcp 套接字被实例化,保持套接字打开需要一些开销。但与经常描述的 Udp 负担相比,究竟哪个协议(protocol)的开销更大?我还听说 Tcp 存在可伸缩性问题……但是互联网(网页/服务器)在 Tcp 上运行 - 那么 Tcp 是什么抑制了可伸缩性?

好的...所以 Udp 不需要保持连接打开的开销。但是,它需要您编写额外的方法来确保所有数据包都到达那里,希望按照您希望的顺序接收。如果没有收到完整的数据包,则必须告诉客户端或服务器重新发送。并且您还必须为部分数据包保留某种消息集合,重建部分消息,并在最终处理消息之前检查完整消息。更不用说如果消息的第二部分永远无法发送,您必须说重新发送整个内容,或者重新发送我们丢失的部分,或者其他任何方式。

基本上,我的问题是:

  1. 为什么我会选择 Udp 而不是 Tcp 作为一个严肃的、高性能的服务器,并增加了消息的“开销” 检查和手动 ACK 与连续流的“开销”?
  2. 如果 Tcp 对于魔兽世界之类的游戏来说已经足够好了,为什么 Tcp 没有被更广泛地接受为用于游戏服务器的协议(protocol)?

注意:我不反对为服务器实现 Udp 选项。我们在 .Net 3.5 框架上使用 C#。因此,我也对处理 Udp 负担 的最佳实践感兴趣。我还在 socket 级别使用异步方法,而不是使用 TcpListener、TcpClient 等。

最佳答案

好吧,我建议您多读一些。有很多地方可以查看 TCP 与 UDP 的优缺点,反之亦然,这里有几个:

但是,您可能最感兴趣这个链接,因为它直接与网络游戏编程有关:

如果我要引用一些小的话:

The decision seems pretty clear then, TCP does everything we want and its super easy to use, while UDP is a huge pain in the ass and we have to code everything ourselves from scratch. So obviously we just use TCP right?

Wrong.

Using TCP is the worst possible mistake you can make when developing a networked game! To understand why, you need to see what TCP is actually doing above IP to make everything look so simple!

尽管如此,我仍然建议您对此事进行自己的研究,并确保在一天结束时哪些协议(protocol)适合的需求。话虽这么说,但似乎大多数游戏都使用 UDP 来获取数据。任何持续更新整个状态的东西都不需要保证数据包传输的开销。

关于c# - 严肃的高性能服务器的 Tcp 可靠性与 Udp 负担,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2354091/

相关文章:

c# - 两个下拉列表之间的 If 语句。 C#

c# - 告诉 LINQ Distinct 要返回哪个项目

c++ - 在ctor vs connect方法中 boost 套接字vs stream_socket端点

android - 通过热点在两个 Android 设备之间进行数据交换

c# - 无法加载文件或程序集 'System.Net.Http'

c# - 使用 linq 获取一组元素

c# - 我怎样才能找到圆的两点之间的角度?

c# - ConfigurationManager 的命名空间在哪里?

c# - 使用什么: var or object name type?

sockets - 在多种设备类型上在防火墙和 NAT 后面进行 p2p 传输的方法