C ++游戏应用程序UDP与TCP

时间:2014-08-30 23:45:32

标签: c++ sockets networking tcp udp

我正在进行实时申请。我不能说太多,但它是一个在线实时应用程序,需要尽可能少的延迟。我正在使用套接字,没有库。我还需要完整的bandwitdh。我应该使用TCP还是UDP?我不介意编程更多以使UDP工作。提前谢谢。

3 个答案:

答案 0 :(得分:1)

取决于客户端连接的性质。

TCP是有状态会话。如果您同时连接了许多客户端,则可能会导致端口耗尽。如果客户端经常连接和断开连接,建立和拆除TCP会话会增加延迟,CPU负载和带宽。如果您的客户端连接或多或少是永久性的,并且没有太多客户端同时连接,则TCP仅略差于UDP。

UDP更适合低延迟通信。但请注意NAT防火墙 - 并非所有防火墙都能够或设置为UDP地址映射。

另请注意,TCP是一个流,因此不提供消息打包。您的应用程序必须从TCP流汇集数据包,并带来额外的开销。

根据定义,UDP是一个完整的消息,即作为已发送的数据包到达。请注意,交付不受保证,应用程序可能需要提供确认和重发层。

答案 1 :(得分:0)

TCP / IP实现流;也就是说,它希望在另一端向收件人发送通过它发送的所有内容。为此,它添加了许多协议来处理丢失部分流的情况 - 这样它将重试发送,跟踪它仍然需要发送多少字节(带窗口)等。 TCP / IP连接用于添加流的保证;如果TCP / IP无法传送数据包且无法恢复,则连接将断开。

UDP / IP实现了一个数据报 - 也就是说,它希望从A到B发送一个特定的数据包(数量有限)。如果数据报丢失,则没有内置的重发方式它。如果它没有丢失,则只丢弃UDP数据包。

UDP缺乏保证实际上是一个好处。假设您正在建模类似于"健康" - 一个怪物在服务器上攻击你两次。您的健康状况从90降至78,然后降至60.使用TCP / IP,您必须先收到78 - 所以如果该数据包被丢弃,则必须重新发送,并按顺序 - 因为这里有一个流。但你真的不在乎 - 你现在的健康状况是60岁;你想尝试60越过。如果在你的健康状况达到60岁的时候78岁就被摔掉了,谁在乎 - 78岁的历史并不再重要。你需要健康才能说60。

TCP也是一个好处 - 你不想在游戏聊天中使用UDP。你希望你说的一切都按顺序来找你。

TCP还增加了拥塞控制;使用UDP,您必须实现它,或者以某种方式注意您限制UDP,使其不会使服务器和播放器之间的未知网络特性饱和。

所以是的,你想使用"两者&#34 ;;但是"重要性"并不是您需要的标准。使用TCP / IP传输流,轻松拥塞控制等。使用UDP进行实时状态,以及流抽象干扰目的而不是与之对齐的其他情况。

答案 2 :(得分:0)

UDP和TCP在延迟方面都有好处。如果以下所有都是真的:

  • 您的客户端中只有一个数据源
  • 发送小邮件但担心延迟
  • 您的应用程序可以不时处理丢失的消息
  • 您的应用程序可以处理无序接收消息

UDP可能是更好的选择。 UDP也适用于向多个收件人发送数据。

另一方面,如果是

  • 如果上述任何一种情况属实,
  • 如果您的应用程序尽可能快地发送尽可能多的数据
  • 您有多个要维护的连接

你绝对应该使用TCP。

This post会告诉你为什么UDP不一定是最快的。

如果您计划通过TCP传输大量数据,则应考虑bandwidth delay product的影响。虽然您似乎更担心延迟而不是吞吐量,但您可能会感兴趣。