tcp或udp用于游戏服务器?

Las*_*eed 3 sockets udp tcp

我知道我知道.之前已经多次询问过这个问题.但是我现在花了一个小时用谷歌搜索而没有找到我要找的东西所以我会再次问它并提及我的背景以及让我难以做出的决定:我正在为一个响应时间很长的游戏编写服务器重要丢包飘飞是没有问题的.

鉴于此以及我作为服务器主要必须将相同数据发送到许多不同客户端的事实,显而易见的答案是UDP.

当我遇到这个时,我已经开始编写代码了:

在某些应用中,TCP比UDP更快(更好的吞吐量).当进行大量相对于MTU大小的小写时,就是这种情况.例如,我读了一个实验,其中通过以太网(1500字节MTU)发送300字节数据包流,TCP比UDP快50%.

在我的情况下,我发送的信息单元是<100字节,这意味着每个信息单元都适合一个UDP数据包(这对我来说非常愉快,因为我不需要处理碎片)并且UDP似乎更容易为了我的目的实现,因为我不需要处理大量的单一连接,但我的首要任务是最小化之间的时间

client sends something to server
Run Code Online (Sandbox Code Playgroud)

client receives response from server
Run Code Online (Sandbox Code Playgroud)

所以我愿意选择TCP,如果这是更快的方式.不幸的是,我无法找到有关上述引用案例的更多信息,这就是我要问的原因:在我的案例中哪个协议会更快?

Jer*_*ner 5

对于您的用例,UDP仍然会更好.

TCP和游戏的主要问题是丢弃数据包时会发生什么.在UDP中,这就是故事的结尾; 数据包被丢弃,生命继续与下一个数据包完全一样.使用TCP,TCP流上的数据传输将停止,直到丢弃的数据包成功重新传输,这意味着接收器不仅不会按时接收丢弃的数据包,而且后续数据包也将被延迟 - 最有可能它们都将被延迟在重新发送丢弃的数据包完成后立即收到一个突发.

可能对您有用的TCP的另一个特性是它的自动带宽控制 - 即TCP会将丢弃的数据包解释为网络拥塞的指示,并将作为响应回拨其传输速率; 在大量数据包丢失的情况下,可能会将其拨到接近零的位置.如果原因确实是网络拥塞,这可能是有用的,但是由于瞬时网络错误(例如用户拔出他的以太网电缆几秒钟)也可能发生丢包,并且您可能不希望以这种方式处理这些问题; 但是使用TCP,你别无选择.

UDP的一个缺点是,通常需要特殊处理才能通过用户的防火墙获取传入的UDP数据包,因为防火墙通常配置为默认阻止传入的UDP数据包.但是对于动作游戏来说,可能值得处理这个问题.

请注意,它不是一个严格的/或选项; 你总是可以写你的游戏结束工作 TCP和UDP,并且或者同时使用它们,或让程序和/或用户决定使用哪一个.这样,如果一种方法效果不好,您可以简单地使用另一种方法,并且只需要两倍的工作量来实现.:)

在某些应用中,TCP比UDP更快(更好的吞吐量).当进行大量相对于MTU大小的小写时,就是这种情况.例如,我读了一个实验,其中通过以太网(1500字节MTU)发送300字节数据包流,TCP比UDP快50%.

如果这对您来说是一个问题,您可以通过将多个消息放在一个较大的UDP数据包中来获得UDP协议中相同的效率增益.即,不是发送3个100字节的数据包,而是将这3个100字节的消息放在一个300字节的数据包中.(当然,您需要确保接收程序能够正确地解释这个更大的数据包).无论如何,这就是TCP层在这里所做的一切; 在发送数据包之前,将尽可能多的数据放入可用且可以适合的传出数据包中.