似乎 TCP 是一种非常可靠的服务,具有错误检查、端到端交付保证等,而 UDP 是一种无连接的不可靠服务。
应用工程师在什么情况下会使用 UDP over TCP?
似乎 TCP 是一种非常可靠的服务,具有错误检查、端到端交付保证等,而 UDP 是一种无连接的不可靠服务。
应用工程师在什么情况下会使用 UDP over TCP?
这是一个经常被问到的问题。下面的答案是另一个站点的最佳答案之一。 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 点,TFTP 使用 UDP,它旨在在非常有限的环境中实现。
由于第 2,4 和 5 点,DNS 使用 UDP。小的请求和响应并不能证明 TCP 的资源使用是合理的。
由于第 3 点,游戏、VOIP 等低延迟实时内容使用 UDP。让整个流被重新传输延迟可能比数据包根本没有到达更糟糕(尽管 TCP 快速重新传输在一定程度上缓解了这种情况)。
一个越来越普遍的原因是使用 udp 来包装无需操作系统许可即可分发的新传输。QUIC 就是一个例子,SCTP over UDP ala webrtc 也是如此。隧道/VPN 也以这种方式工作,因为您不希望在 TCP 中通过隧道传输 TCP,因为两层流量和拥塞控制交互不佳。
UDP 的本地应用程序使用可能是有意义的,除了上面提到的原因,当您希望无序交付时(即避免 TCP 强加的行头阻塞,因为它按顺序交付)。