mobile - 使用 TCP 的小数据包不是个好主意吗?使用 UDP 更好

标签 mobile tcp udp client-server

我看到一些帖子说,当您将信息分解成更小的数据包时,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/

相关文章:

css - 为什么在 col-sm 和 col-md 等正常工作时不进行协作?

android - tabBarIcon 未显示在 createBottomTabNavigator 上

c - "On demand"服务器中全局结构的共享内存段

c - c中的持久tcp套接字连接

mysql - 与 MySQL 4.1.24 相关的网站连接错误

sockets - 捕获Web Audio API数据以进行套接字编程

javascript - Ionic - 年龄数字旋转器组件

node.js - 您必须在 Node.js 中关闭 UDP (dgram) 客户端还是可以重用它?

.net - 像 UDP 一样广播,具有 TCP 的可靠性

php - 适用于 iPhone 和 Android 的图形库