具有多个线程的TCP与用于游戏服务器的UDP

时间:2018-03-15 16:26:38

标签: sockets tcp udp

我一直在做很多关于游戏服务器的阅读(出于好奇心)。对于快节奏的游戏(第一人称射击游戏),UDP似乎是必须的。

从我收集到的内容来看,当数据包丢失时会发生什么。当TCP尝试重新发送/接收丢失的数据包时,您将获得巨大的延迟,此时游戏的状态将已经超越客户端,使得您等待的数据包在到达时等待很长时间。

如果您禁用Nagle的算法,我在查找为什么这样的东西不起作用时会遇到麻烦,而不是处理UDP数据包:

您打开了多个与服务器的连接

client thread 1 <- packet 1
client thread 2 <- packet 2
client thread 3 <- packet 3
client thread 4 <- packet 4
client thread 5 <- packet 5

那么如果数据包1发生了什么事情并且你在500ms之后收到它会怎么样呢?那么你将拥有数据包2所以它无所谓并且客户端可以丢弃它。我确定我错过了一些关键信息,但我找不到任何关于此的信息。像Zeromq或其他消息库一样,我提议的东西非常简单。

1 个答案:

答案 0 :(得分:0)

建议的技术会有所帮助(并且它确实不需要多个线程,只有多个TCP连接),但它确实假设导致丢包的任何内容只会影响某些TCP连接的数据包而不会他们都是。这可能不是一个非常可靠的假设 - 因为所有TCP连接(可能)通过相同的网络路径,导致TCP流A丢弃数据包的任何故障条件(或带宽不足)都可能导致流B通过E也丢弃数据包 - 然后你又回到了原来的问题。

让多个TCP流处于活动状态允许您解决单个TCP流的严格排序要求(即,如果您知道数据流B中的更新在逻辑上独立于数据流A中的更新,那么为什么强制新的B更新始终等待,直到所有先前发送的A更新成功传输?)。我怀疑你仍然会发现UDP工作得更好的情况。混合方法(对于低延迟数据使用UDP,但对于更具延迟容忍性或复杂数据使用TCP流)可能会产生更好的结果。