一种SNMP MIB管理器的设计与实现

时间:2022-08-10 11:37:13

一种SNMP MIB管理器的设计与实现

摘要:MIB管理器作为SNMP网络管理系统的重要支撑工具,以平台形式提供MIB对象存取访问的信息转换与映射机制。结合SNMP MIB描述文法分析,探讨基于正则表达式模式匹配算法进行协议文本分析的MIB信息转换方法,结合C++类封装MIB API,提供MIB转换信息与SNMP协议编码数据结构的内存映射途径。为支持MIB的动态扩展,提出一种综合MIB编译与浏览功能的snmp mib管理器平台结构,并给出其设计实现过程描述。

关键词:MIB;SNMP;管理器;网络管理;信息转换与映射

中图分类号:TP393文献标识码:A文章编号:1009-3044(2009)27-7648-03

Design and Implementation of an SNMP-Based MIB Manager

ZHAO Li-ping

(Department of Computer Science & Technology, Jilin Railway Vocational Technology College, Jilin 132001, China)

Abstract: Management Information Base (MIB) Manager is one of the necessity tools for SNMP-Based Network Management System (NMS), providing the mechanism to transform and mapping MIB. It first analyses the definition syntax of SNMP MIB, and then discusses the MIB Transform method based on regulation expressions to match patterns, and gives an approach to map the compiled information into memory data structure for SNMP coding by using C++ class to encapsulate MIB Application Programming Interface (API). In order to support MIB extension, it proposes the architecture of MIB Manager that combines compiler and browser functions. With this model, the MIB Manager is designed and implemented by using programming language C++ and Perl in the end.

Key words: MIB; SNMP; manager; network management; information transform and mapping

1 问题提出

TCP/IP网络管理的本质是简单网络管理协议(SNMP)的管理信息库(MIB)存取访问。网络管理系统(NMS)通过以“GET”和“SET”为基础的协议操作,进行被管对象(MO)信息提取或状态设置。由于SNMP协议操作的二进制编码与管理信息结构(SMI)定义MIB文本描述的差异性,网络管理必须处理MIB描述信息与应用数据结构的转换与映射。其一般方法是结合管理应用,采用硬编码的方式直接将MIB编译成设计语言相关的程序数据结构[1];由于与特定系统的耦合性,不具有在线扩展能力。因此,可扩展的MIB成为SNMP网络管理的重要内容。以下首先通过SNMP MIB数据类型和MO描述规则分析,研究MIB信息转换与映射机制。提出MIB信息转换的正则表达式模式匹配算法,和基于哈希表(Hash Table)的C++内存映射结构,结合一种集成MIB编译与浏览功能的SNMP MIB管理器平台设计与实现进行系统阐述。通过层次化的MIB管理策略,使得MIB信息转换与映射分离,从而支持MIB的动态扩展。

2 MIB信息转换与映射机制

SNMP网络管理的MIB对象存取操作,需要构建与维护本地MIB应用数据结构。SNMP MIB采用基于抽象语法描述一(ASN.1)的SMI进行定义,公共和企业标准MIB以RFC文档形式组织与,也可通过定义SMI格式的MIB MOUDEL扩展MIB管理范围。MIB定义结构转换与映射成具体编程语言数据结构,是网络管理程序设计实现的前提。MIB定义的SMI数据类型和对象描述规则,以及SNMP协议操作的ASN.1类型二进制编码特征,决定MIB信息转换与映射的基本机制。

2.1 MIB数据类型与对象描述规则

MIB是MO的集合,具有类型和值定义,类型规定MO类别的语法描述,值表示对象的实例。SMI数据类型和对象定义宏提供MIB描述的基本方法。SMI采用ASN.1类型记法与值符号描述使用的数据类型与MO命名方法,提供MIB结构与对象描述语法,值定义与编码规则。SMI基于ASN.1简单数据类型定义应用数据类型,通过符合ASN.1 MACRO(宏)文法的TEXTUAL-CONVENTION MACRO (简称TC类型)支持从基本类型派生新类型;提供一组包含类型集合关联的MIB对象描述宏作为对象描述模板,通过宏实例与值给出具体MIB结构与对象属性。OBJECT-TYPE MACRO为MIB对象定义提供形式化的通用模板,其结构如图1所示[2]。OBJECT子句的“对象描述符”指定对象类型,“对象标识符”(OID)采用点分十进制格式唯一标识MO的MIB命名树位置;SYNTAX子句定义对象的数据类型;ACCESS子句规定对象的访问特性;STATUS子句说明对象的实现状态;DESCRIPTION子句是管理信息的文本描述。MIB适用的SMI数据类型与对象定义宏分类见表1[3]。

SNMP以{iso org dod internet}节点下基于OID节点命名的概念树结构组织管理信息,每一节点代表一个组织、规约或对象[4]。MIB信息结构具有对象树层次性,存储标量(叶子对象)和标量二维数组(表对象)两种简单类型,支持检索标量对象和表的单个对象实例值。从根对象开始,基于OID层次结构的字典顺序,可以实现MIB对象检索和遍历,支持网络管理应用的MIB对象访问。

