用于一般协议消息交换,可以容忍一定的丢包。UDP比TCP效率高多少?
当前回答
根据我的经验,UDP稍微快一点,但也快不了多少。选择不应该基于性能,而应该基于消息内容和压缩技术。
如果它是一种带有消息交换的协议,我建议使用TCP所带来的轻微性能损失是值得的。你得到了两个端点之间的连接它能提供你所需要的一切。不要尝试在UDP之上创建自己可靠的双向协议,除非你对自己的工作非常非常有信心。
其他回答
如果不考虑网络情况,只讨论TCP或UDP是没有意义的。 如果两点之间的网络质量非常高,UDP绝对比TCP快,但在其他一些情况下,如GPRS网络,TCP可能比UDP更快,更可靠。
在一些应用程序中,TCP比UDP更快(更好的吞吐量)。
当执行大量相对于MTU大小的小写操作时,就会出现这种情况。例如,我读到一个实验,在这个实验中,一个300字节的数据包流通过以太网发送(1500字节MTU), TCP比UDP快50%。
这是因为TCP将尝试缓冲数据并填充整个网段,从而更有效地利用可用带宽。
另一方面,UDP将数据包立即放到网络上,从而使大量的小包阻塞网络。
你可能不应该使用UDP,除非你有非常具体的原因这样做。特别是因为你可以通过禁用Nagle算法来让TCP和UDP具有相同的延迟(例如,如果你正在传输实时传感器数据,而你不担心网络被大量的小包阻塞)。
UDP比TCP快,原因很简单,因为它不存在允许连续数据包流的确认数据包(ACK),而不是使用TCP窗口大小和往返时间(RTT)来确认一组数据包的TCP。
要了解更多信息,我推荐简单但非常容易理解的Skullbox解释(TCP vs. UDP)
具有容错功能
你是说“容忍损失”吗?
基本上,UDP不是“容错”的。你可以发送100个包给某人,他们可能只收到其中的95个包,有些包的顺序可能是错误的。
对于视频流媒体和多人游戏之类的东西,错过一个数据包总比延迟它后面的所有其他数据包要好,这是显而易见的选择
然而,对于大多数其他事情,丢失或“重新排列”的数据包是至关重要的。你必须编写一些额外的代码来运行在UDP之上,以便在遗漏内容时重试,并强制执行正确的顺序。这在某些地方会增加一点开销。
值得庆幸的是,一些非常非常聪明的人已经做到了这一点,他们称之为TCP。
可以这样想:如果一个数据包丢失了,您是希望尽快获得下一个数据包并继续(使用UDP),还是您实际上需要丢失的数据(使用TCP)。开销并不重要,除非你在一个真正的边缘情况下。
Which protocol performs better (in terms of throughput) - UDP or TCP - really depends on the network characteristics and the network traffic. Robert S. Barnes, for example, points out a scenario where TCP performs better (small-sized writes). Now, consider a scenario in which the network is congested and has both TCP and UDP traffic. Senders in the network that are using TCP, will sense the 'congestion' and cut down on their sending rates. However, UDP doesn't have any congestion avoidance or congestion control mechanisms, and senders using UDP would continue to pump in data at the same rate. Gradually, TCP senders would reduce their sending rates to bare minimum and if UDP senders have enough data to be sent over the network, they would hog up the majority of bandwidth available. So, in such a case, UDP senders will have greater throughput, as they get the bigger pie of the network bandwidth. In fact, this is an active research topic - How to improve TCP throughput in presence of UDP traffic. One way, that I know of, using which TCP applications can improve throughput is by opening multiple TCP connections. That way, even though, each TCP connection's throughput might be limited, the sum total of the throughput of all TCP connections may be greater than the throughput for an application using UDP.
推荐文章
- 如何通过windows命令行关闭TCP和UDP端口
- UDP和TCP比起来快多少?
- 一个干净、轻量级的Python扭曲的替代品?
- 将主机端口转发到docker容器
- 远程主机强制关闭现有连接
- TCP连接的最大数据包大小
- HTTP 1.1和HTTP 2.0的区别是什么?
- connectexception:拒绝连接
- 互联网上最大的安全UDP包大小是多少
- 关闭vs关闭套接字?
- 如何解决“java.net.BindException: Address already in use: JVM_Bind”错误?
- 增加Linux中TCP/IP连接的最大数量
- 模拟慢速网络连接的网络工具
- Android检查网络连接
- 在Linux上模拟延迟和丢弃的包