RELIABILITY
RTPS behavior 定义了 Reliability QoS 的实现。并定义了 Stateful Writer 和 Stateless Writer。一般而言,Stateful 意味着可靠传输,Stateless 意味着不可靠传输(尽管规范中是可组合的)。
当 User 向 DDS 写入数据时,数据序列化后首先被添加到 Stateful 的 CacheChange 中,CacheChange 是一个缓冲区,其大小受 ResourceLimit 影响。
然后数据被发送给 Reader。
此外,Stateful 会定期发送 HeartBeat 包,其中包含了当前 Stateful Writer 中包含的序列号。当 Reader 收到此消息后,必须发送一个 ACKNACK 进行相应来告知 Writer 其是否已经收到了数据包。一般而言,Data 会和 HeartBeat 一起发送。
当所有 Reader 都已经确认后,Writer 就可以将被确认的消息从缓存中删除。若 AckNack 中包含了已经删除的数据包,则 Writer 必须回复一个 HeadBeat 来告知其含有的 CacheChange 范围,若 AckNack 请求的数据包不相干,则回复 Gap。
下面列出了 Stateful Writer 需要遵循的行为:
必须按照写入顺序发送数据。
必须周期性发送 HeatBeat。
若收到 Reader 的 Nack,则必须使用 HeatBeat 或 Gap 进行回复。
下面列出了 Stateful Reader 的行为:
若收到一个没有设置 final flag 的 HeatBeat,则必须回复 AckNack。
一旦 Ack 了一个包,则不允许后续再发送对此包的 Nack。