transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。
使用DomainParticipant的GuidPrefix_t来区分是否在同一个主机运行。同一主机中两个participants的GuidPrefix_t的前四个字节是相同的。可以通过API:is_on_same_host_as() 来检查这一条件。
使用共享内存的原因如下:
- 支持较大消息,网络通信因为协议规定需要进行分片,共享内存不存在这个问题
- 减少内存拷贝:发送相同数据到不同端点时,只需要共享给所有目的端点
- 减少操作系统负载:初始化完成之后,相比较网络通信,共享内存的系统调用更少
概念
- Segment:每个DomainParticipant都会创建一个segment作为共享内存用于读写。每个segment都有一个16位的UUID唯一标识这一块内存
- Segment Buffer:在Segment中分配的内存,用于存放DDS消息。Domainparticipant写入segment的每条消息都会放到不同的buffer中。
- Buffer Descriptor:Segment Buffer 的指针,包含了segment id和segment buffer基于segment base的偏移,共享内存的通信值发送Buffer Descriptor,避免的消息体的拷贝,接收方的domainparticipant可以通过segment id和偏移访问到消息
- Port:收发Buffer Descriptor的通道。是一个环形buffer,任意domainparticipant都可以读写。有一个唯一的32位id标识Port,这个id在服务发现阶段会被分享给远端。DomainParticipant会为接收Port创建一个Listener,所以当Port推送一个新的Buffer Descriptor的时候会收到通知。
- Port Health Check:每次DomainParticipant读或写一个Port的时候会进行Port Health Check检查它的正确性。这是因为有可能进程正在使用Port的时候挂了,此时Port是无效的

代码
时序图

类图
