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


当前回答

具有容错功能

你是说“容忍损失”吗?

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

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

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

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

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

其他回答

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

如果它是一种带有消息交换的协议,我建议使用TCP所带来的轻微性能损失是值得的。你得到了两个端点之间的连接它能提供你所需要的一切。不要尝试在UDP之上创建自己可靠的双向协议,除非你对自己的工作非常非常有信心。

请记住,TCP通常在网络上保存多条消息。如果你想在UDP中实现这一点,如果你想可靠地做到这一点,你将有相当多的工作。你的解决方案要么不太可靠,要么速度较慢,要么工作量巨大。有有效的UDP应用程序,但如果你问这个问题,你的可能不是。

如果你需要在两个还没有通话的IP之间快速发送消息,那么UDP到达的速度至少要快3倍,通常是5倍。

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

要了解更多信息,我推荐简单但非常容易理解的Skullbox解释(TCP vs. UDP)

具有容错功能

你是说“容忍损失”吗?

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

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

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

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

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