1. 概述
概述
RTPS规范,全称为实时发布/订阅协议DDS互操作规范(The Real-Time Publish-Subscribe Protocol (RTPS) DDS Interoperability Wire Protocol Specification),RTPS在某些场景下也被叫做DDSI-RTPS。该协议产生的原因在于:
- DDS接口(DCPS)规范;
- 不同厂家实现DDS接口规范形成不同的DDS产品;
- 使用不同DDS产品的系统需要集成,即对不同厂家的DDS互操作、互联互通提出了新的需求;
- 提出RTPS规范来定义DDS底层的报文格式、行为等内容。
RTPS规范的内容参见下图,主要分为4个模块:
- 结构模块,定义概念和数据结构;
- 报文模块,定义报文格式;
- 行为模块,定义不同配置下传输的行为,即什么情况下发送什么报文,如何响应接收到的报文;
- 发现模块,综合使用以上三个模块,定义简单发现协议,用于通信实体之间的自动发现与匹配。
结构模块
描述了作为通信参与者的RTPS实体的结构,如下图所示,RTPS实体是被应用程序可见的DDS实体相互通信而使用的协议级端点。

| 概念定义 | 说明 |
|---|---|
| Entity | 实体,包括:参与者以及通信实体(写者、读者)的共用属性,包括:唯一标识; |
| Participant | 参与者,作为通信实体(写者、读者)的父实体,存储协议版本、供应商 ID 以及默认的地址信息; |
| Endpoint | 通信实体,作为写者以及读者的父类抽象,存储两端共有的信息,包括使用的通信地址、可靠性等级一级主题等级; |
| Writer | 写者,用于发送数据,每个写者关联一个 HistoryCache,用于维护发送的数据,并提供接口发送数据; |
| Reader | 读者,用于接收数据,每个读者关联一个 HistoryCache,用于维护接收到的数据列表; |
| HistoryCache | 历史数据缓存队列,提供增、删、查的功能,队列中的元素为 CacheChange; |
| CacheChange | 描述一个样本数据,包括:发送方标识、序列号、所属数据实例以及负载。 |
报文模块
Messages模块描述了在RTPS Writer端点和RTPS Reader端点之间交换的消息的总体结构和逻辑内容。
报文模块的总体结构如下所示:
- Message,RTPS 消息,包含一个消息头(Header)以及 1 个到多个子消息(SubMessage);
- Header,RTPS 消息头;
- SubMessage,RTPS 子消息,作为不同子消息的抽象结构,包括一个子消息头(SubmessageHeader)以及每种不同子消息包含不同的一个到多个子消息元素(SubmessageElement),子消息根据功能上的不同可以分为三类;
- 可靠型,包括:Heartbeat、AckNack、NackFrag;
- 信息型,包括:InfoDestination、InfoTimeStamp、InfoReply 以及 InfoSource;
- 数据型,包括:Data、Gap、DataFrag;
行为模块
行为模块进一步定义了 Writer/Reader 的接口及其行为,主流开源DDS都基于RTPS协议进行实施,Fast DDS支持直接调用RTPS接口,embeddedRTPS 专注嵌入式场景下的RTPS协议实现,可以“纯RTPS”运行。 行为模块的几种典型的行为:
StatelessWriter 对应 BEST-EFFORT 类型的数据写者;
- IDLE状态,匹配新的远程数据读者后进入IDLE状态;
- PUSHING状态,当有未发送的样本数据时,进入该状态,在该状态下循环发送未发送的样本数据,直到发送完成后进入IDLE状态,仅涉及到DATA以及GAP两类子消息;

StatelessReader 对应 BEST-EFFORT 类型的数据读者;
StatefulWriter 对应 RELIABLE 类型的数据写者;
StatefulReader 对应 RELIABLE 类型的数据读者;
发现模块
发现模块是DDS“纯分布式架构”的基础,每个应用上的DDS实体能够通过纯分布式的方式获取到系统内其他DDS实体的信息,并根据这些信息进行基于主题的按需分发。发现模块定义了两个协议:参与者发现协议(PDP) 和 端点发现协议(EDP)。
- 参与者发现阶段(PDP):发现网络中其他 DDS 参与者
- 端点发现阶段(EDP):在已发现的参与者之间,发现彼此拥有的、可能匹配的 DataWriter 和 DataReader
1. 参与者发现协议(PDP)
核心功能
- 创建内置的参与者发现端点(SPDP Writer/Reader)
- 周期性广播本地参与者信息
- 接收并处理远程参与者信息
- 维护参与者代理数据(ParticipantProxyData)
- 触发端点发现过程
工作流程
- 启动阶段:每个 DomainParticipant 启动时,创建一对内置端点(SPDP Writer 和 Reader)
- 广播机制:周期性(默认 3 秒)在预定义的多播地址和端口上发送 SPDPdiscoveredParticipantData 消息
- 消息内容:包含自身 Participant 的 GUID、QoS、定位信息(Locator - IP/Port)等
- 接收与处理:接收其他 Participant 的 SPDP 消息,更新参与者代理数据
- 连接建立:收到新 Participant 公告后,尝试建立与对方 Participant 的通信通道
- 离开检测:通过停止接收公告或收到明确的 dispose 消息检测 Participant 离开
发现模式
- 多播发现:节点加入预定义多播组,无需预知其他节点地址,适用于局域网
- 单播发现:节点需预先配置对端地址,通过点对点通信交换信息,适用于广域网或跨子网场景
2. 端点发现协议(EDP)
核心功能
- 交换 DataWriter 和 DataReader 的信息
- 匹配可能通信的端点
- 确认匹配成功,建立数据传输通道
工作流程
- 信息交换:通过 PDP 建立的通信信道,共享 DataWriter 和 DataReader 的信息
- 匹配条件:主题(Topic)和数据类型必须一致
- 确认机制:通过 heartbeat、acknack 等消息确认数据样本
- 例如:B 的 SEDPbuiltinSubscriptionWriter 发送 heartbeat 给 A 的 SEDPbuiltinSubscriptionReader
- A 收到后,若发现缺少样本,会发送 acknack 告知丢失的样本
- B 发送缺失的样本,更新 heartbeat
- 匹配完成:当双方确认数据一致后,DataWriter 和 DataReader 可以开始发送/接收用户数据
3. 其他 DDS 实现的发现机制
Fast DDS 提供了多种发现机制,以适应不同应用场景:
简单发现(Simple Discovery)
- 默认机制:支持 PDP 和 EDP 的 RTPS 标准
- 兼容性:提供与任何其他 DDS 和 RTPS 实现的兼容性
- 工作方式:使用 SPDP 和 SEDP 协议自动完成发现过程
静态发现(Static Discovery)
- 特点:跳过 EDP 阶段,无需自动发现
- 实现:通过 XML 文件预先配置对端信息
发现服务器(Discovery Server)
- 架构:集中式发现体系结构
- 工作方式:DomainParticipant(称为服务器)充当元流量发现的集线器
- 优势:适用于大规模分布式系统,减少网络广播流量
手动发现(Manual Discovery)
- 特点:禁用 PDP
- 工作方式:用户使用外部元信息信道手动匹配和取消匹配 RTPS 实体
- 适用场景:特殊网络环境或需要高度定制化的系统