开放连接上的无连接 UDP 与面向连接的 TCP

Posted

技术标签:

【中文标题】开放连接上的无连接 UDP 与面向连接的 TCP【英文标题】:Connectionless UDP vs connection-oriented TCP over an open connection 【发布时间】:2012-02-14 09:17:45 【问题描述】:

如果在客户端和服务器之间建立了 TCP 连接,与无连接路由相比,在这种面向连接的路由上发送数据是否更快,因为数据包中的标头信息较少?因此,会打开一个 TCP 连接,并在需要时通过打开的连接发送字节。还是通过每个数据包都包含目标地址的无连接路由,UDP 仍然是更好的选择?

通过已建立的 TCP 连接(在完成所有握手之后)发送数据包是比 UDP 更快的方法吗?

【问题讨论】:

它们差异太大,无法以这种方式进行有用的比较。 747 比步行更快,但 747 不会让你下楼梯。 无根据的假设:“鉴于 [TCP] 数据包 [比 UDP 数据包] 中的标头信息少”。什么让你有那个想法?一个 UDP 报头是 8 个字节。 TCP 标头至少为 20 个字节。 第二个毫无根据的假设:只有在“无连接路由”上,“每个数据包都包含目标地址”。每个数据包都包含目标地址,无论数据包携带 TCP 还是 UDP。 谢谢你们到目前为止的回答。我原则上理解为什么我会在 UDP 上使用 TCP - 不是问题,可靠性不是考虑因素。我是从打开连接后基于标头信息(TCP)而不是包含所有目标信息(UDP)的标头的切换表的查找角度询问的。如果我想从源到目标获取单个字节,那么开放的 TCP 连接会是更好的方法吗?数据包排序很好 - 谢谢乔尔。 嗯,好的。看看这个:en.wikipedia.org/wiki/IPv4 在交换表中查找与 TCP 或 UDP 无关。它基于 IP,此信息在 IP 标头中。所以不管你用的是哪一个。但是对于 TCP,您可能有更多的数据包,这意味着您需要进行更多的查找。 【参考方案1】:

我建议您阅读更多有关此主题的内容。

只是作为一个快速的答案。 TCP 确保所有包裹都送达。因此,如果由于某种原因被丢弃。发送者将继续发送它,直到接收者得到它。但是,UDP 发送一个数据包并忘记它,因此您可能会丢失一些数据包。因此,UDP 通过网络发送的数据包数量较少。

这就是他们将 UDP 用于视频的原因,因为首先丢失少量数据并不是什么大问题,而且即使发送者再次发送它也为时已晚,接收者无法使用它,所以 UDP 更好。相反,您不希望您的网上银行通过 UDP!

编辑:请记住,UDP 和 TCP 发送数据包的速度几乎相同,并且取决于网络!但是 TCP 握手后,仍然需要接收方发送 ack,发送方必须等待 ack 才能发送新的一批数据,所以还是会慢一些。

【讨论】:

【参考方案2】:

一般来说,尽管报头信息较少,但 TCP 会稍微慢一些,因为数据包必须按顺序到达,而且实际上必须到达。在 UDP 情况下,两者都没有检查。

【讨论】:

这意味着您必须进行检查,并且由于 UDP 中没有流量控制,您可能会很容易丢失数据包。而且您可能无法比 TCP 更快地自己进行检查。 我怀疑 TCP 的标头信息少于 UDP。你能引用一个来源吗? (这是我的:udp header,tcp header)。 TCP 标头大于 UDP:en.wikipedia.org/wiki/Transmission_Control_Protocol 见connectionless and connection-oriented packet switching。一旦打开 TCP 连接,每个网络节点上的目标“查找”是否有效地减少开销? @frimley - 原本合理的文章存在缺陷,因为它暗示 TCP 是一种电路交换协议。它不是。它是一种由IP承载的可实现的传输协议。 IP 几乎总是* 一种数据包交换协议。因此,TCP 或 UDP 始终是分组交换的,而不是电路交换的。 (*"几乎总是" == "除了 MPLS")。

以上是关于开放连接上的无连接 UDP 与面向连接的 TCP的主要内容,如果未能解决你的问题,请参考以下文章

字节跳动面经总结

面向报文(UDP)和面向字节流(TCP)的区别

网络协议TCP协议简单介绍

TCP与UDP的区别

TCP协议详解

TCP协议详解