2.2 MIB信息转换原则与方法

MIB信息转换要求从定义MIB 的RFC文档或MODULE文本解析出SMI数据类型和对象描述的宏文法,转化为ASN.1类型与值编码,分析并记录MIB对象树层次的信息结构,可以看作一种简化的文件编译规则匹配过程。根据MIB文本描述的特点,提出基于正则表达式的模式匹配算法,其主要思想是:通过定义与使用符合SMI数据类型、TC类型定义宏与对象定义宏语法规则的不同正则表达式匹配模式,以推断MIB对象属性与描述信息。首先以字符流形式读入MIB文本,执行数据类型模式匹配语法分析,进行ASN.1类型匹配和值编码;以类型分析为依据,通过MIB对象定义宏模式匹配规则提取MIB对象属性;最后形成一定存储格式的MIB编译文件。具体转换规则如下:

1) 基于语法分析提取所有SMI数据类型和TC类型,TC类型转换为SMI基本数据类型,根据表1的对应关系进行数据类型与ASN.1基本类型转换和值编码。

2) 以语法分析为依据,从定义文本进一步分离出通过表1列出的5种对象定义宏描述的MIB对象,确定MIB对象标识、访问特性和对象说明。

3) 根据获得的MIB对象属性,确定MIB OID节点从属关系层次结构,建立标量或表对象关联。

4) 记录全部可用信息,以易于读写的结构存储为MIB信息转换的编译文件。

2.3 MIB信息映射策略

MIB信息转换得到的是MIB的信息结构,实现SNMP协议操作,需要通过MIB信息映射建立为编程语言使用的MIB概念树数据结构,以支持MIB浏览操作。MIB信息映射是程序设计语言实现基于ASN.1二进制编码SNMP协议操作的基础,协议操作读写的MIB对象可以选择数据库或内存空间的映射方式,由于数据库访问开销限制,优先采用内存映射结构。

因为MIB的OID N叉树结构特点,有必要在内存中保留此逻辑形态以提供MIB树形表示。根据MIB OID层次,结合Hash数据结构的使用建立以OID为Hash索引的内存MIB树结构,提供对象检索手段。通过合理选择Hash函数,减少哈希值重复,提高内存读写检索速度。以MIB访问应用编程接口(API)的形式封装MIB信息映射操作,提供对MIB浏览的支持。

3 MIB管理器设计与实现

MIB信息转换和映射的递进性和独立性,表现为一种层次化的MIB实现策略。基于MIB信息转换与映射机制,提出一种如图2所示的SNMP MIB管理器平台结构。其核心是MIB编译与浏览模块,Manager Core进程负责任务调度,工作流程为:首先MIB编译模块将MIB定义文档转换成MIB编译文件,实现MIB信息转换。其次,Manager Core通过MIB API读取MIB编译文件,生成内存读写Hash结构,提供MIB信息映射,支持MIB的浏览操作。

3.1 MIB编译模块实现

基于SNMP MIB信息转换原则,MIB编译模块由Perl脚本makemib.pl和配置文件makemib.cfg构成。makemib.pl脚本根据makemib.cfg的配置信息分析MIB定文档,提取MIB对象定义,确定对象标识符、ASN.1类型、访问权限、对象层次关系,生成记录对象信息的MIB编译文件。具体过程简要说明如下:

1) 装入配置文件 通过ReadConfigFile过程读MIB文件、SMI类型、TC文件列表,进行全局变量赋值。

2) 确定数据类型 扫描MIB/TC文件,利用ReadTypeFromFile过程的正则表达式提取基本数据类型和TC类型,进行ASN.1类型标记和值编码。

3) 解析对象定义 基于ReadObjectsFromFile过程,根据表1的5种基本MIB对象定义宏格式,利用模式匹配依次提取对象定义全部属性,记录于哈希数组。匹配MIB对象定义宏的Perl脚本如下,包括主要的正则表达式,部分匹配后处理过程略:

sub ReadObjectsFromFile

