我应该使用TCP还是UDP? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该使用TCP还是UDP? [关闭]相关的知识,希望对你有一定的参考价值。

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

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

TCP:非常容易实现。

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

我有一些问题:

  1. 我应该在这种类型的应用程序中使用TCP或UDP。
  2. 如果我想使用UDP进行更快的传输,如何确定每个包中的数据长度在传输时不会轻易丢失? (这可能属于网络带宽)?
  3. 根据您的经验,您能估算出TCP速度更快的UDP百分比吗?

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

答案

在你的情况下,我会使用TCP,除非你真的有手动分段和重新组装UDP数据包的实践经验,并且你愿意保持代码中引入的开销(比如重新组装缓冲区并控制这暗示的延迟)。

此外,您应该考虑目标网络。它只是localhost,LAN,WAN甚至互联网。您对网络的控制越少,在往返时间,延迟,数据包丢失等方面支持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是在一些中间段中使用(QoS被配置为支持或多或少已知的TCP服务而不是“其他”的东西。

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

另一答案

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

另一答案

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

以上是关于我应该使用TCP还是UDP? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 TCP 还是 UDP 数据包来控制无人机?

计算机网络——网页上(或其他情况下)的视频传输是基于TCP还是UDP

如何使用 Nmap 检索 TCP 和 UDP 端口? [关闭]

Rust 中同时使用 UDP 和 TCP 协议 [关闭]

如何打开一个UDP端口? [关闭]

TCP/UDP 和以太网 MTU 分片