周 翔,徐山峰,谢 佳,刘志鹏,2
(1.中国电子科学研究院,北京 100041;2.北京理工大学,北京 100081)
Ad Hoc网络是一种无线、多跳和自组织的网络体系,具有分布式、动态性、自治性、自愈性、移动性等特点,在军用战术通信、工业生产、商业应用、家庭娱乐等国民经济的多个领域具有广阔的发展前景。随着Ad Hoc网络技术的发展,特别是基于IP体制的Ad Hoc网络设备的大规模部署应用,如何建立统一的网络管理平台和标准,降低网络运行风险和故障,提高网络运行效率,成为一个亟待解决的问题[1]。
现阶段,Ad Hoc网络管理所面临的问题可归纳为(1)网络设备较为复杂,Ad Hoc网络设备可能需要多个硬件模块协同工作,以实现应用层服务、路由层寻址、链路层信道接入及链路控制、物理层无线通信等功能,在这个过程中可能会涉及到Linux、VxWorks等多种操作系统;为提高系统的稳定性和工作效率,网络管理协议需对本设备中不同操作系统的各个组件进行有效监控和操作;(2)网络设备数量众多、种类繁杂、地理位置各异、网络拓扑结构可能会根据具体应用而变化,网管协议需通过无线链路对网络中的其它设备进行灵活有效地监控和管理;(3)Ad Hoc网络的无线资源较为有限,网管协议传输的数据单元应尽可能简单高效;(4)网管协议应具有较好的可扩展性和可兼容性,以便同外部网络进行网管数据交换;(5)网管协议应具有一定的通用性,以降低系统预研、开发、测试及集成的技术难度和风险。
作为一种通用标准,简单网络管理协议(SNMP,simple network management protocol)以易于实现、便于扩展的特点,获得了广泛的应用,可视为Ad Hoc网络管理的一个可靠解决方案。陈浩在嵌入式Linux中,利用Net-SNMP开源软件,实现了管理系统和异构无线网节点的实时通信,并对无线多跳网络中管控数据进行了可视化显示[2]。卢安文利用Net-SNMP开源软件,在以核心树路由协议为基础的多跳移动网络中,实现了IEEE 802.11管理变量[3]。耿哲等人在介绍移动Ad Hoc网络特定管理要求的基础上,分析了SNMP、ANMP、Guerrilla和PBNM三种网络管理框架的机制和特点[4]。刘晓丹等人使用ATP协议和SNMP协议,结合移动代理技术和分簇结构,实现一个层次型的Ad Hoc网络管理体系结构[5]。现有的研究成果主要集中在利用开源软件解决特定网络应用,或集中在结合Ad Hoc网络特点设计特定管理框架。为设计更为简单稳定,易于部署和扩展的SNMP网管体系,解决工程实践中的应用受限问题,文章研究了SNMP参考结构和工作体制,着重分析了SNMP代理的工作流程和模块组成,并进行了框架设计、编程实现和实验验证;实验结果表明,SNMP代理能够对网络中的关键参数进行控制和管理,验证了SNMP协议在基于IP体制的Ad Hoc网络中的可行性与有效性。
SNMP是基于TCP/IP协议的网络管理协议,专门用于网络管理软件和网络设备之间通信。SNMP采用管理工作站/代理模式,由管理信息结构(SMI,structure of management information)、管理信息库(MIB,management information base)和 SNMP实体之间的通信协议组成,其参考结构如图1所示[6]。一般来说,SNMP的管理操作有两种模式:查询和Trap。在查询操作中,当管理工作站希望读取或者设置管理对象时,管理应用发送Get、Get-next或Set请求,通过UDP传输至管理代理,代理查询管理对象,将结果通过Response操作返回给管理站。在Trap操作中,当有事件发生时,不需要查询,代理主动发送Trap报文给工作站,报告本地的事件情况。
图1 SNMP协议参考结构
SNMP协议中,被管理对象使用一串有序的整数序列(OID,object identifier),唯一标识一种对象类型,并使用统一管理的树形结构来唯一定义管理信息目录。为保证管理工作站和代理间的正常通信,SNMP协议使用抽象标记语言ASN.1中的基本编码规则BER作为传输语法。BER将数据按标识(Tag)、长度(Length)和值(Value)的方式编成一个TLV组,将多个TLV组进行编码并串接后,放在通信链路上进行传输。
为保障通信双方的报文能被正常解析,SNMP报文需遵循特定的格式,报文中各个域的定义,如图2所示。
图2 SNMP报文格式
其中,Version域代表了SNMP报文的版本号;Community域封装了管理进程和代理进程之间的明文口令;SNMP PDU域为一个结构类型,由3个部分构成,即PDU类型、get/set首部或者trap首部、变量绑定。
PDU的格式与对应的SNMP操作有关,以Get操作为例,其格式如图3所示。其中,PDU首部由PDU标识和长度组成,PDU标识表明了该序列结构为get类型,长度表示了该序列的后续字节数;get首部由请求标识符、差错状态和差错索引组成;变量绑定封装了PDU中的所有变量,每个变量由对象标识符OID和具体值组成。
图3 SNMP Get操作的PDU格式
SNMP代理是驻留在网络被管设备上的特殊软件,负责调用本地应用,获取管理信息,并封装为标准SNMP报文,传输给远端管理工作站。SNMP代理可看成网管工作站和本地应用之间的接口层,为两者之间提供通信服务。
SNMP代理软件的工作流程可分为以下5步[8]。
(1)初始化
SNMP代理启动后,调用初始化模块,读取配置文件,设置版本号与共同体名,初始化本地MIB表,配置变量的初始化值。
(2)建立连接,接收SNMP报文
建立socket套接字,绑定任意本地IP地址和UDP 161端口,然后进入无限循环,等待SNMP报文,当有数据到达时,接收数据并获得数据的源地址。
(3)SNMP报文解码、鉴权及PDU分析
由于收到的报文是ASN.1格式,需根据BER编码规则和SNMP报文的格式,进行解码,提取其中的SNMP命令和参数,并转化为代理的内部格式。首先,验证SNMP报文的版本号,若不匹配初始化配置的版本号,丢弃该报文;然后,解析SNMP报文的共同体名和PDU类型(GET或 SET),根据PDU类型,查找代理的共同体名,若与报文的共同体名不匹配,丢弃该报文,若匹配,则进行PDU分析。解析PDU中的SNMP操作类型、请求标识符、差错状态、差错索引、变量个数、变量OID和变量的值,并写入代理对应的内部结构体。
(4)SNMP命令处理
根据解析的PDU中的对象标识符OID,在代理的MIB库中查询该管理对象,若该对象存在,根据PDU的操作类型,调用相应的GET或SET操作函数,检查操作权限,获取或设置对应变量的值,并将操作结果存储在对应的返回值中,若对象不存在或没有操作权限,则返回错误原因。
(5)构建应答报文
根据SNMP操作结果和请求报文信息,使用BER编码规则,生成ASN.1格式的应答PDU,添加版本号和共同名,封装成结构类型,调用socket的sendto()函数发送给管理工作站,并等待下个SNMP请求报文的到来。
根据SNMP代理的工作流程,网管代理应该包含以下几个模块,如图4所示[9]。
图4 SNMP代理的组成模块
(1)初始化模块。初始化模块主要负责接口初始化、MIB初始化及配置数据读取。
(2)socket通信模块。通信模块负责建立管理工作站与代理之间的socket通信,在UDP 161端口侦听和接收SNMP请求报文,并回送应答报文,在UDP 162端口发送Trap陷阱。
(3)BER编解码模块。BER解码模块负责对ASN.1格式的二进制数据进行解析,实现TLV组中标识字节的提取,实现长度确定和长度不确定编码情况下TLV组中长度字节的提取,实现值编码中结构类型和简单类型(整数类型、字符串、对象标识符、NULL类型等)的提取。编码模块为解码的逆过程,负责将ASN.1定义的数据类型转换成二进制形式,然后进行数据传输。
(4)SNMP报文处理模块。报文处理模块包括报文解析和报文封装两部分。报文解析部分按照SNMP报文格式,调用BER解码模块,对通信模块收到的SNMP请求报文进行分析和鉴权,丢弃版本号和共同体字段不符合代理要求的报文,对鉴权通过的报文,进行PDU分析。报文封装部分根据操作结果,构建SNMP应答报文,调用BER编码模块,转换成二进制形式,并通过socket通信模块的发送接口,发送给网络管理工作站。
(5)MIB管理模块。MIB管理模块主要包括MIB的注册与查找功能。MIB注册功能负责在MIB库中添加和删除特定的OID节点,MIB查找功能实现在代理的MIB库中快速查找和定位特定的OID。该模块的关键在于MIB数据结构与快速查找算法的设计。
(6)MIB访问模块。MIB访问模块是MIB接口函数的具体实现。根据管理工作站的请求,MIB访问模块调用相应的本地函数,读取或者更改被管对象的具体数值。
(7)Trap处理模块。当代理检测到内部某个事件或故障发生时,调用该模块,通过UDP 162端口,向管理工作站发送Trap报文。Trap处理模块调用BER编码模块的函数,对内部格式的Trap报文信息进行ASN.1格式编码,将编码后的二进制文件通过socket通信模块的Trap接口传输给管理工作站。
现有的SNMP代理较受应用场景和平台的限制,为建立一个简单高效可靠,容易部署、裁剪、扩展,适用于多种操作系统,特别是嵌入式实时操作系统的网管代理框架,本文从主体结构、报文处理、MIB库实现与OID检索、本地操作等方面进行了研究和探讨。
代理可以看成一个服务器,循环等待网管请求报文的到达,当代理接收到数据后,调用相应函数进行处理,并把处理后的数据发回给网管工作站。因此,其主体结构可参照以下框架[10]:
其中,ProcRequest()函数负责解析接收的SNMP请求报文,将请求信息转化为内部格式,在MIB库中查找定位特定OID,根据请求类型进行相应操作,并把处理结果编码封装,写入sendBuffer,传递给socket的sendto()函数。
在实现SNMP报文处理之前,应该先完成BER编解码模块的设计实现,按照BER编解码的格式,对输入模块的数据进行TLV解析或封装,根据标识类型的不同,完成结构类型和简单类型中值的提取或编码,并返回处理结果。
SNMP报文处理的过程,可以看成一个按照SNMP报文格式,反复调用BER编解码函数进行解码或编码的过程。以报文解析部分为例,其处理过程可以表示为
其中,data为uint8_t类型指针,指向待解析数据的首位,errstat为int类型变量,指示绑定变量解析过程的错误状态,当errstat大于0时,将应答报文中的差错状态和差错索引置为相应的值。
管理信息库MIB是一个树形结构的数据库,可用链表实现MIB子树或分组,并在初始化模块中完成MIB库的注册。定义以下结构体表示MIB库的一个子树或分组:
代理通过比较每个分组OID的长度和大小,按OID由小到大的规则,将新的MIB分组插入到已有的MIB库中。
定义所有需要的MIB分组,在初始化函数中调用MIB分组插入函数,在MIB主树中注册这些分组,即可建立所需要的MIB库。
网管代理解析收到的管理请求报文,提取其中的OID和操作信息;代理遍历MIB库,通过比较分组OID与请求OID的长度和大小,确定请求OID所在的分组,遍历该分组,定位请求OID的幻数,返回其读写操作的回调函数。回调函数根据幻数,调用指定OID的本地处理函数,根据操作类型,检查本地操作权限,获取操作结果。
为验证网管代理软件在Ad Hoc网络中的作用与性能,搭建了以下实验环境,如图5所示。带有无线通信功能的四台端机,通过路由协议,组成一个互相联通的IP网络,端机的操作系统为Ubuntu Linux。
图5 Ad Hoc实验环境示意图
每台端机可同时充当网络管理工作站和网络管理代理,网络管理软件为QT和SNMP++开发的测试工具,网络代理软件为文章所开发的代理软件。网络中的数据传输可能需要经过多次处理和通过多个网卡,当数据过大时,可能会出现异常情况,因此,假设对所有端机的网卡MTU大小进行控制。在MIB的enterpris下建立测试子树,设定MTU的OID为 1.3.6.1.4.1.23528.1.2,并利用 ioctl()函数实现对MTU的读写操作。为简化实验,假设端机4为管理站,端机3上运行代理软件,端机4通过无线链路和SNMP协议对端机3上的名为“eth0”的网卡进行管理。
首先,通过ping测试端机4和端机3的连通性,如图6所示。
图6 实验端机之间的联通关系
从图6可知,端机4和端机3之间能够正常通信,使用测试工具,在端机4上读取端机3网卡的MTU,得到的结果如图7所示。
图7 管理工作站的Get操作结果
端机3的网管代理软件的输出结果,如图8所示。
图8 代理的输出结果
根据SNMP协议相关的知识,可知,代理软件的编解码及操作正常,且能够返回正确结果。使用测试工具,设置端机3网卡的MTU,如图9所示。
图9 管理工作站的Set操作结果
查看端机3的网卡信息,如图10所示。
图10 管理目标的网卡信息
由于Ad Hoc路由采用虚拟网卡的实现方式,“eth0”的真实IP地址为端机内部地址,但是其MTU成功被设置为1 300,说明Set操作成功。
在某些复杂场景下,端机可能会包含运行Vx-Wokrs的部件,在vxsim上对代理软件进行测试,实验结果如图11所示。
图11 VxWorks中代理的输出结果
分析可知,代理软件在VxWokrs中工作正常,能够对管理对象进行操作。
综上,SNMP网管代理软件在Linux和VxWorks操作系统中工作正常,较好地考虑了与IP协议栈的兼容性,正确地解析了SNMP报文,能够根据报文的类型和管理对像进行相应处理,并能构建SNMP应答报文,将正确的操作结果返回给管理站,实现了在Ad Hoc网络中的简单网络管理功能,验证了前述网管设计框架和实现方法的有效性、可用性。
在分析简单网络管理协议SNMP的参考结构、工作体制和编码格式的基础上,结合Ad Hoc网络的特点,分析和讨论了简单网络管理代理的工作流程、组成模块、框架设计和实现方式,搭建了测试实验环境,考虑了多种应用场景和方式,验证了在Ad Hoc网络中实现SNMP管理协议的可行性、可用性和有效性。
展望未来,仍然有许多问题需要进行深入研究,如:
(1)Ad Hoc网络的无线开放特性,对网络管理的数据安全问题提出了更高的要求,这需要兼顾SNMP的简单、及时和有效的特点,设计出更加安全可靠的网络管理方案。
(2)Ad Hoc网络的无线资源的稀缺性和系统资源的有限性,要求网络管理协议应尽可能有较高的传输效率和占用较小的网络负载。
(3)代理软件应提供更加丰富的功能,如Trap陷阱功能、SNMP V2、SNMPV3等,提供更多的跨操作系统的能力,提供更加健壮和稳定的性能。
综上,SNMP协议和标准为Ad Hoc网络管理提供了一个可行的解决方案,需要结合Ad Hoc网络的自身特点,进行深入的研究、针对性的改进和持续的实验,以更好地指导工程实践和科学研究工作的开展。
[1]陈林星,曾曦,曹毅.移动 Ad Hoc网络——自组织分组无线网络技术[M].第二版.北京:电子工业出版社,2012.
[2]陈浩.分布式异构无线多跳网络管理系统[D].天津:天津大学.2010.
[3]卢安文.无线自组织网SNMP网管代理的研究与设计[D].成都:电子科技大学.2006.
[4]耿哲,徐晓宇.移动Ad hoc网络管理框架研究[J].数据通信,2005,(4):11-14.
[5]刘晓丹,苗付友,熊焰,等.基于移动代理的分布式Ad Hoc网络管理[J].数据通信,2005,(4):11-14.
[6]武孟军.精通 SNMP[M].北京:人民邮电出版社,2010.
[7]IETF RFC 1157.J.Case,M.Fedor,M.Schoffstall and J.Davin.A Simple Network Management Protocol(SNMP)[S].1990,5.
[8]姚炜,苏皆磊,李迎春.嵌入式SNMP网管代理器的设计实现[J].上海大学学报,2006,(12):567-571.
[9]刘勇,曹明翠,罗志详,等.SNMP代理在光纤通道交换机上的嵌入式实现[J].光通信技术,2005(9):27-30.
[10]宋敬彬,孙海滨,等.Linux网络编程[M].北京:清华大学出版社,2010.