读完之后对于大量数据实时游戏,UDP是否仍然优于TCP?,我想知道同时使用TCP和UDP是否有意义,但是对于不同的事物:
TCP,用于发送很少发送的信息,但应确保可靠到达。
例如分数更新,玩家的名字,甚至是游戏世界中灯光的开/关状态。UDP用于传输不断更新的信息,有时可能会丢失,因为总是有更新的信息出现。
例如位置,旋转度等
这是一个合理的主意吗?可能的缺点是什么?
有更好的方法来解决这个问题吗?
读完之后对于大量数据实时游戏,UDP是否仍然优于TCP?,我想知道同时使用TCP和UDP是否有意义,但是对于不同的事物:
TCP,用于发送很少发送的信息,但应确保可靠到达。
例如分数更新,玩家的名字,甚至是游戏世界中灯光的开/关状态。
UDP用于传输不断更新的信息,有时可能会丢失,因为总是有更新的信息出现。
例如位置,旋转度等
这是一个合理的主意吗?可能的缺点是什么?
有更好的方法来解决这个问题吗?
Answers:
由于这两个协议之间的争用,这会导致UDP的数据包丢失-请记住,不能保证UDP传递,而TCP可以保证。当UDP受苦时,更多的TCP数据包将通过-TCP导致UDP数据包丢失。(历史性的)想法是,路由器基础结构更倾向于TCP而不是UDP,尽管我怀疑在这一后期阶段这是否仍然正确。
我认为您最好找到一种可以在游戏等中使用的面向连接的UDP协议,该协议为您提供TCP的一些优点,而且没有缺点。有一些这样的方法,通常会在白皮书中详细说明每个概念。
其中的一个示例是开源Enet库,其主要功能是可选的,可靠的,按顺序的UDP数据包传递。
这是Sam Jansen在gafferongames.com上发表的评论中的一句话:
作为网络研究人员而不是游戏开发人员,永远不要同时使用TCP和UDP的结论似乎有些强烈。只有发送太多数据,TCP才会丢失数据包;在某些方面就像您要发送的UDP数据一样。区别在于您无法直接控制TCP的发送速率,这对您是隐藏的。
如果您只需要发送一些可靠的数据,而又不想担心重传和实现可靠的协议,并且知道速率会很低,那么使用TCP和UDP都不会有任何问题。
两者之间的关系并没有那么复杂:TCP仅增加其发送速率(如果有要发送的数据),直到丢失数据包为止,在这种情况下,它回拨其速率,然后再次开始提高速率(这时间更慢)。当它的速率增加导致数据包丢失时,它很可能也击中任何其他数据流,包括UDP数据包。
本文UDP数据包丢失的特点:TCP流量的影响通过一次打开多个TCP连接,并充斥数据网络得到了它的结果。这导致拥塞,随后是全局同步,这两者都会导致数据包丢失。显然,游戏客户端不会一次打开十几个连接并向网络中填充数据,因此您的结果将有所不同。
要回答您的问题:
我想知道同时使用TCP和UDP是否有意义,但是对于不同的事情[...]
是的,假设您不超出带宽限制,这是可以接受的事情。
- TCP,用于发送很少发送的信息,但应确保可靠到达。例如分数更新,玩家的名字,甚至是游戏世界中灯光的开/关状态。
当同时使用TCP和UDP时,您应该始终希望通过UDP发送尽可能多的数据,而通过TCP发送尽可能少的数据。
现在,我问你一个问题:是否真的有必要通过TCP发送比分,球员的姓名和指示灯状态?虽然确实需要最终接收这些数据,但是是否确实需要严格按顺序并且仅一次接收这些数据呢?
可能不是。
UDP在这些情况下可以正常工作,而Quake 3是一个很好的例子。
那么,什么是将TCP与UDP一起使用的好例子呢?好吧,想想一个游戏的聊天框。此聊天框的更新(即,新的文本行)需要可靠且严格按顺序发送。因此,TCP非常适合。