本文将在讨论硬件抽象层基本结构的基础上,提出一种适用于大规模接入汇聚路由器的HAL的通用性软件结构设计及实现方式,提供高效、可靠的内部通信,并针对多用户接入数量不确定的情况,提出动态加载虚拟驱动模块的实现方法,增强路由器面向ACR接入方式的可用性。
1 硬件抽象层基本结构及功能实现
根据文献提出的方案,高性能路由器硬件抽象层可分为内部通信、虚拟驱动及设备管理三大模块,这三部分模块相互配合,共同完成面向实际的用户设备接口的功能模拟及硬件细节的屏蔽,并对其进行统一协调的管理。硬件抽象层对用户设备接口的功能模拟主要由虚拟驱动模块完成,包括数据包的收发及协议报文的预处理等工作,为上层协议软件提供标准的API函数;而对用户设备的接口管理则由上层网络管理软件通过设备管理模块对其进行管理配置及监控;内部通信模块运行于内部以太网络,协调各模块之间的功能接口,保证各从处理单元与主处理单元之间实时可靠的数据传输。其基本结构如图1所示。
图1 硬件抽象层基本结构示意图
根据各模块的功能可知,硬件抽象层内部通信模块是各分处理单元与主处理单元信息交互的重要传输通道。内部通信模块汇集各底层设备的数据并根据类型分流至各上层处理模块,同时,数据维护模块对虚拟设备及各处理单元的维护信息也需要通过内部通信模块进行。因此,内部通信模块采用何种基于内部以太网的数据传输实现方式,对路由器内部数据的实时、有效、可靠传输起着至关重要的作用。当前内部通信模块采用基于分隔符的TCP传输方式,在应用层数据包的起始部分附加有特定格式的分隔符和数据长度域,解决了由于Nagle算法产生的包粘滞问题。但该方式没能解决TCP传输方式的消耗过大、实时性不强的问题。同时,消除分割符恢复报文的完整性也增加了应用程序的处理复杂度,从而不可避免地增加系统的开销并降低系统的实时性。系统的实时性对于用户业务急剧增多的ACR路由器而言是一个迫切需要解决的问题。UDP是一个面向消息的传输协议,其最大数据缓冲区长度为8192~65536字节,满足一次传输一个完整报文的条件。在内部以太网中采用UDP传输方式具有明显的优势。但由于UDP协议的无连接性,导致它是一个不可靠传输,文中第二部分将讨论如何实现一种基于UDP的内部通信的可靠性传输机制。
硬件抽象层对用户设备接口的功能模拟主要通过虚拟驱动进行,路由器业务类型的扩展使得用户接口数量增多并呈现接入时间的不确定性,从而带来用户设备管理上的难度。针对此种情况,文中第三部分提出动态加载虚拟驱动模块的实现方法,增强路由器面向多用户接入方式的可用性。
2 基于UDP传输方式的内部通信的可靠性实现
内部通信模块处于硬件抽象层的底层,运行于内部交换网络,完成底层硬件与上层控制软件的数据传输,实现对底层硬件的初步屏蔽分离;针对分布式体系结构特点及多用户接入的业务需求,内部通信模块以ClientServer的方式分别运行于主处理单元模块及各线路接口单元模块上,采用UDP传输协议进行通信,主要基于以下几点考虑:
首先,UDP协议是一个无连接协议,传输数据之前源端与终端不需建立连接,因此不需维护连接状态。这样服务器端可以使用一个或几个端口同时向多个客户端发送消息,符合分布式结构体系的要求。
其次,UDP信息包很短,只有8个字节,相对于TCP的20个字节的信息包的额外开销很小,便于数据的快速传递。
再次,吞吐量不受拥塞控制算法的调节,只受应用软件生成数据的速率、传输带宽和计算机性能的影响,适用于内部以太网络的数据传输。
但由于UDP方式的无连接性,使得UDP传输的可靠性不强。而可靠性是内部通信模块所必须具有的性能,因此考虑在应用软件中实现UDP传输方式的可靠性保证,主要采用以下方式:
2.1 多线程无连接的C/S通信方式
服务器端运行在Linux操作系统下,采用多线程方式收发各类数据;客户端运行在Vxworks操作系统,采用多任务方式收发各类数据。这样由于多线程及多任务并行运行的特性,在内部以太网的传输条件下,使得收发数据的速率可以满足系统的要求。基本的基于UDP协议的无连接客户端/服务器端通信程序如图2所示。
图2 基于UDP协议的无连接客户端/服务器端通信程序
该通信过程采用多个客户端(各从处理单元)对一个服务器端(主处理单元)的方式,使多个用户接口模块可以在不同时间接入主控。内部通信根据所传递数据的不同类型,采用相对固定的不同的端口号,不同的客户端采用不同的IP地址,从相同的端口收发同类数据。在服务器端通过select()系统调用,既可以轮询各个socket端口以便及时接收不同端口的数据,又起到定时器的作用。当规定时间内收不到数据时,能够及时返回继续在阻塞模式下等待,从而既能及时收发数据,又降低资源消耗。