2014-08-30 85 views
0

我正在制作一个实时应用程序。我不能多说,但它是一个在线实时应用程序,需要尽可能少的延迟。我正在使用套接字,没有图书馆。我也需要完整的bandwitdh。我应该使用TCP还是UDP?我不介意编程多一点让UDP工作。提前致谢。C++游戏应用程序UDP vs TCP

+1

实际上在这里回答 - 既使用udp,也不使用重要更新的tcp,重要的使用tcp – 2014-08-30 23:48:40

回答

1

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

TCP是有状态会话。如果您同时连接了很多客户端,则可能会造成端口耗尽。如果客户端频繁地连接和断开连接,建立和拆除TCP会话会增加延迟,CPU负载和带宽。如果您的客户端连接或多或少是永久性的,并且没有太多客户端同时连接,则TCP只比UDP稍差。

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

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

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

0

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

UDP/IP实现了一个数据报 - 也就是说,它希望从A到B发送一个特定的数据包(大小有限)。如果一个数据报丢失,就没有内建的方法来重发它。如果没有丢失,UDP数据包将被丢弃。

UDP缺乏保证实际上是一种好处。假设你正在建模类似“健康”的东西 - 一个怪物在服务器上攻击你两次。您的健康从90下降到78,然后下降到60.使用TCP/IP,您必须首先收到78 - 所以如果该数据包被丢弃,它必须重新发送,并按顺序 - 因为这里有一个数据流。但你真的不在乎 - 你的健康现在是60岁;你想尝试获得60分。如果78岁的时候你的健康已经下降到60岁,谁会在乎--78岁的历史并且不再重要。你需要健康说60.

TCP也是一个好处 - 你不想在游戏聊天中使用UDP。你希望所有对你说的话都是为了你。

TCP还增加了拥塞控制;有了UDP,你必须实现它,或者不知怎么的注意你扼杀了UDP,这样它就不会使服务器和播放器之间的未知网络特性饱和。

所以是的,你想使用“两个”;但“重要性”并不完全是您需要瞄准的标准。使用TCP/IP传送数据流,轻松实现拥塞控制等。使用UDP实时状态以及其他情况下,流抽象会干扰目的而不是与其对齐。

0

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

  • 你有单一数据源在客户端
  • 发送小消息,但担心自己的潜伏期
  • 您的应用程序可以处理从时间失去消息时间
  • 您的应用程序可以处理接收消息乱序

UDP可能是一个更好的选择。 UDP也适用于将数据发送到多个recipiemts。

在另一方面,如果任一

  • 如果上述任何不属实
  • 如果您的应用程序发送尽可能多的数据尽可能快地
  • 您有多个连接,以维持

你应该使用TCP。

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

如果您打算通过TCP传输大量数据,您应该考虑bandwidth delay product的影响。尽管您似乎更关心延迟而不是吞吐量,但您可能会对此感兴趣。