用于一般协议消息交换,可以容忍一定的丢包。UDP比TCP效率高多少?


当前回答

在一些应用程序中,TCP比UDP更快(更好的吞吐量)。

当执行大量相对于MTU大小的小写操作时,就会出现这种情况。例如,我读到一个实验,在这个实验中,一个300字节的数据包流通过以太网发送(1500字节MTU), TCP比UDP快50%。

这是因为TCP将尝试缓冲数据并填充整个网段,从而更有效地利用可用带宽。

另一方面,UDP将数据包立即放到网络上,从而使大量的小包阻塞网络。

你可能不应该使用UDP,除非你有非常具体的原因这样做。特别是因为你可以通过禁用Nagle算法来让TCP和UDP具有相同的延迟(例如,如果你正在传输实时传感器数据,而你不担心网络被大量的小包阻塞)。

其他回答

网络的设置对于任何测量都是至关重要的。如果您通过本地机器上的套接字或与世界的另一端进行通信,则会产生巨大的差异。

我想在讨论中补充三点:

您可以在这里找到一篇关于TCP与UDP的非常好的文章 游戏开发的背景。 此外,iperf (jperf增强iperf与GUI)是一个 这是一个很好的工具,可以通过测量来回答你的问题。 我用Python实现了一个基准测试(参见这个SO问题)。在平均10^6次迭代中,UDP发送8字节的差异大约是1-2微秒。

具有容错功能

你是说“容忍损失”吗?

基本上,UDP不是“容错”的。你可以发送100个包给某人,他们可能只收到其中的95个包,有些包的顺序可能是错误的。

对于视频流媒体和多人游戏之类的东西,错过一个数据包总比延迟它后面的所有其他数据包要好,这是显而易见的选择

然而,对于大多数其他事情,丢失或“重新排列”的数据包是至关重要的。你必须编写一些额外的代码来运行在UDP之上,以便在遗漏内容时重试,并强制执行正确的顺序。这在某些地方会增加一点开销。

值得庆幸的是,一些非常非常聪明的人已经做到了这一点,他们称之为TCP。

可以这样想:如果一个数据包丢失了,您是希望尽快获得下一个数据包并继续(使用UDP),还是您实际上需要丢失的数据(使用TCP)。开销并不重要,除非你在一个真正的边缘情况下。

我们已经做了一些工作,让程序员可以同时享受这两个世界的好处。

SCTP

它是一个独立的传输层协议,但它可以用作在UDP上提供附加层的库。通信的基本单位是消息(映射到一个或多个UDP包)。有内置的拥塞控制。该协议有许多旋钮和旋钮可以打开

按顺序传递信息 自动重传丢失的消息,与用户定义的参数

如果您的特定应用程序需要其中任何一个。

这样做的一个问题是建立连接是一个复杂的(因此是缓慢的过程)

其他类似的东西

https://en.wikipedia.org/wiki/Reliable_User_Datagram_Protocol

还有一个类似的专利实验

https://en.wikipedia.org/wiki/QUIC

这也试图改进TCP的三重握手,并改变拥塞控制以更好地处理快速线路。

更新2022:Quic和HTTP/3

QUIC(上面提到的)已经通过rfc标准化了,甚至在最初的答案写出来之后就成为了HTTP/3的基础。有各种各样的库,如lucas-clemente/quic-go或microsoft/msquic或谷歌/quiche或mozilla/neqo (web浏览器需要实现这个)。

这些库在UDP传输之上向程序员公开可靠的类tcp流。RFC 9221 (QUIC的不可靠数据报扩展)增加了处理单个不可靠数据包的功能。

在一些应用程序中,TCP比UDP更快(更好的吞吐量)。

当执行大量相对于MTU大小的小写操作时,就会出现这种情况。例如,我读到一个实验,在这个实验中,一个300字节的数据包流通过以太网发送(1500字节MTU), TCP比UDP快50%。

这是因为TCP将尝试缓冲数据并填充整个网段,从而更有效地利用可用带宽。

另一方面,UDP将数据包立即放到网络上,从而使大量的小包阻塞网络。

你可能不应该使用UDP,除非你有非常具体的原因这样做。特别是因为你可以通过禁用Nagle算法来让TCP和UDP具有相同的延迟(例如,如果你正在传输实时传感器数据,而你不担心网络被大量的小包阻塞)。

人们说TCP给你的主要东西是可靠性。但事实并非如此。TCP提供给您的最重要的东西是拥塞控制:您可以在DSL链路上运行100个TCP连接,所有的连接都以最大速度运行,并且所有的100个连接都将是高效的,因为它们都“感知”到可用带宽。用100个不同的UDP应用程序尝试一下,所有的应用程序都尽可能快地推送数据包,看看事情对你有多好。

在更大的范围内,这种TCP行为可以防止Internet陷入“拥塞崩溃”。

倾向于将应用程序推向UDP的事情:

Group delivery semantics: it's possible to do reliable delivery to a group of people much more efficiently than TCP's point-to-point acknowledgement. Out-of-order delivery: in lots of applications, as long as you get all the data, you don't care what order it arrives in; you can reduce app-level latency by accepting an out-of-order block. Unfriendliness: on a LAN party, you may not care if your web browser functions nicely as long as you're blitting updates to the network as fast as you possibly can.

但即使你关心性能,你可能也不想使用UDP:

现在,您要考虑的是可靠性,您为实现可靠性所做的许多事情最终可能比TCP已经实现的要慢。 现在您对网络不友好,这可能会在共享环境中引起问题。 最重要的是,防火墙会阻止你。

通过将多个TCP连接“集群化”在一起,可以潜在地克服一些TCP性能和延迟问题;iSCSI这样做是为了绕过局域网上的拥塞控制,但是你也可以这样做来创建一个低延迟的“紧急”消息通道(TCP的“紧急”行为完全被破坏)。