DDS消息中间件在通信时既支持TCP也支持UDP具体采用哪种传输协议取决于多种因素包括应用场景、QoS服务质量配置以及底层DDS实现的具体设计。这两种协议各有其适用场景DDS通过其灵活的架构和丰富的QoS策略来适配不同的需求。1. DDS支持的传输协议根据FastDDS等主流实现的特性DDS的通道层支持多种传输协议 。主要包含传输协议描述典型应用场景UDP无连接、尽力而为的传输协议具有低延迟、低开销的特点。对实时性要求高、允许少量数据丢失的场景如传感器数据流、视频流 。TCP面向连接、可靠的传输协议保证数据顺序和可达性但延迟和开销相对较高。要求数据可靠、完整传输的场景如关键控制指令、配置信息同步 。SHM (共享内存)在同一台主机内的进程间进行通信速度极快零拷贝。同一节点上不同进程或线程间的高性能数据交换 。TCPv4/TCPv6, UDPv4/UDPv6分别对应IPv4和IPv6网络环境下的TCP和UDP协议。跨网络通信适应不同的网络基础设施 。DDS的设计允许在同一应用甚至同一数据流中根据不同的数据主题Topic或服务质量要求混合使用这些传输方式 。2. 协议选择的决定因素选择UDP还是TCP主要由以下几个核心因素决定2.1 QoS策略配置QoS策略是DDS的核心直接决定了通信的行为和底层传输协议的选择 。可靠性要求 (ReliabilityQosPolicy)BEST_EFFORT_RELIABILITY_QOS(尽力而为): 此策略不保证数据一定送达通常与UDP协议配对使用以追求最低的延迟和最高的吞吐量 。RELIABLE_RELIABILITY_QOS(可靠传输): 此策略保证数据可靠、有序地送达订阅者。它通常基于TCP协议实现因为TCP本身提供了重传、确认和排序机制。值得注意的是一些DDS实现如FastDDS也能在UDP之上通过应用层协议如RTPS实现可靠传输但这通常会增加复杂性和开销。DataWriter和DataReader的QoS必须兼容才能建立连接兼容性如下表所示 DataWriter 可靠性策略DataReader 可靠性策略是否兼容BEST_EFFORT_RELIABILITY_QOSBEST_EFFORT_RELIABILITY_QOS是BEST_EFFORT_RELIABILITY_QOSRELIABLE_RELIABILITY_QOS否RELIABLE_RELIABILITY_QOSBEST_EFFORT_RELIABILITY_QOS是RELIABLE_RELIABILITY_QOSRELIABLE_RELIABILITY_QOS是实时性要求对于需要极低延迟的硬实时系统如机器人关节控制、飞行器姿态调整通常优先选择UDP并配合BEST_EFFORT可靠性策略避免TCP重传机制引入的不确定延迟 。对于软实时系统或对延迟有要求但更注重数据完整性的场景可以使用基于TCP的可靠传输并通过优化缓冲区、调整心跳间隔等QoS参数来平衡延迟和可靠性 。2.2 网络环境与通信范围本地通信 (同一主机): 即使配置为使用TCP或UDP数据包也会通过操作系统的回环接口Loopback进行传输不经过物理网卡速度非常快 。此时选择TCP或UDP的性能差异远小于网络传输。更优的选择是SHM共享内存它能完全绕过网络协议栈实现最高效的进程间通信 。广域网/不稳定网络: 在丢包率高、延迟大的网络中TCP的拥塞控制和重传机制可能导致性能急剧下降。此时采用基于UDP的定制可靠传输协议如DDS自身的RTPS over UDP有时能通过更激进的策略获得更好的表现但这需要仔细调优 。2.3 DDS实现与RTPS协议DDS标准定义了应用层的API和语义而实际的网络互通性由RTPSReal-Time Publish-Subscribe协议保障 。RTPS是DDS的Wire Protocol它可以在TCP或UDP上运行。RTPS over UDP: 这是最常见的配置尤其在对实时性要求高的领域如ROS 2默认使用Fast DDS的UDP传输。RTPS协议在UDP之上实现了发现、心跳、确认等机制可以在需要时提供应用层的可靠性。RTPS over TCP: 当需要穿越防火墙TCP端口更易配置或与仅支持TCP的遗留系统集成时会使用此方式。它利用TCP的流特性简化了RTPS的部分设计 。3. 配置示例与代码片段以下是一个简化的FastDDS QoS配置示例展示了如何为DataWriter设置传输协议和可靠性策略。// 示例创建一个使用UDP且为尽力而为可靠性的Publisher #include fastdds/dds/domain/DomainParticipant.hpp #include fastdds/dds/publisher/Publisher.hpp #include fastdds/dds/publisher/DataWriter.hpp #include fastdds/dds/publisher/qos/DataWriterQos.hpp #include fastdds/rtps/transport/UDPv4TransportDescriptor.h // 创建Participant和Publisher的代码省略... // 1. 创建DataWriter的QoS对象 eprosima::fastdds::dds::DataWriterQos writer_qos; // 2. 配置可靠性策略为“尽力而为”通常隐式选择UDP writer_qos.reliability().kind eprosima::fastdds::dds::BEST_EFFORT_RELIABILITY_QOS; // 3. 可选显式指定UDP传输并配置其参数 auto udp_transport std::make_sharedeprosima::fastdds::rtps::UDPv4TransportDescriptor(); udp_transport-sendBufferSize 65536; // 设置发送缓冲区大小 udp_transport-receiveBufferSize 65536; // 设置接收缓冲区大小 // 获取Participant的属性并添加自定义传输 eprosima::fastdds::dds::DomainParticipantQos participant_qos; // ... 初始化participant_qos ... participant_qos.transport().user_transports.push_back(udp_transport); // 4. 使用配置好的QoS创建DataWriter eprosima::fastdds::dds::DataWriter* writer publisher-create_datawriter(topic, writer_qos);注释此代码片段展示了在FastDDS中配置QoS的基本方法。通过设置reliability().kind来选择可靠性策略这间接影响了底层传输协议的选择。也可以显式创建并配置UDP传输描述符以实现更精细的控制 。4. 总结与最佳实践建议场景特征推荐传输协议关键QoS配置理由高频传感器数据如激光雷达点云UDPBEST_EFFORT_RELIABILITY, 调整HistoryQosPolicy的 depth容忍偶发丢帧追求最低延迟和最高吞吐量 。关键控制指令如紧急停止命令TCP(或可靠的RTPS over UDP)RELIABLE_RELIABILITY,DEADLINE_QOS必须保证指令100%可靠送达并可能要求定期心跳确认 。同一主机内进程通信SHM (共享内存)使用SHM传输描述符零拷贝性能远超基于套接字的TCP/UDP 。跨复杂网络如4G/5G车联网TCP或定制UDPLIVELINESS_QOS(设置租约期限),RESOURCE_LIMITS_QOSTCP更易穿透网络设备若用UDP需加强应用层心跳和重传逻辑以应对网络抖动 。核心结论DDS消息中间件不强制使用单一的TCP或UDP。它是一个高度可配置的系统允许开发者根据数据的重要性、实时性要求和网络条件通过QoS策略为每个数据主题Topic选择最合适的传输方式。在实际工程中通常会在同一个DDS域Domain内混合使用多种传输协议以满足不同子系统或数据流的差异化需求 。设计时应首先明确数据的可靠性和实时性等级再据此选择对应的QoS策略而底层传输协议TCP/UDP往往是该策略选择的自然结果。参考来源DDS通信协议与安全实践通讯协议篇底层TCP/UDP上层MQTT、HTTP、CoAP、DDS、AMQP、JMS实现层RabbitMQ、ActiveMQ、KafkaDDS通信协议与安全实践ros2通信核心之DDS简介DDS通信原理深度解析学习笔记关于DDS中TCP与UDP传输方式的思考