混合使用TCP和UDP协议

10

我想制作一个多人在线游戏,可以在网络上运行,而不仅仅是像局域网这样的低延迟、高吞吐量环境。

我的游戏有一些网络方面需要处理,其中UDP明显更适合,比如传输各个玩家的位置和速度等信息。这些数据必须尽快接收到,重新发送丢失的数据包是没有用的,因为一旦客户端收到这些数据,它们已经失效了。有些数据包被丢弃是完全可以接受的。

然而,我的游戏还有其他一些方面,严格要求按顺序保证数据传递。对于大型数据的自动分段(将数据拆分成小块再组合)也非常有用。TCP似乎可以做到这一切。除非数据严格按顺序传递并且没有数据包丢失,否则数据是没有任何用处的。在某些情况下,这种类型的数据的延迟不可避免地会受到影响。

因此,我不想在UDP之上实现类似TCP的功能(使用数据缓冲区、标记数据包的编号以确定它们的顺序、数据包确认系统),因为这将是很多工作,需要确保其正确和高效。我想同时使用TCP和UDP。

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


一切都在争夺带宽。 - Mat
1
@Mat 嗯,是的,但我听说TCP上的100kb/s或UDP上的100kb/s将具有比每个50 kb/s更高的吞吐量和更低的延迟。 - newprogrammer
1
@newprogrammer 你是从哪里得到这个消息的?请提供引用。 - user207421
4个回答

2

0
通常情况下,使用TCP不会增加UDP数据包丢失的速率。相反,高容量的UDP流量会限制TCP流量,因为一个非常恶意的UDP实现可能会限制整个网络带宽,而TCP会尝试最大化感知带宽的吞吐量。因此,同时使用它们不应该真正伤害您,只要您不在一个站点上持续地击中可用带宽。超出这个范围可能会产生一些缓冲延迟,这将对UDP或TCP应用程序造成损害,如果它们对延迟敏感的话。希望这有所帮助。

0

如果你遇到了困难,我建议在你和网络代码的内部之间增加一个额外的抽象层。尝试使用像"RakNet"这样的多人网络库。


我无法负担RakNet。 - newprogrammer
@newprogrammer 你的收入超过了100k吗?如果没有,这个是免费的。http://en.wikipedia.org/wiki/Raknet - awiebe

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

这更多是对将要发生的事情的描述,而不是真正解释为什么会这样。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接