Fast DDS的传输逻辑首先明确收方和发方是谁,收方/发方地址和端口的生成规则是什么,也就是侦听、通告的逻辑规则。其次Fast DDS的底层传输依赖于Transport Layer,是独立UDP/TCP之上传输接口层。
一、侦听
侦听定位器用于接收DomainParticipant上的传入流量,是DDS发现机制和数据传输机制的关键所在。这些定位器可以根据通信类型和数据性质进行分类。
依据通信类别可以划分为:多播定位器和单播定位器,多播定位器侦听多播通信数据,单播定位器侦听单播通信数据。依据数据类别可以划分为:元数据侦听器和用户数据侦听器。元数据侦听器用于接收元数据流量信息,通常由内置端点用户执行发现机制。用户数据侦听器用于接收用户主题的业务流量数据。
Transport Layer子模块默认定义了一组规则来计算默认定位器的知名端口,以便域参与者可以与这些默认定位器通信。当定位器配置为端口号0时,Transport Layer也会自动选择已知端口。
已知侦听端口的计算采用下表计算规则:
流量类型 | 端口计算规则 |
---|---|
元数据多播 | PB+DG*domainId+offsetd0 |
元数据单播 | PB+DGdomainId+offsetd1+PGparticipantId |
用户数据多播 | PB+DG*domianId+offsetd2 |
用户数据单播 | PB+DGdomainId+offsetd3+PGparticipantId |
下表解释了这些规则中使用的值。可以使用DomainParticipantQoS上的WireProtocolConfigQoS的端口成员修改这些默认值。
符号 | 意义 | 默认值 |
---|---|---|
DG | DomainID gain | 250 |
PG | Participant gain | 2 |
PB | Port Base number | 7400 |
offset0 | Additional offset | 0 |
offset1 | Additional offset | 10 |
offset0 | Additional offset | 1 |
offset0 | Additional offset | 11 |
用户可以使用DomainParticipantQos向DomainParticipant添加自定义侦听定位器。根据添加定位器的字段,它将被视为多播、单播、用户或元流量定位器。
二、通告
为了进行通信,DDS实体需要交换可以到达的地址和端口列表。除了默认通告的定位器(对应于应用程序运行的主机中的网卡地址)之外,当路由规则已相应设置时,用户可以使用主机上其他网络上的地址和端口配置其他定位器。
将根据侦听定位器构建通告定位器的默认列表:
如果定位器的地址字段为空地址(即,对于UDPv4为0.0.0.0),则将构建主机网络接口的每个相同地址类型和端口的通告定位器。
如果定位器的地址字段不是空地址,则将通告具有该地址的单个定位器。
用户可以为每个单播定位器列表配置一组外部定位器:
外部定位器由标准定位器字段(种类、地址和端口)以及以下属性组成:
externality(外部属性),表示从应用程序运行的主机到外部定位器表示的LAN的跳数。
cost(成本),表示在同一外部属性水平上相对于其他定位点的通信成本。
mask(掩码),由外部定位器表示的LAN上有效位数的掩码。
三、底层传输
Transport Layer是DDS底层传输层的实现,它提供DDS实体之间通信服务,负责通过物理传输实际发送和接收消息。DDS Layer层以及RTPS Layer层服务于用户数据和发现流量通信,DDS Layer层本身是独立于传输的,它定义了一个传输API,并且可以在任何实现该API的传输插件上运行。这样,它就不受限于特定的传输方式,应用程序可以选择最适合其要求的传输方式,或者创建自己的传输方式。
Transport Layer子模块实现了五种传输方式:
UDPv4:IPv4上的UDP数据报通信。如果没有给出特定的传输配置,默认情况下会在新的DomainParticipant上创建此传输。
UDPv6:IPv6上的UDP数据报通信。
TCPv4:IPv4上的TCP数据流通信。
TCPv6:IPv6上的TCP数据流通信。
SHM:在同一主机上运行的实体之间的共享内存通信。如果没有给出特定的传输配置,默认情况下会在新的DomainParticipant上创建此传输。
在某些设置下,进程内数据传递和数据共享传递也可用于在实体之间发送消息。Transport Layer子模块不同传输方式如下图所示: