用于一般协议消息交换,可以容忍一定的丢包。UDP比TCP效率高多少?
当前回答
网络的设置对于任何测量都是至关重要的。如果您通过本地机器上的套接字或与世界的另一端进行通信,则会产生巨大的差异。
我想在讨论中补充三点:
您可以在这里找到一篇关于TCP与UDP的非常好的文章 游戏开发的背景。 此外,iperf (jperf增强iperf与GUI)是一个 这是一个很好的工具,可以通过测量来回答你的问题。 我用Python实现了一个基准测试(参见这个SO问题)。在平均10^6次迭代中,UDP发送8字节的差异大约是1-2微秒。
其他回答
UDP比TCP快,原因很简单,因为它不存在允许连续数据包流的确认数据包(ACK),而不是使用TCP窗口大小和往返时间(RTT)来确认一组数据包的TCP。
要了解更多信息,我推荐简单但非常容易理解的Skullbox解释(TCP vs. UDP)
每个TCP连接都需要在数据传输之前进行初始握手。此外,TCP报头包含大量用于不同信号和消息传递检测的开销。对于消息交换,如果失败的可能性很小,UDP可能就足够了。如果必须验证收据,TCP是最好的选择。
请记住,TCP通常在网络上保存多条消息。如果你想在UDP中实现这一点,如果你想可靠地做到这一点,你将有相当多的工作。你的解决方案要么不太可靠,要么速度较慢,要么工作量巨大。有有效的UDP应用程序,但如果你问这个问题,你的可能不是。
在一些应用程序中,TCP比UDP更快(更好的吞吐量)。
当执行大量相对于MTU大小的小写操作时,就会出现这种情况。例如,我读到一个实验,在这个实验中,一个300字节的数据包流通过以太网发送(1500字节MTU), TCP比UDP快50%。
这是因为TCP将尝试缓冲数据并填充整个网段,从而更有效地利用可用带宽。
另一方面,UDP将数据包立即放到网络上,从而使大量的小包阻塞网络。
你可能不应该使用UDP,除非你有非常具体的原因这样做。特别是因为你可以通过禁用Nagle算法来让TCP和UDP具有相同的延迟(例如,如果你正在传输实时传感器数据,而你不担心网络被大量的小包阻塞)。
具有容错功能
你是说“容忍损失”吗?
基本上,UDP不是“容错”的。你可以发送100个包给某人,他们可能只收到其中的95个包,有些包的顺序可能是错误的。
对于视频流媒体和多人游戏之类的东西,错过一个数据包总比延迟它后面的所有其他数据包要好,这是显而易见的选择
然而,对于大多数其他事情,丢失或“重新排列”的数据包是至关重要的。你必须编写一些额外的代码来运行在UDP之上,以便在遗漏内容时重试,并强制执行正确的顺序。这在某些地方会增加一点开销。
值得庆幸的是,一些非常非常聪明的人已经做到了这一点,他们称之为TCP。
可以这样想:如果一个数据包丢失了,您是希望尽快获得下一个数据包并继续(使用UDP),还是您实际上需要丢失的数据(使用TCP)。开销并不重要,除非你在一个真正的边缘情况下。