我应该使用TCP还是UDP?

3
我的应用程序需要从服务器逐帧发送视频数据到客户端。我在TCP和UDP之间犹豫不决。
从我的测试中,我发现以下结果:
TCP:非常容易实现。
UDP:要将一帧(约50KB)发送到客户端,如果为每个帧创建1个UDP包,则发送始终会丢失帧。因此,我必须将每个帧分成多个UDP包。这使得我的算法更加复杂,因为UDP协议可能会丢失包并且包可以无序传递。另外,如果每个UDP包中的数据长度较大,则很容易丢失。
我有一些问题:
1. 我应该在这种类型的应用程序中使用TCP还是UDP?
2. 如果我想使用UDP进行更快的传输,如何确定每个包中的合适数据长度,以便在传输时不容易丢失?(这可能属于网络带宽)?
3. 根据您的经验,您能估计TCP比UDP快多少百分比吗?
抱歉在一篇文章中提出了这么多问题,但在决定在我的应用程序中使用TCP还是UDP之前,我需要了解更多详细信息。

3
UDP通常用于音频和视频传输,因此对于您的应用程序,可能更适合使用UDP。参考链接:http://www.skullbox.net/tcpudp.php - theBigChalk
3个回答

5

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


1
抱歉,我不知道具体的百分比,但你可以看看https://dev59.com/5HVD5IYBdhLWcg3wOo5h以获取更多关于速度差异的信息。 - pennetti

3
在您的情况下,我建议使用TCP,除非您实际上有手动分割和重新组装UDP数据包的经验,并且愿意在代码中引入的开销(例如具有重新组装缓冲区并控制这种情况下延迟)之上进行维护。
此外,您应该考虑目标网络。它是仅限于本地主机、局域网、广域网甚至是互联网。您对网络的控制越少,TCP的往返时间、延迟、丢包等方面的影响就越大。所谓的控制是指跨越网络段(路由器数)、不同配置(QoS、带宽限制器、MTU等)的上界或估计等等。
作为经验法则,当所有必要的即时数据(下文定义)适合一个数据包时(IPv6中的MTU保证为1280),UDP非常有效。即时是一个短时间内的快照,通常具有回传时间的寿命。UDP也非常适用于查询和响应都是小实体的对话。
因此,在这种意义上,我会将UDP用于DNS(短查询,短答案),或者金融交易数据(在1个往返时间内只有那么多次),或协议元数据,例如参与客户端的数量或标识哈希(查询/响应短且在往返时间内只有少数几个)。
希望这可以帮到您。
编辑: 回答您的问题。
  1. UDP(上述限制)
  2. IPv6提供路径MTU检测,您只需使用PMTU。对于IPv4,您需要自己编写:
    • 设置IP_DONTFRAG套接字选项
    • 发送一个您认为可以通过的数据包
    • 考虑一种简单的协议,允许接收方告诉您是否已完全接收数据包
    • 如果没有->减小大小,如果是->增加大小
    • 经过几次ping-pong后,您就有了PMTU的安全估计(当然,您可以同时发送有效载荷数据)
  3. 如果网络的性质稳定并保持稳定,UDP将大大优于TCP。 (相反地)当网络的性质不断变化(延迟变化、数据包丢失概率变化等)时,TCP将不会获胜。 但是,同样需要注意的是,当网络段距离非常远并且在某些中间段中使用QoS(配置为支持更多或更少已知的TCP服务而不是“其他”内容的QoS)时,UDP将不会获胜。

如果您需要一些数字和灵感,可以查看udt


1
什么?你会在金融信息中使用UDP,但在有实时限制的视频流中使用TCP?这与最佳实践非常背道而驰。 - Oleksi
2
不,我在这种情况下也会使用UDP,前提是我对编解码器有控制权。而且我认为与金融数据相比,视频流媒体在延迟方面更加宽松,只要保持恒定即可。 - hroptatyr

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接