随着数据分发服务 (data distribution service,dds)在大型分布式系统中的广泛采用,需要定义一个标准的“有线协议”:一方面允许多个供应商的dds产品实现互操作;另一方面,能够利用dds可配置的服务质量(quality of service,qos)设置,以优化其对底层传输能力的使用,特别是能够利用许多dds qos设置的多播、尽力而为和无连接的特性。
在此背景下,dds 实时发布订阅(real-time publish subscribe,rtps)协议应运而生,并被设计为能够在多播和无连接的尽力而为传输(如udp/ip)上运行,该协议主要功能包括:
· 性能和服务质量属性,可在标准ip网络上为实时应用程序实现最大努力和可靠的发布-订阅通信
· 容错性,允许创建无单点故障的网络
· 可扩展性,允许在不破坏向后兼容性和互操作性情况下使用新服务扩展和增强协议
· 即插即用连接,以便自动发现新的应用程序和服务,应用程序可以随时加入和离开网络,而无需重新配置
· 可配置性,允许平衡每次数据交付的可靠性和及时性要求
· 模块化允许,简单设备实现协议的一个子集,并且仍然参与网络
· 可扩展性,使系统能够潜在地扩展到非常大的网络
· 类型安全(type-safety),以防止应用程序编程错误影响远程节点的操作
rtps层的位置如下图1所示,该层位于以数据为中心的发布订阅(data-centric publish subscribe,dcps)层和传输层之间。应用程序将数据对象(data object)传递给dcps层,dcps层通过历史缓存(historycache)将数据传递给rtps层,rtps层以rtps消息(message)的形式将序列化后的数据传递给传输层进行传输。
今天我们就来详细了解一下dds实时传输协议——rtps。
1、核心概念
域:表示一个包含一组参与者的单独通信平面,所有rtps实体都与一个rtps域关联。
域参与者:表示rtps端点的拥有者,与dcps层的域参与者相映射。
rtps端点:分写入者端点和读取者端点两类。写入者通知在线状态、并将域内本地可用的数据发送给读取者,读取者可以请求并确认数据。
rtps消息:rtps读取者端点和写入者端点之间交换数据的结构和内容。
缓存变更:代表数据对象的变更。
历史缓存:是dcps层和rtps层之间交互接口的一部分。在写入者端,它包括数据对象变更的部分历史记录;在读取者端它包括可存储的部分数据对象变更。历史缓存的内容取决于dds qos策略以及读取者的通信状态。
2、rtps消息
rtps 消息由固定长度的报头(header)和可变数量的子消息(submessage)组成。其中,每个rtps消息可以包括可变数量的子消息。消息总长度由下层的传输协议确定,目前rtps协议中应用udp/ip作为传输层协议。rtps消息的组成如下图所示:
3、消息报头
消息报头必须存在于每个消息的开头,用以识别rtps消息、协议版本和中间件所属供应商,主要包括协议、协议版本、全局唯一标识符前缀三个字段。其中协议字段用于标识消息属于rtps消息,全局唯一标识符前缀被消息中所有子消息共用,表示所属的参与者。
4、子消息
每个子消息包括两部分,即子消息报头(submessageheader)和一组子消息元素(submessageelement)。子消息报头包括子消息标识符、子消息标志、子消息长度三部分。其中,子消息标识符是rtps中规定的用于标识特定子消息类型的值;子消息标志用于标识子消息的字节序及与具体子消息类型相关的标志位信息;子消息长度不包括子消息报头的长度。rtps支持多种类型的子消息元素,常用的子消息元素如下图3所示:
5、消息分类
根据子消息与rtps实体的关系及对消息接收器的影响,分为实体子消息和解释器子消息两大类,常用的rtps子消息可细分如下表1所示。
不同子消息在组成上的差异主要体现在三个方面,即子消息标志、子消息长度、子消息元素组合。以数据子消息为例,数据子消息的布局如下图4所示:
图4 数据子消息的布局
其中:
▷ 子消息标志:
• e标识消息的字节序;
• q标识子消息中是否有内联qos参数;
• d标识本消息的负载字段是否包含数据对象的序列化值;
• k标识本消息的负载字段是否包含数据对象的关键字序列化值;
• n标识负载的序列化是否已按照当前使用标准实施。
▷ readerid标识相关的读取者;
▷ writerid标识相关的写入者实体;
▷ writersn 标识写入者赋予变更的序列号;
▷ inlineqos标识内联的qos参数(仅在q=1时有效);
▷ serializedpayload标识负载的类型:
• 当d=1时此字段包含数据对象的序列化值;
• 当k=1时此字段包含数据对象关键字的序列化值;
• d和k不能同时置1。
6、序列化负载
序列化负载包括报头和内容两部分。其中,报头由表示标识符和表示选项组成,表示标识符规定了数据表示形式,表示选项部分目前未使用,全部置0。常用的端点表示标识符如下表2所示:
以内置端点序列化负载为例,对于主题名称为square、主题类型为shapetype的dds数据读取者,在端点发现过程中声明该数据读取者传输的数据子消息序列化负载如下图所示。
图5 序列化负载举例
由上图可知,表示标识符为pl_le,即采用小端表示(图中黑色方框);数据读取者的端点guid为c0:a8:02:05:00:00:3a:20:00:00:02:80:00:00:07(图中绿色方框);目的地顺序qos的类型为基于源时间戳(图中橙色方框);截止期限qos为3秒(图中蓝色方框)。
参考文献:
[1]dds: data-distribution service for real-time systems version 1.4.
[2]dds-rtps: data-distribution service interoperability wire protocol version 2.5.
[3]dds-xtypes: extensible and dynamic topic-types for dds version 1.3.
[4]corsaro a , schmidt d . the data distribution service - the communication middleware fabric for scalable and extensible systems-of-systems[j]. chapters, 2012.
关注怿星科技公众号,获取更多资讯