在DDS 中间件上实现双冗余网卡切换的方法

2023-09-17 12:26赵昶宇
科技与创新 2023年17期
关键词:中间件实时性网卡

赵昶宇

(天津津航计算技术研究所,天津 300308)

以太网技术作为一种成熟且抗干扰能力强的技术,具有构建成本低、物理及数据协议完善、传输速率较高等优良特性,在VxWorks 嵌入式系统中得到广泛应用。由于VxWorks 嵌入式系统对以太网具有高实时性和高可靠性的要求,传统的单一网卡一旦出现故障或受损时,很可能导致整个网络系统瘫痪,严重降低了以太网传输的可靠性和实时性。因此,目前通常采用一种网卡故障保护机制,即对当前工作网卡进行冗余热备份,当工作网卡出现故障时,由冗余网卡接替完成网络通讯任务。

DDS 数据分发服务作为网络数据通讯的核心技术,它能够保证分布式系统可靠实时地交换分配群体数据,其传输能力比通常的战术数据链高几个数量级。DDS 必须确保在极少的时间和不限制网络中的报告数据容量的条件下,高度可靠地传输数据。为了保证DDS中间件更加可靠稳定运行在VxWorks 操作系统中,防止因单独网卡故障导致DDS中间件不能正常工作的情况发生,通常DDS 中间件在双冗余网卡上工作。由于DDS 中间件具有强实时性和QoS 策略的特点,VxWorks 操作系统中大多数双冗余网卡的切换方法会导致网卡不能正常切换,或者切换后DDS 中间件不能正常通信。因此,传统的双冗余网卡切换的方法不能直接应用在DDS 中间件上。

为了解决VxWorks 系统中基于DDS 中间件的双冗余网卡切换实时性和可靠性问题,本文提出在DDS中间件上实现双冗余网卡切换的方法。这些方法能够保证双冗余网卡切换时DDS中间件仍然能正常进行网络通信,同时缩短网卡切换时间,提高网络数据传输的可靠性。

1 DDS 中间件技术介绍

DDS 是以数据为中心,定义描述网络环境下数据内容/交互行为和服务质量要求的标准技术。它提供了一个独立于平台的框架模型,为分布式实时系统发布、传递和接收数据的接口和行为定义了统一标准。应用程序可以基于该中间件框架实时发布信息,并根据需要订阅信息[1]。

1.1 DDS 架构

DDS 规范包含以下2 个层次的接口:①以数据为中心的DCPS(Data-CentricPublish-Subscribe,发布-订阅层)。该层位于低层,是DDS 的核心和基础,提供了DDS 通信的基本服务,用于完成数据的订阅和发布。②DLRL(Data Local Reconstruction Layer,数据本地重构层)。该层位于高层,是可选的,它建立在DCPS 的基础上,将DCPS 层提供的服务进行了抽象,当有数据更新后自动重组数据,并通知所有订阅者更新本地数据。

DDS 架构示意图如图1 所示。

图1 DDS 架构示意图

1.2 DDS 通信模型

DDS 是一个以数据为中心的中间件协议和API(Application Programming Interface,应用程序编程接口)标准,用户只关心自己想要的数据,数据通过主题(Topic)进行标识。这样发布者(Publisher)根据主题发布数据,订阅者(Subscriber)根据自己感兴趣的主题订阅数据。通过上述方式建立了以数据为中心的发布-订阅模型DCPS。DDS 的通信模型如图2 所示。

图2 DDS 通信模型

在DDS 通信模型中,主题(Topic)是数据的抽象概念,关联相应数据的数据类型。把所有的Topic 集合在一起,建立了一个虚拟的全局数据空间“Global Data Space”。数据写入者(Data Writer)相当于缓存,将需要发布的主题从应用层写入数据写入者(Data Writer)中。数据读取者(Data Reader)也相当于是一种缓存,从订阅者获取主题内容,并发送给应用层。发布者(Publisher)通过调用Data Writer 的相关函数发布主题数据,订阅者(Subscriber)只需负责订阅主题数据。

1.3 QoS 策略

应用程序使用QoS 策略控制、管理和优化在网络中传输的数据流,目前共支持22 种QoS 策略。每种策略都可以应用在不同的角色上,而针对同一角色,可单独使用一种QoS,也可以组合使用多种QoS 策略。

QoS 是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS 服务实现这种行为要求,尽可能地满足客户对通信质量的要求。DDS 定义QoS策略使它对复杂网络环境的适应性和鲁棒性大大增强,优化网络传输质量,QoS 可以理解为数据提供者和接收者之间的合约。

DDS 中几种常用并且重要的QoS 参数有可靠性、数据的持久度、数据的历史记录、周期数据的超时、基于时间的过滤、数据的有效期、数据的所有权、分区、资源限制等特点。

2 VxWorks 下双冗余网卡切换

为了确保VxWorks 系统下网络传输的健壮性和可靠性,通常在一块电路板上集成2 块完全相同的网卡芯片。对于上层应用,这2 个网卡应该对它呈现“单网卡”特征。为了满足这一特征,2 个网卡必须具有完全相同的IP(Internet Protocol,互联网协议)地址和MAC(Media Access Control,媒体访问控制)地址。若2 个网卡的物理地址不一致,在进行网卡切换时,将会引起协议栈中ARP(Address Resolution Protocol,地址解析协议)绑定表的变化,重新对应ARP 绑定表中IP 地址与网卡物理地址的关系,必然造成2 个网卡之间的切换时间变长[2]。而每个网卡芯片出厂前配置的48 位MAC 地址是全球唯一的,因此,需要通过软件处理的方式使这2 个网卡的MAC 地址相同。

