UDP总是不可靠吗?

时间:2014-11-12 21:39:36

标签: sockets udp

我即将重新构建一个在单个节点上进行原型化的实时系统,并指定如何将其扩展到多个节点(在任何一个LAN中可能永远不会超过20个) 。某些功能将在每个节点的基础上相乘,其中一些功能将在每个系统的基础上保持集中。每个节点与该中央单元(可能是主节点)之间需要进行通信,但不需要在各个节点之间进行通信。

由于系统的实时需求,UDP应该被考虑用于该通信。但是......它几乎总是被描述为不可靠。总是这样吗?它不依赖于网络规模,网络上的数据负载以及协议的使用方式吗?

例如,假设我有一个中央单元,通过向其发送UDP消息定期轮询每个节点,并且每个节点立即通过UDP响应其数据。 (隔离的)网络上没有其他通信。假设还存在一些机制来确保从不存在任何冲突(例如,所有节点对于轮询消息的响应具有最大传输长度,并且延迟被固定到已知级别)。在像这样的简单结构化网络中是否存在任何(隐藏)原因,您将无法传输/接收每个最后的UDP数据包并且具有接近100%的可靠性?

编辑:这个问题的详细信息会因为什么不可靠而导致混淆。意味着,是否仅适用于UDP,或者应用于使用UDP的系统。我选择在这个问题中留下这种混乱,因为回顾UDP上的大量材料,我可以看到这种混乱可能非常普遍,并且突出这种混淆并克服它的答案可能是有价值的。

6 个答案:

答案 0 :(得分:7)

关键是,UDP不做任何保证。数据报可能未送达的原因有很多:

  • 发件人主机缓冲区填满
  • 宇宙射线在途中某处翻转位,导致校验和不匹配,数据报被丢弃
  • 电磁干扰会瞬间破坏信号
  • 网络电缆暂时拔掉插头
  • 集线器或交换机暂时断电
  • 交换机的缓冲区填满
  • 接收主机缓冲区填满

如果发生任何这些事情(或许多其他事情),数据报可能无法送达。 UDP不会尝试检测到这种情况或重新发送它。

答案 1 :(得分:4)

是。从以太网电缆上的电信号开始,每一层都可能不可靠。 (曾经挤过其中一个插头?你可以在Wireshark日志中看到它。)几乎无法避免碰撞。在拥塞的情况下,您的协议栈可能决定丢弃UDP数据包。

但是所有这些都与此无关。 UDP是不可靠的,但这并不意味着不能依赖。许多关键任务应用程序都通过UDP运行。你只需要理解不可靠性并对其负责。

答案 2 :(得分:4)

不可靠并不意味着它肯定会失败。它只意味着它不关心运输问题,因此不会保证传输成功。让我们比较UDP与TCP的某些方面。

  • UDP是基于数据包的,基于TCP流。这与可靠性没什么关系。
  • 数据包的到达顺序可能与发送的顺序不同。 UDP不关心并将按此顺序将数据包传递给应用程序。在TCP数据中有一个序列号,因此接收器操作系统将检测重新排序并以正确的顺序将数据转发给应用程序。当您在客户端和服务器之间建立直接连接时,这通常无关紧要,但可能会在互联网等广泛的网络中发生。
  • 由于路由器或交换机拥塞或发送者或接收系统或其他人的过载,数据包可能会丢失。这也可能发生在交通拥挤的本地网络中,或者如果接收机系统无法处理大量数据,即使是很短的时间也是如此。使用UDP,数据将丢失。相反,TCP将检测丢失的数据包并重新传输它们,甚至减慢流量以适应网络和端点可以处理的速度,从而减少将来丢失的数据包。
  • 数据包可能会重复。由于序列号,TCP将再次检测到这一点,但UDP不会,因此将重复的数据包发送到应用程序。
  • 数据包可能会损坏。 TCP和UDP都具有相同类型的校验和来检测小错误,但不会检测到更大的错误。

