1

我看过帖子说,当您将信息分解成更小的数据包时,TCP 的吞吐量会降低。但我正在制作一个真正只需要发送少量信息的游戏服务器。这是一款回合制策略游戏,所以我可以用 1 台服务器支持的玩家数量比延迟更重要,我已经说过无论如何我都想学习如何控制未来项目的延迟。

那么对于很多小数据包来说,UDP 是更好的选择吗?我确实需要它们是可靠的,所以如果我丢失数据包,我将不得不重新发送......另外,UDP数据包的实际丢失率是多少?假设服务器在正常情况下运行会高达 5-10% 吗?我应该提到客户端将在移动设备上......他们的丢失率可能比PC高得多?

4

1 回答 1

2

无论是什么协议——TCP、UDP 或其他任何协议——许多较小的数据包将比较少的较大数据包效率低。每个数据包都有一个固定大小的标头(或者更准确地说,一个具有最小尺寸但在某些情况下可能更大的标头)以及可能还有一个尾部,因此对于吞吐量有限的网络管道,用以下数据包填充它标头 + 尾标 + 1 字节有效负载意味着几乎所有容量都被元数据使用,而不是实际数据。在每个数据包中发送更大的数据块可以提高效率。也就是说,有时您的应用程序架构没有太多数据要发送,因此您可以选择小数据包或更大的延迟,同时聚合一堆数据包以一次发送。弄清楚采取哪种方法(或介于两者之间的方法,甚至)是设计应用程序的一部分。在您的特定情况下,使用基于回合的方法,如果我正确理解您的意思,那么后续数据包之间的时间段已经很重要(无论如何按网络时间尺度),所以小数据包可能是最佳路线。由于数据包之间的延迟较大,您的小数据包流对整体吞吐量的影响可能可以忽略不计。

可靠性无疑增加了复杂性。从编码的角度来看,使用 TCP 会使可靠性变得“容易”,但根据网络的实际特性,编写自己的重新发送 UDP 代码最终可能是更好的路由,尤其是当通道的整体可靠性降低时。TCP 在大多数情况下会恢复,但由于某些事件而导致的各种超时和调整方式可能会在不太可靠的通道上出现问题(许多 VPN 解决方案基于 UDP 的主要原因之一)。

预测实际丢失率高度依赖于网络,但您可能是正确的,遍历LAN - internet - LAN - mobile network(或某些类似拓扑)的丢失明显高于本地 LAN 丢失。

于 2012-11-13T16:31:50.613 回答