3

我的应用程序需要将视频数据从服务器逐帧发送到客户端。我在使用 TCP 或 UDP 之间摇摆不定。

从我的测试中,我发现了以下一些结果:

TCP:很容易实现。

UDP:要向客户端发送一个帧(大约 50KB),如果我为每个帧创建 1 个 UDP 包,那么发送总是会丢失帧。所以我必须把每一帧分成很多UDP包。这使我的算法更加复杂,因为 UDP 协议可能会丢失包裹并且包裹可能会乱序交付。另外,如果每个UDP包中的数据长度很大,那么很容易丢失。

我有一些疑问:

  1. 我应该为这种类型的应用程序使用 TCP 还是 UDP。

  2. 如果我想使用UDP进行更快的传输,如何确定每个包中数据的合适长度,在传输过程中不会轻易丢失?(这可能属于网络带宽)?

  3. 根据您的经验,您能估算出 TCP 比 UDP 快多少百分比?

很抱歉在帖子中有这么多问题,但在决定在我的应用程序中使用 TCP 还是 UDP 之前,我需要了解更多细节。

4

3 回答 3

5

由于您的应用程序流式传输视频,您可能需要 UDP。TCP 和 UDP(在这种情况下)之间的一个巨大区别是 UDP 不会像 TCP 那样尝试恢复丢失的数据包。您不希望每次跳过一帧时都重新加载视频,因为这需要很长时间,相反 UDP 只会跳过丢失的帧。(如果您右键单击 Youtube 视频,您可以看到流式传输视频时丢弃的数据包数量)

于 2012-06-18T13:57:21.713 回答
3

在您的情况下,我会使用 TCP ,除非您实际上有手动分段和重新组装 UDP 数据包的实践经验,并且您愿意维护代码中引入的开销(例如重新组装缓冲区并控制这意味着延迟)。

此外,您应该考虑目标网络。它是仅本地主机、局域网、广域网还是互联网。您对网络的控制越少,在往返时间、延迟、数据包丢失等方面偏爱 TCP 的影响就越大。通过控制我的意思是上限或估计跨网段 (#routers) 的数量,数量不同的配置(QoS、带宽限制器、MTU、...)等等。

根据经验,当瞬间(定义如下)所需的所有数据都适合一个数据包(IPv6 中的 MTU 保证为 1280)时,UDP 非常有用。瞬间是时间上的短暂快照,通常具有往返时间的生命周期。UDP 也适用于查询和响应都是小实体的对话。

因此,从这个意义上说,会将 UDP 用于 DNS(简短查询、简短回答)或金融交易数据(在 1 次往返时间的生命周期内只有这么多)或协议元数据,例如参与客户的数量或身份哈希(查询/响应很短,在往返时间内只有少数)。

希望这可以帮助。

编辑:
回答你的问题

  1. UDP(上面列出的限制)
  2. IPv6 提供路径 mtu 检测,您只需使用 PMTU,对于 IPv4,您必须自己动手:
    • 设置IP_DONTFRAG套接字选项
    • 发送一个您认为会通过的数据包
    • 想一个简单的协议让接收者告诉你数据包是否已经被完全接收
    • 如果不是 -> 减小大小,如果是 -> 增加大小
    • 经过几次乒乓球之后,您对 PMTU 有了一个安全的估计(当然您已经可以发送有效载荷数据了)
  3. 如果网络的性质稳定并保持稳定,UDP 将大大优于 TCP 。(相反)当网络的性质不断变化(延迟变化、丢包概率变化等)时,TCP 不会获胜。但是,同样的,网段相距很远且 QoS 为在一些中间段中使用(配置为支持或多或少已知的 TCP 服务而不是“其他”内容的 QoS。

对于一些数字和灵感,您应该查看udt

于 2012-06-18T14:01:03.800 回答
0

除了视频/音频流之外,UDP 还用于具有短消息的低延迟应用程序。

于 2014-03-03T13:03:02.180 回答