我看过帖子说当你将信息分成更小的数据包时TCP的吞吐量会减少。但我正在制作一款真正需要发送微小信息的游戏服务器。这是一个基于回合制的策略游戏,所以我可以用1台服务器支持的玩家数量比延迟更重要,我说我想要了解控制未来项目的延迟。
那么对于大量的小包是UDP更好的选择吗?我确实需要它们是可靠的,所以如果我丢失数据包,我将不得不重新发送...还有什么是UDP数据包的实际丢失率?假设服务器在正常情况下运行它会高达5-10%吗?我应该提到客户端将在移动设备上...他们的丢失率可能远高于个人电脑?
答案 0 :(得分:2)
无论协议是什么 - TCP,UDP或其他任何东西 - 许多较小的数据包的效率将低于较少的较大数据包。每个数据包都有一个固定大小的标题(或者更确切地说,标题具有最小的大小,但在某些情况下可能更大),也可能是一个预告片,因此对于吞吐量有限的网络管道,请填写数据包。标头+预告片+ 1字节有效负载意味着几乎整个容量正由元数据使用,而不是由实际数据使用。在每个数据包中发送更大的数据块可提高效率。也就是说,有时您的应用程序架构没有太多数据要发送,因此当您聚合一堆数据包以便立即发送时,您的选项可能是小数据包或更大的延迟。确定采用哪种方法(或介于两者之间的方法)是设计应用程序的一部分。在您的特定情况下,使用基于回合的方法,如果我正确理解您的意思,后续数据包之间的时间段已经很大(无论如何通过网络时标),所以小数据包可能是最好的路线。如果数据包之间的延迟较大,那么小数据包流对整体吞吐量的影响可能会微不足道。
可靠性肯定会增加复杂性。从编码的角度来看,使用TCP会使可靠性变得“容易”,但是根据网络的实际特性,编写自己的重发UDP代码可能最终成为更好的路径,尤其是当信道的整体可靠性降低时。 TCP在大多数情况下都会恢复,但是由于某些事件而导致的各种超时和调整方式可能会对不太可靠的信道造成问题(许多VPN解决方案基于UDP的主要原因之一)。
预测实际丢失率高度依赖于网络,但您可能正确地认为,遍历LAN - internet - LAN - mobile network
(或某些类似拓扑)的损失明显高于本地LAN丢失。