rtps报文分析
在RTPS(实时发布订阅协议,Real-Time Publish-Subscribe)协议中,HEARTBEAT报文用于在发布者和订阅者之间进行心跳检测,确保通信链路的活性和数据传输的可靠性。HEARTBEAT报文中包含两个重要的字段:firstAvailableSeqNumber
和lastSeqNumber
。这两个字段用于序列号管理,确保数据传输的顺序性和完整性。
1. firstAvailableSeqNumber
firstAvailableSeqNumber
表示接收方(如订阅者)期望接收的下一个序列号。它标识了接收方当前尚未接收到的最小序列号。通过这个字段,发送方(如发布者)可以了解接收方已经成功接收了哪些数据包,从而避免重复发送已接收的数据。
示例:
假设发布者已经发送了序列号1到100的数据包,而订阅者已经成功接收了序列号1到95的数据包。那么,订阅者在发送HEARTBEAT报文时,会将firstAvailableSeqNumber
设置为96。这意味着订阅者已经准备好接收序列号96及更高的数据包。
2. lastSeqNumber
lastSeqNumber
表示发送方已经发送的最高序列号。它标识了发送方已传输的数据包的最大序列号。通过这个字段,接收方可以了解发送方已经发送了哪些数据包,从而可以检测是否有数据包丢失。
示例:
假设发布者已经发送了序列号1到100的数据包,那么在HEARTBEAT报文中,发布者会将lastSeqNumber
设置为100。这表明发布者已经成功发送了序列号1到100的数据包。
3. 两者的关系
firstAvailableSeqNumber
和lastSeqNumber
共同用于确保数据传输的可靠性和顺序性。firstAvailableSeqNumber
表示接收方期望接收的下一个序列号,而lastSeqNumber
表示发送方已经发送的最高序列号。如果firstAvailableSeqNumber
大于lastSeqNumber
,这意味着接收方已经确认接收了所有发送方发送的数据包。
示例:
- 发布者发送了序列号1到100的数据包,设置
lastSeqNumber
为100。 - 订阅者成功接收了序列号1到95的数据包,设置
firstAvailableSeqNumber
为96。 - 发布者接收到订阅者的HEARTBEAT报文后,知道订阅者尚未接收到序列号96到100的数据包,可以选择重传这些数据包。
- 一旦订阅者接收到所有数据包,会在HEARTBEAT报文中设置
firstAvailableSeqNumber
为101,表示已经准备好接收新的数据包。
4. 总结
firstAvailableSeqNumber
:接收方期望接收的下一个序列号。lastSeqNumber
:发送方已经发送的最高序列号。
通过这两个字段,RTPS协议能够高效地管理数据传输的顺序和完整性,确保数据在复杂的网络环境中可靠传输。
DDS汇总:
https://zhuanlan.zhihu.com/p/691034408