混合 TCP 和 UDP

Posted

技术标签:

【中文标题】混合 TCP 和 UDP【英文标题】:Mixing TCP and 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 你在哪里“听说”过?请引用。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

我买不起 RakNet @newprogrammer 你的收入是否超过 10 万?如果没有,它是免费的。 en.wikipedia.org/wiki/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%)。

【讨论】:

这更多的是描述将会发生什么,而不是真正的解释为什么会这样。

以上是关于混合 TCP 和 UDP的主要内容,如果未能解决你的问题,请参考以下文章

iOS与EV3混合机器人编程系列之四iOS_WiFi_EV3_Library 剖析之中的一个:WiFi UDP和TCP

SocketServer模块中的几种类

3C++封装与移植训练

使用C与C++混合编程封装UDP协议

腾讯QQ使用的UDP哪些端口

TCP/IP详解 笔记九