什么时候会使用 UDP over TCP?

网络工程 tcp UDP 第 4 层
2022-02-07 01:15:56

似乎 TCP 是一种非常可靠的服务,具有错误检查、端到端交付保证等,而 UDP 是一种无连接的不可靠服务。

应用工程师在什么情况下会使用 UDP over TCP?

4个回答

这是一个经常被问到的问题。下面的答案是另一个站点的最佳答案之一。 https://stackoverflow.com/questions/1099672/when-is-it-appropriate-to-use-udp-instead-of-tcp

在您真的想快速获得另一个服务器的简单答案的情况下,UDP 效果最好。通常,您希望答案在一个响应包中,并且您准备实现自己的协议以提高可靠性或重新发送。DNS 是对这个用例的完美描述。连接设置的成本太高了(然而,DNS 也支持 TCP 模式)。

另一种情况是当您交付可能丢失的数据时,因为新的数据进入将替换以前的数据/状态。天气数据、视频流、股票报价服务(不用于实际交易)或游戏数据浮现在脑海中。

另一种情况是当您管理大量状态并且您希望避免使用 TCP 时,因为操作系统无法处理那么多会话。这是今天罕见的情况。事实上,现在可以使用用户级 TCP 堆栈,以便应用程序编写者可以更精细地控制该 TCP 状态所需的资源。在 2003 年之前,UDP 确实是城里唯一的游戏。

另一种情况是多播流量。UDP 可以多播到多个主机,而 TCP 根本无法做到这一点。

答案很简单:

速度

TCP,由于其连接建立和错误检查机制被认为是一个慢速协议(虽然可靠)。

虽然UDP没有所有这些耗时的机制,因此它更快,不可靠但快速。他只是流式传输数据,并不真正关心接收者是否收到整个消息。

这实际上是一种权衡,速度胜于可靠性,有时您需要快速的数据传输,并且您不关心在此过程中丢失一些数据包,例如实时聊天视频流

但是有时(当然)您需要可靠的数据传输来达到您的目的,以确保接收者收到整个消息,但稍晚一些。就像发送电子邮件或在聊天室聊天一样。

TCP 的可靠性在几个方面是有代价的。

  1. 复杂性:仅 UDP 堆栈比 TCP 堆栈更简单。
  2. 启动时间:UDP 协议可以在一次往返中发送请求并获得响应。TCP 协议需要首先通过 TCP 连接设置过程,这意味着第二次往返。
  3. 行头阻塞:如果 TCP 数据包丢失,所有后续数据包都将保存在网络堆栈中,并且对应用程序不可用,直到重新发送丢失的数据包。
  4. 服务器资源使用,所有缓冲和连接状态跟踪都占用内存和 CPU。
  5. 额外的网络聊天,UDP 可以在两个数据包中传递一个小的请求和响应。TCP 可能会发送更多。

举一些实际的例子:

由于第 1 点,TFTP 使用 UDP,它旨在在非常有限的环境中实现。

由于第 2,4 和 5 点,DNS 使用 UDP。小的请求和响应并不能证明 TCP 的资源使用是合理的。

由于第 3 点,游戏、VOIP 等低延迟实时内容使用 UDP。让整个流被重新传输延迟可能比数据包根本没有到达更糟糕(尽管 TCP 快速重新传输在一定程度上缓解了这种情况)。

一个越来越普遍的原因是使用 udp 来包装无需操作系统许可即可分发的新传输。QUIC 就是一个例子,SCTP over UDP ala webrtc 也是如此。隧道/VPN 也以这种方式工作,因为您不希望在 TCP 中通过隧道传输 TCP,因为两层流量和拥塞控制交互不佳。

UDP 的本地应用程序使用可能是有意义的,除了上面提到的原因,当您希望无序交付时(即避免 TCP 强加的行头阻塞,因为它按顺序交付)。