返回目录

ROS2-DDS底层通信机制简介

ROS2

ROS2基于DDS进行通信,DDS(Data Distribution Service,数据分发服务)是一套通信协议和API标准,针对这一标准开发出了一系列供应商的DDS实现。在DDS规范中有两份基本文档:

  • DDS Specification:描述了以数据为中心的DDS发布-订阅模型。该规范定义了API和通信语义(行为和服务质量),使消息从消息生产者有效地传递到匹配的消费者。
  • DDSI-RTPS:描述了RTPS(Real Time Publish Subscribe Protocol)协议。该协议通过UDP等不可靠的传输,实现最大努力(Best-Effort)和可靠(Reliable)的发布-订阅通信。RTPS是DDS实现的标准协议,它的目的和范围是确保基于不同DDS供应商的应用程序可以实现互操作。

DDS实现通常以DDSI-RTPS为基础,RTPS一般默认运行在UDP之上,但也可使用TCP

DDS网络栈

DDS核心概念

  • Domain:代表一个通信平面,由Domain ID唯一标识,只有在同一个领域内的通信实体才可以通信
  • Domain Participant:同一数据域内的通信成员
  • Topic:是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType)
  • DataWriter:数据写入者,类似缓存,把需要发布的主题数据从应用层写入到DataWriter中;
  • DataReader:数据读取者,类似缓存,把订阅的主题数据从DataReader中读出到应用层;
  • Publisher:发布者,发布主题数据,至少与1个DataWriter关联,通过调用DataWriter的相关函数将数据发出去;
  • Subscriber:订阅者,订阅主题数据,至少与1个DataReader关联,通过调用DataReader的相关函数将数据读出来;

简介

DDS使用域作为网络标识。

域(domain)是DDS中的一个虚拟网络号,用于隔离不同的网络,每个网络中有多个节点参与者(participant),默认情况下每个参与者会开启四个UDP端口,两个用于单播,两个用于组播。domain ID和participant ID通过特定计算方法计算出应使用的这四个UDP端口号,默认组播IP固定为239.255.0.1

核心协议RTPS简介

TCP可靠,但握手、重传、拥塞控制导致了延迟,无法保证实时性

UDP快速,但只发不管,无法保证可靠性

RTPS(Real-Time Publish-Subscribe)在UDP之上通过心跳包(Heartbeat)和确认包(ACK/NACK)来自己管理丢包重传,从而在享受 UDP 高速度的同时,实现可控的可靠性。

RTPS流程

当一个新节点加入网络中通信时,会发生以下过程:

一、参与者发现协议(Participant Discovery Protocol,PDP

新加入的节点会根据Domain ID计算出组播端口和组播IP地址,然后向组播IP发送一个SPDP(Simple Participant Discovery Protocol)包,告知网络中其他节点它的存在。其中包含该节点的唯一标识符、未来接收单播数据的IP和端口(Locator),以及默认QoS设置。之后节点周期性地发送SPDP包,告知网络中其他节点它仍然存在。

同一Domain的老节点监听到新节点的信息,将其记录到自己的本地参与者路由表中,并根据新节点留下的地址向其单播发送自己的SPDP包,新节点将收到的SPDP包记录到自己的参与者路由表中。

这样,所有节点都知道了网络中其他节点的存在,并且可以通过单播发送数据。

二、端点发现协议(Endpoint Discovery Protocol,EDP

每个节点在加入网络时,会根据自己的发布者和订阅者信息,向其它参与者IP单播发送SEDP(Simple Endpoint Discovery Protocol)包,告知网络中其他节点:“我创建/订阅名为some_topic的主题,数据类型为some_type,QoS策略是Reliable、...”

若两个节点的主题名、数据类型匹配,QoS策略兼容,则在底层为对方分配专属的网络队列缓冲区(如果在同一台机器上,则可能使用共享内存双向序列)

三、数据传输

新节点融入DDS的数据总线后,底层网络会通过单播或组播将数据推送到匹配的订阅者节点,根据QoS策略的不同,数据传输分为两种模式:

Best-Effort模式

发布端打包数据送出,无重传,速度快但不可靠。

Reliable模式

发布端每隔一段时间发送心跳包(Heartbeat),告知订阅端自己缓冲区内的最大序列号,订阅端收到心跳包后,向发布端发送ACK/NACK包,告知已接收和未接收的数据

四、节点退出

正常退出时会向网络中的其他节点宣告,其它节点清理路由表中该节点的记录,释放资源。若是异常退出,其它节点根据QoS的Liveliness策略,经过一段时间后将其清理。

RTPS安全

DDS-Security是OMG组织制定的DDS安全标准,定义了DDS通信的安全机制,包括身份认证、访问控制、数据加密和数据完整性等。与一般的网络安全类似。

  • 身份认证:确保身份(Domain Participant)的真实性。通常使用PKI(Public Key Infrastructure)和证书管理实现身份验证。在此过程中协商后续通信使用的密钥
  • 访问控制:权威机构签名Permissions.xml文件,检查节点是否允许:加入域、发布/订阅特定主题、使用特定QoS策略等。
  • 数据加密与完整性:使用加密插件对数据进行加密和签名

DDS供应商漏洞参考:

留言