我知道,我知道。之前已经多次询问过这个问题。但我现在花了一个小时用谷歌搜索而没有找到我要找的东西,所以我会再次问它并提及我的背景以及让我难以做出的决定: 我正在为一个游戏编写服务器,其中响应时间非常重要并且数据包丢失时不时出现问题。
鉴于此以及我作为服务器主要必须向许多不同的客户端发送相同数据的事实,显而易见的答案是UDP。
当我遇到这个时,我已经开始编写代码了:
在某些应用程序中,TCP比UDP更快(吞吐量更高)。 当进行大量相对于MTU大小的小写时,就是这种情况。例如,我读了一个实验,其中通过以太网(1500字节MTU)发送300字节数据包流,TCP比UDP快50%。
在我的情况下,我发送的信息单元是<100字节,这意味着每个信息单元都适合一个UDP数据包(这对我来说非常愉快,因为我不需要处理碎片)和UDP为了我的目的似乎更容易实现,因为我不需要处理大量的单一连接,但我的首要任务是最小化之间的时间
client sends something to server
和
client receives response from server
所以我愿意选择TCP,如果这是更快的方式。 遗憾的是,我无法找到有关上述案例的更多信息,这就是我要问的原因:在我的案例中哪个协议会更快?
答案 0 :(得分:5)
UDP对于您的用例仍然会更好。
TCP和游戏的主要问题是丢弃数据包时会发生什么。在UDP中,这是故事的结尾;数据包被丢弃,生命继续与下一个数据包完全一样。使用TCP,TCP流上的数据传输将停止,直到丢弃的数据包成功重新传输,这意味着接收器不仅不会按时接收丢弃的数据包,而且后续数据包也将被延迟 - 最有可能它们都将被延迟在重新发送丢弃的数据包完成后立即收到。
可能对你不利的TCP的另一个特点是它的自动带宽控制 - 即TCP会将丢弃的数据包解释为网络拥塞的指示,并将作为响应回拨其传输速率;在大量数据包丢失的情况下,可能会将其拨到接近零的位置。如果原因确实是网络拥塞,这可能是有用的,但是由于瞬时网络错误(例如用户拔出他的以太网电缆几秒钟)也可能发生丢包,并且您可能不希望以这种方式处理这些问题;但是使用TCP,你别无选择。
UDP的一个缺点是,通常需要特殊处理才能通过用户的防火墙获取传入的UDP数据包,因为防火墙通常配置为默认阻止传入的UDP数据包。但对于动作游戏来说,这个问题可能值得dealing with。
请注意,它不是一个严格的/或选项;你总是可以把你的游戏写成两者 TCP和UDP,并同时使用它们,或让程序和/或用户决定使用哪一个。这样一来,如果一种方法效果不好,你可以简单地使用另一种方法,而且只需要两倍的工作量来实现。 :)
在某些应用程序中,TCP比UDP更快(吞吐量更高)。这个 是相对于MTU大小进行大量小写操作的情况。 例如,我读了一个300字节流的实验 数据包通过以太网(1500字节MTU)发送,TCP为50% 比UDP快。
如果这对您来说是一个问题,您可以通过将多个消息放在一个较大的UDP数据包中来获得UDP协议中相同的效率增益。即,不是发送3个100字节的数据包,而是将这3个100字节的消息放在一个300字节的数据包中。 (当然,您需要确保接收程序能够正确地解释这个更大的数据包)。无论如何,这就是TCP层在这里所做的一切;在发送数据包之前,将尽可能多的数据放入传出的数据包中,然后再发送出去。