Packet Loss Notification
1.0.0
该项目提供了一个帮助程序类,用于检测和通知丢失的不可靠数据包。这是许多高级同步策略的重要组成部分。例如,最终一致性就使用它。
为简单起见,服务器仅支持一个客户端。
概述 |
---|
检测的工作原理是将该标头添加到每个发送的数据包中:
ushort
本地序列 IDushort
最后一个远程序列 IDuint
32 个先前远程序列 ID 的位掩码工作流程是这样的:
AddPeer
AddHeaderForPeerId
EnqueueData
ReadHeaderOfPeerId
ExecuteLostPackets
ClearHeader
RemovePeer
如果数据包被视为丢失,则意味着它很可能已丢失。当数据包被视为已到达时,则确定已到达。
ILossHandler.OnPacketLost
将为每个丢失的数据包以及每个在对等点断开连接时排队并仍在跟踪的数据包调用。
如果存在LOSS_DETECTOR_DEBUG
符号,则所有丢失的数据包序列将输出到记录器。
ILossHandler handler, ushort maxPeerCount, ushort ackWindow
) - 将为每个丢失的数据包调用ILossHandler
的实现。 MaxPeerCount
- 连接到该对等点的最大对等点计数。 AckWindow
- 每个对等点的本地跟踪数据包的最大计数。ushort peerId
) - 清除该peerId 的序列号。ushort peerId
) - 将该peerId的每个跟踪数据包排队为丢失。ushort peerId, BitBuffer data
) - 将标头信息写入该 peerId 的 BitBuffer 中。ushort peerId, BitBuffer data
) - 从 BitBuffer 读取标头并检测是否有任何跟踪的数据包已被 ACK 或 NACK。在 ACK 检测器的情况下,将释放分配的内存。如果该peerId 的sequenceId 大于lastSequenceId,则返回True。ushort peerId, PacketData data
) - 尝试将数据放入该对等点的跟踪数据包队列中。如果队列已满,则返回 False。也许您已经太长时间没有收到来自另一个对等点的数据包,应该断开他的连接。BitBuffer data
) - 从 BitBuffer 中清除标头。如果存在LOSS_DETECTOR_DEBUG
符号,则这些方法也可用:
StringBuilder builder
) - 将每个peerId 的缓冲区的完整状态写入StringBuilder。ushort peerId, StringBuilder builder
) - 写入该peerId 的缓冲区状态。 Helper 本身与传输无关,但示例项目使用 ENet
fholm - 网络大师 - 帮了很多忙。