Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets UDP总是不可靠吗?_Sockets_Udp - Fatal编程技术网

Sockets UDP总是不可靠吗?

Sockets UDP总是不可靠吗?,sockets,udp,Sockets,Udp,我将重新构建一个在单个节点上原型化的实时系统,并指定如何将其扩展到多个节点(在任何一个LAN中可能永远不会超过20个节点)。一些功能将在每个节点的基础上倍增,一些功能将在每个系统的基础上保持集中。需要在每个节点和该中央单元(可能是主节点)之间进行通信,但不需要在各个节点之间进行通信 由于系统的实时性要求,UDP是该通信应考虑的因素。但是它几乎总是被描述为不可靠的。总是这样吗?它是否取决于网络的规模、网络上的数据负载以及协议的使用方式 例如,假设我有一个中央单元,它通过向每个节点寻址UDP消息来定

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

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

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


编辑:这个问题的细节是因为混淆了“不可靠”的含义,以及它是仅适用于UDP还是适用于使用UDP的系统。我选择将这种困惑留在问题中,因为回顾有关UDP的大量资料,我发现这种困惑可能非常普遍,突出这种困惑并克服它的答案可能很有价值。

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


但这一切都有点离题了。UDP是不可靠的,但这并不意味着它不能被依赖。许多任务关键型应用程序通过UDP运行。您只需要了解不可靠性并对此作出解释。

关键是,UDP不提供任何保证。数据报无法传送的原因有很多:

  • 发送方主机缓冲区已满
  • 宇宙射线在某个地方翻转位,导致校验和不匹配,数据报被丢弃
  • 电磁干扰会瞬间破坏信号
  • 网络电缆被拔了一会儿
  • 集线器或开关会暂时断电
  • 交换机的缓冲区已满
  • 接收主机缓冲区已满

如果发生上述任何一种情况(或许多其他情况),数据报可能无法送达。UDP不会尝试检测或重新传送此信息。

当前可用的网络技术无法100%可靠。。。但让我们实事求是而不是迂腐,因为潜在的不可靠和实际的不可靠很像鲨鱼袭击——它们往往发生在人们的头脑中,而不是现实中

UDP上的一些材料让它听起来几乎像是设计UDP的人只是为了激怒人们——这种不可靠性是故意设计出来的。事实并非如此,用这些术语来思考也无济于事。与备选方案相比,将重点放在UDP做什么和不做什么上要好得多(例如,请参见此……尽管如此,它还是将“不可靠性”列为UDP的一个关键特性)

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

但是,如果您通过多个路由传输数据包,则所有赌注都将被取消——“数据包顺序不可靠”。如果你大量使用可用的缓冲区,就会发生丢包导致的不可靠性。如果您允许节点在任何时候传输(异步),那么您将通过数据包冲突获得不可靠性。但在描述的“简单结构化”(以及小型同步)LAN中,您可以避免这种情况,或者检测其发生(例如,通过在每个数据包中发送递增的计数器值),这将允许您以特定于应用程序的方式进行补偿

在断电(可能是瞬间断电)、宇宙射线照射、或人们因松脱的电缆绊倒而导致“不可靠”的情况下。。。然后不要责怪UDP——责怪工程师,他们的设计使系统容易受到这些因素的影响


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

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


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

  • UDP是基于数据包的,TCP是基于流的。这与可靠性没有多大关系
  • 包可能