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

有帮助吗?

解决方案

UDP 比 TCP 更快,原因很简单,因为它不存在允许连续数据包流的确认数据包 (ACK),而不是使用 TCP 窗口大小和往返时间 (RTT) 计算的确认一组数据包的 TCP )。

有关更多信息,我推荐简单但非常容易理解的 Skullbox 解释(TCP 与 TCP)UDP)

其他提示

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

从更大的范围来看,这种 TCP 行为可以防止互联网陷入“拥塞崩溃”。

倾向于将应用程序推向 UDP 的因素:

  • 组传递语义:与 TCP 的点对点确认相比,向一群人进行可靠的传送是可能的。

  • 无序交货:在很多应用程序中,只要你获得了所有数据,你并不关心它以什么顺序到达;您可以通过接受无序块来减少应用程序级延迟。

  • 不友善:在 LAN 聚会上,您可能并不关心 Web 浏览器是否运行良好,只要您尽可能快地向网络传输更新即可。

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

  • 您现在正面临着可靠性问题,而您为实现可靠性而可能做的许多事情最终可能会比 TCP 已经做的事情慢。

  • 现在您对网络不友好,这可能会在共享环境中导致问题。

  • 最重要的是,防火墙会阻止你。

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

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

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

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

另一方面,UDP 立即将数据包传送到线路上,从而使网络因大量小数据包而拥塞。

除非有非常具体的原因,否则您可能不应该使用 UDP。特别是因为您可以通过禁用 TCP 来为 TCP 提供与 UDP 相同的延迟。 内格尔算法 (例如,如果您正在传输实时传感器数据,并且您不担心大量小数据包导致网络拥塞)。

具有丢失容忍能力

您的意思是“具有丢失容忍度”吗?

基本上,UDP 不是“丢失容忍”的。您可以向某人发送 100 个数据包,但他们可能只会收到其中的 95 个数据包,而且有些数据包的顺序可能错误。

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

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

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

可以这样想:如果数据包丢失,您是否愿意尽快获取下一个数据包并继续(使用 UDP),或者您确实需要丢失的数据(使用 TCP)。除非您处于真正的边缘情况,否则开销并不重要。

哪种协议性能更好(就吞吐量而言) - UDP 或 TCP - 实际上取决于网络特性和网络流量。罗伯特·S。例如,Barnes 指出了 TCP 性能更好的场景(小规模写入)。现在,考虑网络拥塞并且同时存在 TCP 和 UDP 流量的场景。网络中使用 TCP 的发送者将感觉到“拥塞”并降低其发送速率。然而,UDP 没有任何拥塞避免或拥塞控制机制,使用 UDP 的发送方将继续以相同的速率注入数据。逐渐地,TCP 发送方会将其发送速率降低到最低限度,如果 UDP 发送方有足够的数据要通过网络发送,它们将占用大部分可用带宽。因此,在这种情况下,UDP 发送方将拥有更大的吞吐量,因为它们获得了更大的网络带宽份额。事实上,这是一个活跃的研究课题——如何在存在 UDP 流量的情况下提高 TCP 吞吐量。据我所知,TCP 应用程序可以提高吞吐量的一种方法是打开多个 TCP 连接。这样,即使每个 TCP 连接的吞吐量可能受到限制,所有 TCP 连接的吞吐量总和也可能大于使用 UDP 的应用程序的吞吐量。

每个 TCP 连接在传输数据之前都需要进行初始握手。此外,TCP 标头包含大量用于不同信号和消息传递检测的开销。对于消息交换,如果可以接受很小的失败机会,则 UDP 可能就足够了。如果必须验证收据,TCP 是您的最佳选择。

@安德鲁, , 我不敢苟同。由于性能要求,UDP 是某些类型应用程序的选择。一个典型的例子是视频会议。此类应用程序对 TCP 控制的响应不太好。

需要考虑的另一个方面是您是否需要多播。如果是这样,请使用 UDP。

当谈到“什么更快”时,至少有两个截然不同的方面:吞吐量和延迟。

如果说到 吞吐量 - TCP 的流量控制(如其他答案中提到的)非常重要,并且做任何与 UDP 类似的事情,虽然当然可能,但会是一个大头痛(tm)。结果 - 在需要时使用 UDP 吞吐量, ,很少有资格成为一个好主意(除非您想获得相对于 TCP 的不公平优势)。

然而,如果说到 延迟 - 整个事情完全不同了。虽然在没有数据包丢失的情况下,TCP 和 UDP 的行为极其相似(任何差异(如果有的话)都是微乎其微的),但在数据包丢失后,整个模式会发生巨大变化。

