我看到一些帖子说,当您将信息分解成更小的数据包时,TCP 的吞吐量会降低。但我正在制作一个真正只需要发送少量信息的游戏服务器。这是一款回合制策略游戏,所以我可以用 1 个服务器支持的玩家数量比延迟更重要,我说过无论如何我想了解控制延迟以用于 future 的项目。
那么对于很多小数据包来说,UDP 是更好的选择吗?我确实需要它们是可靠的,所以如果我丢失数据包,我将不得不重新发送......另外,UDP 数据包的实际丢失率是多少?假设服务器在正常情况下运行,它会高达 5-10% 吗?我应该提到客户端将在移动设备上...他们的丢失率可能比 pc 高得多?
最佳答案
无论是什么协议(protocol) - TCP、UDP 或任何其他协议(protocol) - 许多较小的数据包都比较少的较大数据包效率低。每个数据包都有一个固定大小的 header (或者更恰本地说,一个具有最小尺寸但在某些情况下可能更大的 header )并且可能还有一个尾部,因此对于吞吐量有限的网络管道,用以下数据包填充它header + trailer + 1 byte payload 意味着几乎整个容量都被元数据使用,而不是实际数据。在每个数据包中发送更大的数据 block 可以提高效率。也就是说,有时您的应用程序架构只是没有太多数据要发送,因此您的选择要么是小数据包,要么是在您聚合一堆数据包一次发送时增加延迟。弄清楚采用哪种方法(或什至介于两者之间)是设计应用程序的一部分。在您的特定情况下,使用基于回合的方法,如果我正确理解您的意思,则后续数据包之间的时间段已经很重要(无论如何按网络时间尺度),因此小数据包可能是最佳路线。由于数据包之间的延迟较大,您的小数据包流对整体吞吐量的影响可能可以忽略不计。
可靠性当然会增加复杂性。从编码的角度来看,使用 TCP 会使可靠性变得“容易”,但根据网络的实际特性,编写自己的重新发送 UDP 代码可能最终成为更好的路由,尤其是当 channel 的整体可靠性降低时。在大多数情况下,TCP 会恢复,但由于某些事件导致的各种超时及其调整方式可能会在不太可靠的 channel 上出现问题(许多 VPN 解决方案基于 UDP 的主要原因之一)。
预测实际丢失率高度依赖于网络,但您可能是对的,遍历 LAN - internet - LAN - mobile network
(或某些类似拓扑)的丢失明显高于本地 LAN 丢失.
关于mobile - 使用 TCP 的小数据包不是个好主意吗?使用 UDP 更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13364045/