首页 文章

混合TCP和UDP

提问于
浏览
7

我想制作一个在互联网上运行的多人游戏,而不仅仅是局域网等低延迟,高吞吐量的环境 .

我的游戏中有一些网络方面,UDP显然更适合,比如传输有关各种玩家的位置和速度的信息 . 必须尽快接收此数据,并且重新发送丢弃的数据包将无济于事,因为该数据在到达客户端时无关紧要 . 删除某些数据包是完全可以的 .

但是,我的游戏还有一些其他方面严格要求按顺序保证交付 . 数据包的自动分段(分解和重新组合在一起)也非常有用 . 似乎TCP完成了所有这些 . 除非严格按顺序且没有丢失数据包,否则数据根本没用 . 在某些情况下,延迟将不可避免地受到此类数据的影响,但这是不可避免的 .

因此,不是在UDP之上实现类似TCP的功能,(使用数据缓冲区,用数字标记数据包以确定它们的顺序,数据包确认系统),这将是确保其正常和有效工作的大量工作,我想同时使用TCP和UDP .

但是,我听说如果你同时使用它们,TCP和UDP可以互相争夺带宽,并且使用TCP会增加UDP丢弃数据包的速率 . 这是真的吗?在混合使用这两个协议时,还有其他问题需要处理吗?

4 回答

  • 3

    如果您遇到困难,我建议在您和网络代码的内容之间添加一个额外的抽象层 . 尝试像“ RakNet ”这样的多人网络库 .

  • 0

    您可以检查http://www.zeromq.org/,一个很好的开源智能传输层库 .

  • 0

    通常 - 使用TCP不会增加UDP数据包的丢弃率 . 它更倾向于其他方式 - 高容量UDP流量会限制TCP流量,因为真正流氓的UDP实现可能会限制整个网络带宽 - 而TCP会尝试最大化感知带宽的吞吐量 . 所以一起使用它们不应该真的伤害你,只要你不是最终在一个站点持续点击可用的黑白 . 超出这个范围可能会导致一些缓冲延迟 - 如果它们对延迟敏感,则会损害UDP或TCP应用程序 . 希望有所帮助 .

  • 1

    尝试使用iperf,您将看到如果一个用于下载的TCP连接必须与强制100 Mb / s UDP下载流量的应用程序共享100 Mb / s线路,那么您将大致测量50 Mb / s的TCP吞吐量并接收约发送的UDP数据包数量的一半(即UDP丢弃率约为50%) .

相关问题