是否可以保证的Node.js使用UDP消息的传递?(Is it possible to guaran

2019-08-18 00:57发布

它是如何能够保证对Node.js的使用UDP消息的传递? 例如,我可以重新发送数据包,如果它失败了 - 但有没有办法确定何时会失败? 此外,如何常见的是数据包的丢失?

Answer 1:

如果你真正想知道是“我怎样检测丢失的数据包”? 然后,通用的技术是具有接收器发送确认用于发送每个分组。 如果发送方没有收到确认,则必须重新发送数据包。 如果接收端收到重复的数据包,那么它应该丢弃重复。

基本方案是这样的:

TX                               RX
 \           data
  `----------------------------->

              ack               /
 <-----------------------------'

 \           data
  `-------------------- - - -          loss of data packet
               .
               .
               . timeout
               .
 \       data retransmit
  `----------------------------->

              ack               /
 <-----------------------------'

 \           data
  `----------------------------->

              ack               /
      - - - - -----------------'       loss of ack packet
               .
               . timeout
               .

 \       data retransmit
  `----------------------------->

              ack               /
 <-----------------------------'

这基本上是所有形式的丢包检测的基础。 有迹象表明,可以实现改善的技术改进一些,但基本是大致相同:如果接收器不告诉你的是,数据包到达,则数据包丢失。

其中第一个改进通常做的算法是,以检查ACK是真正合适的ACK并不仅仅是一些回声路由器或信号交叉inteference或由软件错误发送。 解决的办法是实现一个触发位。 所述数据分组与所述触发位组发送到的值和ACK数据包需要具有适当的值(通常是相同的值)进行回复。 如果触发位是错误的,那么就意味着ACK数据包不匹配,这意味着它先前数据包匹配的最后一个数据包。 这意味着最后一个数据包没有被确认,这意味着事情已经严重了问题,直到收到正确的ACK包应该被重发。

TX                               RX
 \           data[0]
  `----------------------------->

              ack[0]            /
 <-----------------------------'

 \           data[1]
  `----------------------------->

              ack[0]            /
 <-----------------------------'      ack mismatch!

 \       data[1] retransmit
  `----------------------------->

一些真实世界的协议,使用这种技术,包括用于控制工业设备和机器人大多数协议。

下一步骤实际上是上述思想的扩展。 相反,只发送了一点为什么不把一个数字。 这样,你可以在ACK更明确匹配到的数据包,因此更准确地检测该数据包丢失,需要重传。 这种技术通常被称为滑动窗口的技术,因为在某些点的数目翻转和滑动回到零。 那么你是无法检测到丢包,然后才能传输数据包的最大数量为滑动窗口的大小。

滑动窗口技术的一大好处是,你可以发送大量的数据包,而无需等待ACK。 这显著提高吞吐量:

 \           data[1]
  `----------------------------->
 \           data[2]
  `----------------------------->
 \           data[3]
  `----------------------------->


              ack[1]            /
 <-----------------------------'
              ack[2]            /
 <-----------------------------'

 \           data[4]
  `----------------------------->
 \           data[5]
  `----------------------------->

              ack[3]            /
 <-----------------------------'
              ack[5]            /
 <-----------------------------'      ack[4] missing!
               .
               . timeout
               .

 \       data[4] retransmit
  `----------------------------->

所以上述是基本技术的用于检测分组丢失的简短摘要。 这就是你需要实现,如果你希望你的所有UDP数据包到达它们的目的地是什么。

你应该知道,虽然这TCP已经实现了这个,所以你真的应该使用TCP,如果你不想推倒重来。 UDP是因为在某些情况下,数据包丢失创建是OK(想想音频/视频流)。



Answer 2:

维基百科

UDP是适合于目的,其中错误检查和纠正或者不必要或在应用程序执行的,避免了在网络接口电平这样的处理的开销。 时间敏感的应用程序通常使用UDP因为丢弃分组优选等待延迟分组,这可能不是在实时系统的一个选项。[2] 如果在网络接口电平所需要的纠错设施,应用可以使用传输控制协议(TCP)或它们被设计用于此目的的流控制传输协议(SCTP)。

基本上,使用TCP如果你关心,如果包/消息到达那里。 否则,在应用层使用UDP重新发明TCP。



Answer 3:

这是不可能的,以保证特定的UDP数据包的传送任何平台上,不只是node.js中 如果你正在寻找的是一个基于UDP的可靠传递机制,寻找一些像E-网或搜索可靠的UDP。

编辑:或使用TCP。



Answer 4:

UDP是无保证的传递的协议。 如果你要保证,你应该实现在UDP上一些协议。



文章来源: Is it possible to guarantee delivery of messages using UDP on Node.js?
标签: node.js udp