发生任何数据包丢失后,TCP 将等待重传至少 200 毫秒(RFC6298 第 2.4 段每段 1 秒,但实际的现代实现往往会将其减少到 200 毫秒)。此外,使用 TCP,即使那些确实到达目标主机的数据包 - 在收到丢失的数据包之前也不会传递到您的应用程序(即整个通信延迟约 200 毫秒) - 顺便说一句,这种效果称为 Head-of -线路阻塞是所有可靠有序流所固有的,无论是 TCP 还是可靠+有序 UDP。更糟糕的是,如果重传的数据包也丢失了,那么我们将讨论约 600ms 的延迟(由于所谓的指数退避,第一次重传为 200ms,第二次重传为 200*2=400ms)。如果我们的通道有 1% 的丢包率(按照今天的标准来看还不错),并且我们有一个每秒 20 次更新的游戏 - 这样的 600 毫秒延迟平均每 8 分钟就会发生一次。在快节奏的游戏中,600 毫秒足以让你丧命 - 嗯,这对游戏玩法来说非常糟糕。这些效果正是游戏开发者通常更喜欢 UDP 而不是 TCP 的原因。

然而,当使用 UDP 来减少延迟时 - 重要的是要认识到仅仅“使用 UDP”不足以获得显着的延迟改善,这完全取决于您如何使用 UDP。特别是,虽然 RUDP 库通常避免“指数退避”并使用较短的重传时间 - 如果它们被用作“可靠有序”流,它们仍然必须遭受队头阻塞(因此在双重阻塞的情况下)数据包丢失,而不是 600 毫秒,我们将得到大约 1.5*2*RTT - 或者对于一个相当好的 80 毫秒 RTT,它是大约 250 毫秒的延迟,这是一个改进,但仍然可以做得更好)。另一方面,如果使用中讨论的技术 http://gafferongames.com/networked-physicals/snapshot-compression/ 和/或 http://ithare.com/udp-from-mog-perspective/#low-latency-compression ,完全消除队头阻塞是可能的(因此对于每秒 20 次更新的游戏的双包丢失,无论 RTT 如何,延迟都将是 100 毫秒)。

顺便说一句 - 如果您碰巧只能访问 TCP 而不能访问 UDP(例如在浏览器中,或者如果您的客户端位于 6-9% 阻止 UDP 的丑陋防火墙之一) - 则有 似乎 要成为一种实现 UDP-over-TCP 且不会产生太多延迟的方法,请参见此处: http://ithare.com/almost-zero-additional-latency-udp-over-tcp/ (请务必阅读评论(!))。

如果您需要在两个尚未通话的 IP 之间快速通过网络发送消息,那么 UDP 的到达速度将至少快 3 倍,通常快 5 倍。

根据我的经验,UDP 稍微快一些,但也快不了多少。选择不应该基于性能,而应该基于消息内容和压缩技术。

如果是带有消息的协议 交换, ,我建议您对 TCP 所承受的非常轻微的性能影响是值得的。您将获得两个端点之间的连接,这将为您提供所需的一切。不要尝试在 UDP 之上创建自己的可靠双向协议,除非您对自己所做的事情非常非常有信心。

请记住,TCP 通常会在线路上保留多条消息。如果你想在 UDP 中实现这一点,并且想要可靠地完成它,你将需要做大量的工作。您的解决方案要么可靠性降低、速度降低,要么工作量巨大。UDP 有有效的应用程序,但如果您问这个问题,您的应用程序可能不是。

我会把事情说清楚。 TCP/UDP 有两辆车在路上行驶。假设交通标志和障碍物是错误 传输控制协议 关心交通标志,尊重周围的一切。缓慢驾驶,因为汽车可能会发生问题。尽管 UDP协议 直接开走,全速行驶,不尊重街道标志。没什么,一个疯狂的司机。 UDP协议 没有错误恢复,如果有障碍物,它只会与它碰撞然后继续。尽管 传输控制协议 确保所有数据包都完美发送和接收,没有错误,因此,汽车只是通过障碍物而不会发生碰撞。我希望这是一个很好的例子让你理解,为什么 UDP协议 是游戏中的首选。游戏需要速度。 传输控制协议 在下载时优先选择,否则下载的文件可能会损坏。

已经做了一些工作来让程序员能够同时受益。

SCTP

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

  • 为了消息的传递
  • 使用用户定义的参数自动重传丢失的消息

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

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

其他类似的东西

另一个类似的专有实验事物

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

不考虑网络状况,谈论TCP或UDP是没有意义的。如果两点之间的网络质量非常高,UDP绝对比TCP更快,但在其他一些情况下,例如GPRS网络,TCP可能比UDP更快、更可靠。

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

我想在讨论中添加三件事:

  1. 你可以找到 这里 一篇关于 TCP 与 TCP 对比的非常好的文章UDP在游戏开发的背景下。
  2. 此外, iperf (性能 用GUI增强IPERF)是一个非常不错的工具,可以通过测量来回答您的问题。
  3. 我用 Python 实现了一个基准测试(参见 这个问题)。对于 UDP,平均 10^6 次迭代中发送 8 个字节的差异约为 1-2 微秒。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top