在VxWorks 系统中可以通过如下方式获取网卡的MAC 地址: muxIoctl(muxDevAcquire("fei" , 0),EIOCGADDR,(caddr_t)kkphyaddr);其中“fei”是网卡接口类型,在数组kkphyaddr 中保存该网卡的MAC地址值,即网卡的 MAC 地址为kkphyaddr[0]:kkphyaddr[1] : kkphyaddr[2] : kkphyaddr[3] :kkphyaddr[4]:kkphyaddr[5],kkphyaddr 数组中每个元素的值代表8 位MAC 地址。

获取到其中一个网卡MAC 地址后,只需要将2个网卡设置成完全相同的MAC 地址即可,代码如下:

sprintf(buf,"fei0 lladdr %s%s",hostmac);/*hostmac 存放MAC 地址的字符串*/

ifconfig(buf);/* 设置fei0 网卡的MAC 地址*/

sprintf(buf,"fei1 lladdr%s%s",hostmac);

ifconfig(buf);/* 设置fei1 网卡的MAC 地址*/

VxWorks 系统中双冗余网卡的切换时间包括网卡故障检测时间和网卡进行切换动作的时间。为了尽可能减少双冗余网卡故障时的切换时间,应及时检测网卡的故障。通常来讲,从网卡驱动层来检测并判断网卡芯片的状态寄存器的值是否能最大压缩网卡故障检测的时间[3]。在VxWorks 系统启动后,加载网卡驱动,初始化网卡芯片,并配置好网卡的控制结构后,启动一个监控任务。该监控任务负责不间断查询当前网卡状态寄存器的值,并反馈查询结果。

3 DDS 中间件上实现双冗余网卡切换

VxWorks 系统上电后进入网卡驱动的任务监测程序后,首次判断到网卡状态寄存器的链路状态位被置位时,表明网卡的链路状态发生变化。此时,若监测到网卡A 的链路状态正常,则用ipAttach()函数挂载A网卡,用ifconfig()函数启动A 网卡,然后用ipAttach()函数挂载B 网卡,用ifconfig()函数关闭B 网卡;若监测到网卡B 的链路状态正常,则用ipAttach()函数挂载B 网卡,用ifconfig()函数启动B 网卡,然后用ipAttach()函数挂载A 网卡,用ifconfig()函数关闭A 网卡。该步骤的目的是在系统上电时,初始化2 个网卡的工作状态。

网卡的初始化工作完成后,当前工作网卡为A 网卡,判断到网卡状态寄存器的链路状态位被置位时,监测到网卡A 的链路状态正常,则不用切换网卡;若监测到网卡A 的链路状态不正常,需判断网卡B 的链路状态,若网卡B 的链路状态正常,则系统切换到网卡B 进行工作;当前工作网卡为B 网卡,若判断到网卡状态寄存器的链路状态位被置位时,监测到网卡B的链路状态正常,则不用切换网卡;若监测到网卡B的链路状态不正常,需判断网卡A 的链路状态,若网卡A 的链路状态正常,则系统切换到网卡A 进行工作。若A、B 这2 个网卡的链路状态均不正常,则向上层用户程序汇报。

当网卡切换时,若当前故障网卡为A 网卡,备用网卡为B 网卡,且备用网卡的链路状态正常,则先用ifconfig()函数关闭A 网卡,然后用ipAttach()函数挂载B 网卡,用ifconfig()函数启动B 网卡;若当前故障网卡为B 网卡,备用网卡为A 网卡,且备用网卡的链路状态正常,则先用ifconfig()函数关闭B 网卡,然后用ipAttach()函数挂载A 网卡,用ifconfig()函数启动A网卡。

需要特别值得注意的是,在DDS 中间件中进行双冗余网卡切换时,一定不能调用ipDetach()函数卸载故障网卡,而只能用ifconfig 命令将故障网卡的连接状态由“up”状态设置为“down”状态,即只是关闭该故障网卡,否则,切换后DDS 的网络通讯就会中断。这是由于DDS中间件的强实时性和QoS服务质量策略导致的,这也是与传统双冗余网卡切换方法的不同之处。

4 结束语

针对VxWorks 操作系统中大多数双冗余网卡的切换方法会导致网卡不能正常切换,或者切换后DDS 中间件不能正常通信的问题,本文提出了一种在DDS 中间件上实现双冗余网卡切换的方法。利用该方法修改网卡驱动程序,在驱动程序的任务监测程序中监测网卡寄存器的链路状态。将2 个网卡设置为相同的MAC地址,当监测到当前网卡链路发生故障时,关闭当前网卡,挂载备用网卡,然后启动备用网卡开始工作;当网卡发生故障时,不卸载故障网卡,而只是关闭故障网卡。这种做法不仅缩短了网卡切换的时间,更重要的是,由于DDS 中间件强实时性和QoS 服务质量策略的特点,一旦DDS 中间件监测到当前网卡被卸载,它无法找到当前的网络设备,导致通信被迫中断。因此,该方法极大提高了DDS 中间件网络通信的可靠性和稳定性。

猜你喜欢
中间件实时性网卡
基于规则实时性的端云动态分配方法研究
Server 2016网卡组合模式
RFID中间件技术及其应用研究
基于VanConnect中间件的设计与开发
基于虚拟局域网的智能变电站通信网络实时性仿真
航空电子AFDX与AVB传输实时性抗干扰对比
挑战Killer网卡Realtek网游专用Dragon网卡
中间件在高速公路领域的应用
读编往来
无线网卡种类有什么区别?