【问题标题】:Mixing TCP and UDP混合 TCP 和 UDP
【发布时间】:2012-04-17 12:43:57
【问题描述】:

我想制作一款可以在 Internet 上运行的多人游戏,而不仅仅是 LAN 等低延迟、高吞吐量的环境。

在我的游戏的某些网络方面,UDP 显然更适合,例如传输有关不同玩家的位置和速度的信息。必须尽可能快地接收这些数据,并且重新发送丢弃的数据包将无济于事,因为该数据在到达客户端时已无关紧要。丢弃一些数据包是完全可以的。

但是,我的游戏还有一些其他方面严格要求按顺序、有保证的交付。数据包的自动分段(分解并重新组合成大块数据)也将非常有用。似乎 TCP 完成了所有这些工作。除非数据严格有序并且没有丢失的数据包,否则数据根本没有用处。在某些情况下,此类数据的延迟不可避免地会受到影响,但这是不可避免的。

因此,与其在 UDP 之上实现类似 TCP 的功能(使用数据缓冲区、用数字标记数据包以确定它们的顺序、数据包确认系统),这将是大量工作来确保其正常工作和高效,我想同时使用 TCP 和 UDP。

但是,我听说如果同时使用 TCP 和 UDP 会互相争夺带宽,使用 TCP 会增加 UDP 丢包率。这是真的吗?混合使用这两种协议时,我还需要处理其他问题吗?

【问题讨论】:

  • 一切都在为带宽而战。
  • @Mat 好吧,是的,但我听说 TCP 上的 100kb/s 或 UDP 上的 100kb/s 将比每个 50kb/s 具有更高的吞吐量和更少的延迟。
  • @newprogrammer 你在哪里“听说”过?请引用。

标签: networking tcp udp


【解决方案1】:

你可以查看http://www.zeromq.org/,一个很好的开源智能传输层库。

【讨论】:

    【解决方案2】:

    如果您遇到困难,我建议在您和网络代码的核心之间放置一个额外的抽象层。试试像“RakNet”这样的多人网络库。

    【讨论】:

    【解决方案3】:

    通常 - 使用 TCP 不会增加 UDP 数据包的丢弃率。它宁愿反过来 - 大量的 UDP 流量会限制 TCP 流量,因为真正的流氓 UDP 实现会限制整个网络带宽 - 而 TCP 会尝试最大化感知带宽的吞吐量。因此,将它们一起使用不会对您造成真正的伤害,只要您最终不会持续地在车站打到可用的 b/w。超出这个范围可能会导致一些缓冲延迟——如果 UDP 或 TCP 应用程序对延迟敏感,这将损害它们。希望有帮助。

    【讨论】:

      【解决方案4】:

      尝试使用 iperf,您会发现如果一个用于下载的 TCP 连接必须与强制 100 Mb/s UDP 下载流量的应用程序共享一条 100 Mb/s 的线路,那么您将测量大约 50 Mb/s 的 TCP 吞吐量并接收大约一半的已发送 UDP 数据包(即 UDP 丢弃率约为 50%)。

      【讨论】:

      • 这更多的是描述将会发生什么,而不是真正的解释为什么会这样。
      猜你喜欢
      • 2013-11-23
      • 2016-07-08
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2011-08-23
      • 2018-03-20
      • 2018-04-22
      相关资源
      最近更新 更多