{

-------

#First round, match "MODULE-IDENTITY" macro

while($line=~m"(\S+?)\s*MODULE-IDENTITY\s*LAST-UPDATED.*?::=\s*\{\s*(\S+?)[\t ]*(\d+?)\s*\}"sg)

{

if($1 ne "--") # "--" means a comment according ASN.1

{

$mib_oid{$1} = $2.".".$3;

}

}

# second round, match "mib-2 OBJECT IDENTIFIER ::= { mgmt 1}" macro

while($line=~m"^[\t ]*((?:\w|-)+?)\s*(?:OBJECT[\t ]*IDENTIFIER\s*)?::=\s*\{\s*(\S+?)[\t ]*(\d+?)\s*\}"mg){略}

#third round, match "OBJECT-IDENTITY" macro

while($line =~ m"\n\s*(\S+)\s*OBJECT-IDENTITY\s*

STATUS\s*(current|deprecated|obsolete)\s*

DESCRIPTION\s*\"(.+?)\"\s*

(REFERENCE\s*\"(.*?)\"\s*)?

::=\s*\{\s*(\S+?)[\t ]*(\d+?)\s*\}"xsg){略}

#fouth round, match "OBJECT-TYPE" macro

my $n = 0;

while($line =~ m"\n\s*(\S+)\s*OBJECT-TYPE\s*

SYNTAX(.*?)

(UNITS\s*\"(.*?)\"\s*)?

ACCESS|MAX-ACCESS)\s*(not-accessible|read-only|read-write|read-create|write-only)\s*

STATUS\s*(optional|mandatory|current|deprecated|obsolete)\s*

DESCRIPTION\s*\"(.+?)\"\s*

(REFERENCE\s*\"(.*?)\"\s*)?

((INDEX|AUGMENTS)\s*\{(.*?)\}\s*)?

(DEFVAL(.*?))?

::=\s*\{\s*(\S+?)[\t ]*(\d+?)\s*\}"xsg){略}

#fifth round, match NOTIFICATION-TYPE macro

while($line =~ m"\n\s*(\S+)\s*NOTIFICATION-TYPE\s*

(OBJECTS(.*?))?

STATUS\s*(current|deprecated|obsolete)\s*

DESCRIPTION\s*\"(.+?)\"\s*

(REFERENCE\s*\"(.*?)\"\s*)?

::=\s*\{\s*(\S+?)[\t ]*(\d+?)\s*\}"xsg){略}

------

}

4) 确定对象OID 提取的对象信息数组以MIB对象名为索引,转化为用数字表示的OID。

5) 输出文件 输出文本格式的MIB编译文件mib.db,按对象名行排序依次记录所有对象“ ”格式的属性。

4.2 MIB浏览模块实现

MIB浏览模块的实现选择Linux环境下的GTK+ VDK/VDK Builder界面库开发工具,基于C++语言编码。结合图3所示的MIB Manager GUI,支持MIB对象浏览操作。MIB Manager GUI由从VDK类库VDKForm类派生的MibmanagerForm类实现,显示为X-Window窗口。MIB信息映射操作以CMib类封装,主要使用MIBOBJECT结构对象存储MIB对象信息,结合Hash表索引,提供基于对象名和OID的信息检索途径。

MibmanagerForm重载VDKForm::Setup函数,创建CMib类对象并引用Init方法进行mib.db文件读入和内存映射,结合VDKCustomTree控件显示MIB树型结构信息。MIBOBJECT的C++定义和基本的映射过程如下:

typedef struct _mibobject

{

char *obj_name;

OID obj_oid;

int obj_disptype;

int obj_type;

int obj_access;

int obj_status;

char *obj_desp;

char *obj_index;

struct _mibobject *obj_next; //point to next object which hava same hash value

struct _mibobject *obj_parent; //point to parent object

struct _mibobject *obj_child;//point to child object

struct _mibobject *obj_sibling;//point to next sibling object

}MIBOBJECT;

1) 调用MIB信息转换形成的“MIB编译文件”,通过定义MIBOBJECT结构类型的m_MibTable,写入所有对象属性信息,每个成员代表一个MIB对象,数组按照对象名字典排序。

2) 创建MIBOBJECT类型的指针成员数组*m_MibHashTable,对每一成员计算hash值以生成索引,使用的哈希函数是将对象OID的所有子标识符加权求和再除以哈希数组的大小。其优点是对所有子标识符求和使得哈希值可以反映全部OID信息,对每个子标识符进行加权则可以反映出每个OID的位置信息。令第k个子标识符为dk,且共有n个子标识符,则哈希函数表示为:

3) 对所有MIB对象成员设置相应的parent、child、sibling关系指针,形成MIB树内存结构。

4.3 Manager Core进程

MIB管理器由Manager Core进程控制,以MIB Manager GUI为载体调入浏览模块和已编译MIB文件。MIB Manager提供两种工作模式――OnLine(在线模式)和OffLine(离线模式),启动时处于离线模式,未与连接,只显示对象属性;在线模式则通过协议操作与连接取得特定的MIB对象值。在“MIB Manage”Tab页进行初始参数配置,基于Linux shell调用makemib.pl脚本集成MIB编译模块,支持MIB在线编译。编译后的MIB文件可以通过卸载当前MIB,动态加载到系统,有效地扩展MIB的管理范围。

5 结束语

本文基于SNMP MIB信息转换与映射机制分析,论述以正则表达式文本分析和内存映射为基础的SNMP MIB管理器实现策略,通过MIB信息转换与映射过程的分离,提供MIB编译与浏览的集成模式,支持MIB动态扩展。可以单独或作为NMS的MIB管理平台,支持SNMP网络管理应用的MIB访问操作。

参考文献:

[1] 董庆元等.一种分布式智能网络管理系统的设计与实现[J].小型微型计算机系统,2000,22(4):418-421.

[2] SEAN HARNEDY.简单网络管理协议教程[M].2版.北京:电子工业出版社,1999.

[3] 郭军.网络管理[M].北京:北京优点大学出版社,2001.

[4] 周彩章,吴宇红.网络管理信息模型化研究与实现[J].西安电子科技大学学报,2001,27(1):126-129.

上一篇:ArcGIS Server9.2应用开发中浮动面板的定制技... 下一篇:GAE环境下导出Excel报表