使用UDP的应用程序通常不需要TCP的可靠性或不需要所有这些。例如,实时音频和视频丢包是可以接受的,但重复和重新排序不是。因此,RTP协议包含其自己的序列号(时间戳)以检测这种情况。此外,RTP通常伴有RTCP协议,将有关数据包丢失的统计信息发送回对等方,从而可以适应连接速度。

答案 3 :(得分:0)

如果您想要可靠的UDP,请尝试查看ENet库。

http://enet.bespin.org/

答案 4 :(得分:-2)

目前没有可用的网络技术可以100%可靠......但是让它变得实用而不是迂腐,因为潜在的不可靠性和实际的不可靠性很像鲨鱼攻击 - 它们往往发生在人和#39;思想而不是现实。

UDP上的一些材料听起来几乎就像设计UDP的人只是为了惹恼人们 - 不可靠性是故意设计的。事实并非如此,用这些术语来思考它是没有用的。与备选方案相比,关注UDP做什么和不做什么要好得多(例如,请参阅此comparison between TCP and UDP ...但仍然列出了不可靠性&#34;作为UDP的关键特性。)< / p>

实际上,当有数据要传输时,可以传输,传输;当有可以接收的数据时,它被接收。同样,如果您将数据包1,2然后3直接传输到端点,它们几乎肯定会按顺序接收为数据包1,2和3(假设较低网络层没有故障,并且输入数据在FIFO中缓冲为习惯,但不是强制性的)。根据您的使用方式,您可以获得很多可靠性。

但是,如果您通过多条路线传输数据包,则所有投注均已关闭 - &#34;不可靠性&#34;可以发生包顺序。如果你泛滥可用的缓冲区,将会发生丢包的不可靠性。如果您允许节点随时传输(异步),那么您将通过数据包冲突获得不可靠性。但在&#34;简单和结构化的#34; (以及小型和同步)局域网描述,你可能要么避免这种情况,要么检测它的发生(例如通过在每个数据包中发送递增的计数器值),这将允许你以特定于应用程序的方式进行补偿。

如果电源断电(可能是暂时的),或者宇宙射线发生,或者人们在松散的电缆上绊倒导致不可接受的水平&#34;不可靠性......那么就不要责怪UDP - 责怪那些设计让系统容易受到这些影响的工程师。

在所描述的局域网中,你可能会合理地期望能够设计一个基于UDP的系统,以便永远不会丢失超过一个数据包,每百万,或十亿,甚至天文学上比这更好 - 但这取决于具体情况,只有您可以知道您的应用程序是否能够容忍导致您案件的不可靠通信的数量和质量。

答案 5 :(得分:-2)

UDP的不可靠性与一般的不可靠性不同。此外,UDP及其替代方案(例如TCP)始终只是更广泛系统中的组件或单层。这可能会导致对“不可靠”的含义产生一些混淆。

UDP是传输层网络协议。传输层负责将数据从网络上的一个点获取到网络上的另一个特定点。在该上下文中,UDP被描述为“不可靠”协议,因为它不能保证发送的数据是否实际到达。相比之下,TCP是一种“可靠的”传输层协议,因为如果数据在第一次发送时丢失或损坏,协议本身就有重新发送数据并确保数据最终到达的机制。

但UDP并不是一些草率的“也许,也许不是 - 让我考虑一下并让你搞砸”协议。它按指定的方式执行,并且在执行此操作时是可靠的(一般意义)...以及以可预测的方式失败的可靠(一般意义)。如果您在其他地方考虑这些故障模式,UDP可以是整个非常可靠的系统的组件。

例如,通过限制网络拓扑并使用UDP传输更高级别的协议,GigE Vision标准规定了一个高度可靠的系统,具有高数据传输速率和实时响应,其传输级通信由UDP流量主导。

历史上,不可靠数据包传输的主要来源是数据包冲突,因为两个源尝试在单个通道上同时传输。在现代网络中,每个节点通常连接到网络交换机的全双工链路,在该链路上不可能发生冲突,从而使现代网络比最初设计UDP时更加可靠(在所有意义上)。 / p>