它是如何能够保证对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上一些协议。