文章目录
- [FastDDS 路由可达的跨网段通信支持说明](#FastDDS 路由可达的跨网段通信支持说明)
-
- [1. 为什么跨网段通信需要额外配置?](#1. 为什么跨网段通信需要额外配置?)
- [2. 核心解决方案](#2. 核心解决方案)
-
- [方案 A:Discovery Server(推荐)](#方案 A:Discovery Server(推荐))
- [方案 B:Initial Peers(单播列表)](#方案 B:Initial Peers(单播列表))
- [方案 C:TCP 传输层](#方案 C:TCP 传输层)
- [3. 方案详解与配置](#3. 方案详解与配置)
-
- [3.1 使用 Discovery Server 模式](#3.1 使用 Discovery Server 模式)
- [3.2 使用 Initial Peers(单播配置)](#3.2 使用 Initial Peers(单播配置))
- [3.3 穿越 NAT 的特殊处理 (External Locators)](#3.3 穿越 NAT 的特殊处理 (External Locators))
- [4. 实施前提与检查清单](#4. 实施前提与检查清单)
- [5. 总结](#5. 总结)
FastDDS 路由可达的跨网段通信支持说明
在分布式系统中,由于网络架构的复杂性,通信节点往往分布在不同的子网或网段中。默认情况下,FastDDS 使用 简单发现协议 (Simple Discovery Protocol, SDP) ,该协议依赖 组播 (Multicast) 来发现对端。然而,在跨网段环境下,路由器通常会屏蔽组播流量,导致处于不同网段的节点无法相互"看见"。
本文将深入探讨 FastDDS 实现跨网段通信的几种核心方案、前提条件及具体配置方法。
1. 为什么跨网段通信需要额外配置?
在同一局域网(LAN)内,FastDDS 通过以下流程建立连接:
- 组播发现 :参与者向特定组播地址(如
239.255.0.1)发送公告。 - 端到端确认:收到公告的参与者交换单播地址,建立点对点通信。
挑战:跨网段(跨路由器/防火墙)时,组播包被拦截。为了解决这个问题,我们需要将"自动发现"改为"定向发现"或"中转发现"。
2. 核心解决方案
方案 A:Discovery Server(推荐)
这是最健壮的方案。引入一个中心化的"发现服务器",所有节点(Client)主动向服务器注册自己的位置。
- 优点:极大地减少网络带宽占用,支持复杂的 NAT 和跨网段环境。
- 适用场景:节点数量多、网络环境复杂的生产环境。
方案 B:Initial Peers(单播列表)
手动指定远程节点的 IP 地址。不再依赖组播寻找邻居,而是直接向已知的 IP 地址发送单播探测。
- 优点:配置简单,无需额外运行服务器程序。
- 适用场景:IP 地址固定、节点数量较少的场景。
方案 C:TCP 传输层
FastDDS 默认使用 UDP。在某些防火墙规则极其严格或需要通过 WAN 通信的场景下,可以切换为 TCP。
3. 方案详解与配置
3.1 使用 Discovery Server 模式
这种模式需要运行一个 fastdds discovery 实例作为 Hub。
第一步:启动服务器
你可以通过命令行快速启动:
bash
# 设置服务器 ID 为 0,监听 11811 端口
fastdds discovery -i 0 -p 11811
第二步:配置客户端 (XML)
客户端需要知道服务器的 IP 和端口。
xml
<profiles>
<participant profile_name="client_profile">
<rtps>
<builtin>
<discovery_config>
<discoveryProtocol>CLIENT</discoveryProtocol>
<discoveryServerList>
<RemoteServer locator_registration_indicator="true">
<metatrafficUnicastLocatorList>
<locator>
<udpv4>
<address>192.168.10.100</address> <port>11811</port>
</udpv4>
</locator>
</metatrafficUnicastLocatorList>
</RemoteServer>
</discoveryServerList>
</discovery_config>
</builtin>
</rtps>
</participant>
</profiles>
3.2 使用 Initial Peers(单播配置)
如果你不想运行服务器,只需在 XML 中列出对端 IP 即可。
xml
<profiles>
<participant profile_name="unicast_profile">
<rtps>
<builtin>
<initialPeersList>
<locator>
<udpv4>
<address>192.168.20.50</address> </udpv4>
</locator>
</initialPeersList>
</builtin>
</rtps>
</participant>
</profiles>
3.3 穿越 NAT 的特殊处理 (External Locators)
如果节点位于路由器后方(进行了 NAT 转换),节点上报的"私网 IP"是无法被外网访问的。此时需要配置 external_locators。
- 条件:路由器需做端口映射(Port Forwarding)。
- 配置:告诉 FastDDS 你的"公网/外网 IP"是什么。
xml
<bin_property>
<name>fastdds.external_address</name>
<value>203.0.113.10</value> </bin_property>
4. 实施前提与检查清单
在配置跨网段通信前,请务必确认以下物理条件:
- 路由可达性 :使用
ping确认两个网段的单播 IP 是否互通。 - 防火墙准入:
- UDP 端口:确保开放了 Discovery Server 端口(默认 11811)或计算得出的 RTPS 端口。
- 计算公式:默认情况下,端口与 Domain ID 有关。建议跨网段时手动指定固定端口以简化防火墙配置。
- TTL (Time To Live):如果仍想尝试组播跨网段(虽然不推荐),需要增大组播 TTL 值(默认通常为 1,即限制在局域网)。
5. 总结
- 局域网内:用默认的简单发现(Simple Discovery)。
- 跨网段、静态 IP :使用
Initial Peers。 - 复杂拓扑、动态节点 :首选
Discovery Server。 - 跨公网/严格防火墙 :使用
TCP Transport并配置External Locators。
通过合理配置发现机制和定位器(Locators),FastDDS 可以突破物理子网的限制,构建高性能的全球分布式通信网络。