前言
FastDDS使用的端口默认情况下是通过计算得来的,组播端口使用计算出的端口号,单播端口如果被占用,会在默认端口号开始的一定范围内找到一个未使用的端口作为单播端口。
在介绍DDS发现机制之前,我们需要先来了解一下常用的UDP端口号是如何计算的。
计算公式
Symbol | Meaning | Default value | QoS field |
---|---|---|---|
DG | DomainID gain | 250 | wire_protocol().port.domainIDGain |
PG | ParticipantId gain | 2 | wire_protocol().port.participantIDGain |
PB | Port Base number | 7400 | wire_protocol().port.portBase |
offsetd0 | Additional offset | 0 | wire_protocol().port.offsetd0 |
offsetd1 | Additional offset | 10 | wire_protocol().port.offsetd1 |
offsetd2 | Additional offset | 1 | wire_protocol().port.offsetd2 |
offsetd3 | Additional offset | 11 | wire_protocol().port.offsetd3 |
Traffic type | Well-known port expression | |
---|---|---|
Metatraffic multicast | PB + DG * domainId + offsetd0 | 7400 + 250 * domainId + 0 |
Metatraffic unicast | PB + DG * domainId + offsetd1 + PG * participantId | 7400 + 250 * domainId + 10 + 2 * participantId |
User multicast | PB + DG * domainId + offsetd2 | 7400 + 250 * domainId + 1 |
User unicast | PB + DG * domainId + offsetd3 + PG * participantId | 7400 + 250 * domainId + 11 + 2 * participantId |
- Metatraffic都是偶数端口,User的都是奇数端口。
- 只要domain id相同,多播的端口就相同,这也是为什么相同domain id下的subscriber和publihser能相互发现,不同domain id 是通过端口隔离的。
- TCP不支持组播,UDPv4默认的组播地址为 239.255.0.1,获取default metatraffic multicast locator的时候,优先从非shm transport获取,其他所有的transport都获取不到default locator, 并且存在shm transport 时从shm transport获取, 默认的组播地址为’M’+ host id。
- builtin的initialPeersList未配置时使用metatrafficMulticastLocatorList。
- 如果没有设置白名单,每个合法的IP地址都会对应生成一个用于传输数据的locator,设置白名单后,使用白名单中包含的本机地址生成locator。
- 如果设置了intraprocess only,元数据单播,用户数据单播多播端口均删除,仅保留元数据多播locator。intra发送数据在进程内,不需要transport。