是否有可能保证在Node.js上使用UDP传递消息?

如何保证在Node.js上使用UDP传递消息? 例如,如果数据包失败,我可以重新发送数据包 – 但有没有办法确定数据包何时失败? 另外,数据包的丢失有多普遍?

如果你真的想知道“如何检测丢失的数据包”? 那么一般的技术就是让接收器为每个发送的数据包发送一个确认。 如果发送器没有收到确认,那么它必须重新发送数据包。 如果接收方得到重复数据包,则应丢弃重复数据包。

基本的scheme是这样的:

TX RX \ data `-----------------------------> ack / <-----------------------------' \ data `-------------------- - - - loss of data packet . . . timeout . \ data retransmit `-----------------------------> ack / <-----------------------------' \ data `-----------------------------> ack / - - - - -----------------' loss of ack packet . . timeout . \ data retransmit `-----------------------------> ack / <-----------------------------' 

这实质上是所有forms的丢包检测的基础。 有几种改进方法可以用来改进技术,但基本原理是一样的:如果接收方没有告诉你数据包已经到达,那么数据包就会丢失。

通常对algorithm做的第一个改进之一是检查ack确实是合适的ack,而不仅仅是路由器发出的一些回声或者信号交叉干扰或者软件错误。 解决scheme是实现一个切换位。 数据包在切换位被设置为一个值的情况下被发送,并且ack包需要以适当的值(通常是相同的值)进行应答。 如果切换位是错误的,则意味着确认分组不匹配最后的数据分组,这意味着它匹配先前的数据分组。 这意味着最后一个数据包还没有被确认,这意味着有些事情已经严重出错了,数据包应该被重新传输,直到收到正确的ACK。

 TX RX \ data[0] `-----------------------------> ack[0] / <-----------------------------' \ data[1] `-----------------------------> ack[0] / <-----------------------------' ack mismatch! \ data[1] retransmit `-----------------------------> 

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

下一步实际上是上述想法的扩展。 为什么不发送一个号码,而不是发送一点点。 这样,您可以更确切地将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被创build,因为在某些情况下,数据包丢失是可以的(思考audio/videostream)。

从维基百科

UDP适用于在应用程序中不需要或执行错误检查和纠正的目的,避免了在networking接口级别进行这种处理的开销。 对时间敏感的应用程序通常使用UDP,因为丢弃数据包比等待延迟数据包更好,这在实时系统中可能不是一个选项。 如果在networking接口级别需要纠错function,则应用程序可以使用为此devise的传输控制协议(TCP)或stream控制传输协议(SCTP)。

如果你关心,基本上使用TCP,如果数据包/消息到达那里。 否则,在应用程序级别使用UDP重新创buildTCP。

不能保证在任何平台上传输特定的UDP数据包,而不仅仅是node.js。 如果你正在寻找的是一个基于UDP的可靠传递机制,寻找类似于电子networking或寻找可靠的UDP。

编辑:或使用TCP。

UDP是一个没有保证交付的协议。 如果你想保证,你应该在UDP之上实现一些协议。