何时适合使用UDP而不是TCP?

342

由于TCP能够保证数据包的传递,因此可以被认为是“可靠的”,而UDP并不保证任何东西,数据包可能会丢失。在应用程序中使用UDP传输数据相对于TCP流传输有什么优势?在什么情况下UDP会是更好的选择,为什么?

我假设UDP更快,因为它没有创建和维护流的开销,但如果一些数据永远无法到达目的地,那么这个假设是否还有意义呢?


63
除了可能遭受数据包丢失的问题外,UDP也不能保证您只会收到一次数据包。如果您的网络复杂或配置不良,可能会收到相同的数据包多次。提醒一下,因为人们往往会忘记这一点! - Brian Agnew
4
它甚至不能保证数据包的顺序。 - Mehrdad Afshari
22
TCP并不能保证数据一定会被发送成功,它只保证在数据传输成功的情况下,数据包的顺序与发送时一致。 - Chaim Geretz
8
顺便说一下,我经常看到人们把可靠性/有序传递等同于 TCP 重传。这些“专家”会告诉你,为了克服 UDP 上的传输错误,你将重新实现 TCP(糟糕的),因此你不妨使用 TCP。这是不正确的。除重传外,还有其他错误恢复技术,不会因小但非零误码率而遭受延迟或指数级降低吞吐量的影响。 - Ben Voigt
1
在Network Engineering Stack Exchange上曾经有一个非常类似的问题被提出:如何知道一个协议是使用UDP还是TCP?。我在这里提供链接到我的回答,以提供更多的见解。 - Eddie
显示剩余3条评论
24个回答

1
我们有一个 Web 服务,拥有数千个 WinForms 客户端在同样数量的 PC 上。这些 PC 没有与 DB 后端的连接,所有访问都通过 Web 服务进行。因此,我们决定开发一个中央日志服务器,监听一个 UDP 端口,所有客户端都发送一个 XML 错误日志数据包(使用 log4net UDP appender),一旦接收到就会被转储到一个 DB 表中。由于我们并不真正关心是否会丢失一些错误日志,并且有数千个客户端,使用专用的日志记录服务而不是加载主 Web 服务可以提高速度。

0

如果TCP能够可能工作,我有点不愿意建议使用UDP。问题在于,如果TCP由于连接过于拥挤或延迟过高而无法工作,那么更改应用程序以使用UDP是不太可能有所帮助的。糟糕的连接对于UDP也是不利的。TCP已经非常有效地最小化了拥塞。

我唯一能想到需要使用UDP的情况是广播协议。在涉及两个已知主机的应用程序中,UDP可能只会提供微不足道的性能优势,而代价则是显著提高的代码复杂性。


如果一个中间节点正在执行流量控制,那么你将从 UDP 中获得更好的吞吐量测试结果。因为你可以更容易地控制数据包速率,相对于 TCP 会快速推送数据包,并且 TCP 窗口的交互会产生负面影响。 - Simeon Pilgrim
这仍然是一种优化,应该根据实际测试进行。我的观点是,你应该首先尝试使用TCP,只有在发现TCP由于某些原因无法工作时才尝试其他选择。因为UDP理论上支持更好的带宽利用,所以选择UDP是一种过早的优化形式。 - SingleNegationElimination
同意在优化方面的观点。但是,当你试图解决性能问题时,知道何时TCP可能是问题而不是其他因素会有所帮助。 - Simeon Pilgrim

-1

只有在您真正知道自己在做什么时才使用UDP。今天UDP在极其罕见的情况下使用,但是试图将其应用到任何地方的(即使是非常有经验的)专家数量似乎不成比例。也许他们喜欢自己实现错误处理和连接维护代码。

TCP应该预计在现代网络接口卡上由于所谓的校验和印记而更快。令人惊讶的是,在快速连接速度(例如1Gbps)下,计算校验和对于CPU来说是一个很大的负担,因此它被卸载到NIC硬件中,该硬件识别TCP数据包以进行印记,并且它不会为您提供相同的服务。


2
UDP校验和卸载与TCP校验和卸载一样可用。 - Ben Voigt
但不包括校验和验证。 - Pavel Radzivilovsky
1
即使是今天的消费级以太网适配器,也具备了UDP校验和卸载功能,既可以在传输时进行,也可以在接收时进行验证。我十年前就在专业级硬件上看到了这个功能,我相信它在服务器级别的网络接口控制器上已经存在更长时间了。 - Ben Voigt

-2

UDP非常适合VoIP地址,其中数据包必须被发送而不考虑其可靠性... 视频聊天是UDP的一个例子(您可以通过wireshark网络捕获在任何视频聊天期间进行检查)... 此外,TCP无法与DNS和SNMP协议一起使用。 UDP没有任何开销,而TCP有很多开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接