基于SNMP的MIB库访问实现

来源:互联网 发布:ipad air淘宝清除缓存 编辑:程序博客网 时间:2024/04/28 16:16
 

---本文摘自 北京工商大学 计算机学院 蔡国森 《基于SNMP的MIB库访问实现的研究》一文

摘要 SNMP是用于网络管理/代理之间的请求/应答协议。管理信息库(MIB)定义了由代理者维护的各种变量,它们由管理者来进行存取操作,从而实现具体的网络管理。本文在对MIB的分析之后,给出了对MIB库变量访问的C语言程序实例.

关键词 简单网络管理协议,模型,信息库,访问实现

1 引言

简单网络管理协议(SNMP)是Internet组织用来管理Internet的网络协议,随着Internet所使用的TCP/IP协议族成为事实上的网间网互连协议标准,SNMP也成为计算机网络管理方面大家实际遵循的标准。几乎所有的Internet网络设备的生产厂家都在开发与SNMP有关的产品并投放市场。

2 SNMP 的管理模型

在SNMP管理模型中有三个基本组成部分:管理者(Manager),被管代理(Agent)和管理信息库(MIB)。管理站一般是一个单机设备或一个共享网络中的一员,它是网络管理员和网络管理系统的接口,能将网络管理员的命令转换成对远程网络元素的监视和控制,同时从网上所有被管实体的MIB (管理信息库)中提取出信息数据。作为管理站,它还必须拥有能进行数据分析、故障发现等管理应用软件。整个管理站的管理工作是通过轮询代理来完成的。管理者可以通过SNMP操作直接与管理代理通信,获得即时的设备信息,对网络设备进行远程配置管理或者操作;也可以通过对数据库的访问获得网络设备的历史信息,以决定网络配置变化等操作。SNMP管理代理指的是用于跟踪监测被管理设备状态的特殊软件或硬件,每个代理都拥有自己本地的MIB。实际上,SNMP的管理任务是移交给管理代理来执行的。代理翻译来自管理站的请求,验证操作的可执行性,通过直接与相应的功能实体通信来执行信息处理任务,同时向管理站返回响应信息。


3
管理信息库

MIB信息为网管中被管资源,而网络管理中的资源是以对象表示的,每个对象表示被管资源的某方面属性,这些对象形成了MIB库。每个MIB变量记录了每个相连网络的状态、通信量统计数据、发生差错的次数以及内部数据结构的当前内容等。网络管理者通过对MIB库的存取访问,来实现五大管理功能。


3.1 MIB对象定义格式

ASN.1是一种用于描述结构化客体的结构和内容的语言,基于编码规则BER(Basic Encoding Rules)是ASN.1标准定义的一种传送文法。每个MIB变量格式是SMI规定的,用ASN.1描述如下:

OBJECTNAME BOJECT-TYPE

DESCRIPTION:(description)

SYNTAX: (syntax)

ACCESS: (access)

STATUS: (status)

::={(Parent)number}

OBJECTNAME是被管对象的名字,ASN.1要求所有对象的名字在MIB中必须是唯一的;BOJECT-TYPE是每一个节点对象所必需的关键字;SYNTAX是被管对象类型的关键字,随后跟着的是一个类型(syntax);ACCESS是被管对象的访问方式关键字,在

SNMP 第二版中为MAX-ACCESS关键字,(access)是被管对象的访问方式,可为如下列举值之一: read-only、read-write、no-accessible,SNMP 第2版中又增加了read-create;STATUS是被管对象关键字,(status)是被管对象的状态,如必备的、可选的或废弃的;DESCRIPTION是 对被管对象的功能、特征等进行描述的关键字,(description)是被管对象的文本描述,在:::={(Parent)number }中,Parent表示位于MIB树中的父节点,number表示是第几个子节点。

3.2 MIB 树

每个MIB对象都用对象标识符(OID)来唯一的标识,这是用定义在ASN.1语法中的树型结构来组织的可用信息,其中每个可用信息是一个带标号的节点,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点通向它的路径,它命名节点并指示它在ASN.1树中的准确位置。一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。图3是带有ASN.1编号的MIB树实例:可以看出MIB-Ⅱ的OID是:1.3.6.1.2.1或者iso.org.dod.internet.mgmt.mib2。在SNMP中,实现应用到的MIB对象都是MIB-Ⅱ的子树节点。


3.3 MIB 对象及变量

Internet MIB是一树形结构的数据库, MIB-I定义了8个管理信息类别,MIB-Ⅱ是在MIB-I基础上的扩展,增加了SNMP和CMOT两项。MIB类别说明见表1。

表1 MIB类别表

MIB类别 包含有关信息

System 关于实体所在系统的数据

Interface 用于管理的网络接口信息

AT 地址转换信息

IP 网络协议

ICMP 为IP设备携带错误和控制的协议

TCP 传输控制协议

UDP 用户数据报协议

EGP 外部网关协议

CMOT 公共管理信息与服务协议

SNMP 简单网络管理协议

 

MIB库中每一个变量都符合ASN.1语法规则,MIB库中只使用了ASN.1诸多类型中的INTEGER,OCTET STRING,OBJECTIDENTIFIER,NULL作为基本类型,同时定义了IpAddress,Counter,Gauge,TimeTicks,Opaque类型,大体上说,MIB中变量可分为两大部分,简单变量(Simplevariable)和表格(Table)。简单变量是常见的整型及字符串,也包括一些数据集合,通过在变量的对象标识符末尾附加.0来引用。表格对应一组数组,可包含变量的多个实例,表格中的每个表项可以用多个字段,这些字段本身可能是简单变量也可能是表格,表格不能直接进行存取。

4 MIB 访问实现

4.1 SNMP 报文操作

由于SNMP 是工作在UDP 上的协议,即无连接的报文通信方式,它不保证报文是否正确到达(SNMP的报文格式如图4所示)。与其他网络管理协议不同的是,SNMP 使用一种称作“取—存”的范例来实现各种操作。主要有以下3种信息:

(1)Get :由管理站去获取代理管理信息库的值,通过发送Get - Request , Get - Next –Request两种消息来实现。管理站通过发送Get - Request 报文从拥有SNMP管理代理的网络设备中获取指定对象的信息,而管理代理用Get - Response 报文来响应Get - Request 报文。Get -Next - Request 是获取一个表中指定对象的下一个对象,因此通常用它来获取一个表中的所有对象信息。

(2) Set :由管理站设置代理的管理信息库的对象值,通过发送Set - request 来实现,它可以对一个网络设备进行远程参数配置。

Version

Community

SNMP PDU

SNMP消息

PDU type

Request-id

0

0

Variable-bindings

Get-Request PDU,Get-Next-Request PDU,Set-Request PDU

PDU type

Request-id

Error-status

Error-status

Variable-bindings

Get-Response PDU

PDU type

Enterprise

Agent-addr

Generic-trap

Specific-trap

Time-stamp

Variable-bindings

Trap PDU

Name1

Value1

Name2

Value2

……..

Name n

Value n

图4 SNMP消息格式

(3)Trap :使得代理能够向管理站通告重要事件,是属于非请求的消息,这些消息通知管理站发生了特定事件。Trap消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。 一个SNMP 实体在接收SNMP报文时,一般要进行基本的语法检查、版本号的验证、认证(若成功就以ASN. 1 的形式返回一个PDU) 、对返回的PDU再进行语法检查。当所有的验证和语法解析成功以后,实体就选择适当的访问策略,对该PDU 进行相应的处理。管理系统工作时,管理站周期性地发送Get- Request/ Get-Next-Request 报文来轮询各个代理,获取各个MIB 中的管理信息,同时,管理站也接收代理发来的Trap报文,并记录在一个数据库中。网络管理员可以通过专用的应用软件从管理站上查看每个代理提供的管理信息。各个节点的代理程序驻留在工作站内存中,负责收集被管对象的网络状态信息。当代理接收到管理站的Get 报文后,代理将根据请求的内容从本地MIB 中提取所需信息,并以Get - Response报文方式将结果回送给管理站。代理一方面在161 端口上(SNMP 的默认端口) 循环侦听来自管理站的Get-Request/Get-Next-Request 报文,并做出相应的响应,读取或修改MIB中的变量值,将结果返回给管理站,另一方面,它也不断地检查本地的状态,适当地发送Trap 报文。

4.2 MIB访问流程及原理

首先根据自变量接收一个要访问的被管理对象主机名,并接收要查询的对象标识符的简略定义形式. 过程首先生成SNMP报文,一旦报文生成,再把报文简单反转过来,发送出去. 这其中要将请求标识符段内容及标识符长度保存起来,留待以后进行匹配检查. 生成SNMP报文后,建立代理地址,创建套接字连接,以便代理能将响应发回. 然后,启动警告信号处理器,将SNMP 请求报文发给代理,等待一个响应的到来.因为SNMP 是工作在UDP 之上的,所以在SNMP 应用实体间通信时,无需先建立连接,这样虽降低了系统开销,但UDP传输是不可靠的,为此,网络管理站采取了相应的超时和重发策略. 本系统在发出请求报文之后,启动超时计数器,等待响应的到来,并设置重发次数为3.若3 次之后仍没有收到响应,则关闭套接字,并返回一个“接收失败”错误代码.反之,若确定收到一个响应,则调用一过程来把响应转换成为内部表示形式, 即对SNMP 报文进行译码.再用已保存的Request-id与响应Request-id段进行比较,来验证这个报文是否是刚才发出的请求报文的响应.若是,就调用另一个过程,把每段对象标识符的ASN.1 表示形式转换成自己的内部形式,并显示其值. 由于SNMP报文对各个段都使用可变长度编码,这就使得即便是从SNMP报文中提取一简单整数段,也要进行许多计算,因而,所开发的系统原码程序中包含了一个语言较长、结构复杂的特殊句法分析程序,用于提取报文的各个段并进行译码,此句法分析软件必须把一指针移遍报文中所有各段,以找出各段长度并提取其数值.

MIB访问的主流程图如下:


4.3 结合自己的开发经验,列举了访问MIB的一个具体实现

以下介绍一个访问MIB 库中SysDescr变量的程序。该程序在Stratus 容错机(BSD UNIX 4.3)上运行通过。读者根据这个例子不难编写对MIB 库的其他变量的操作, 从而实现一个具体的网络管理系统。

# include 〈stdio.h〉

# include 〈sys/types.h〉

# include 〈sys/socket.h〉

# include 〈netinet/in.h〉

# include 〈netdb.h〉

# define snmp_port 161  /* SNMP UDP 端口号*/

# define destaddress  “192. 168. 1.16”  /* 访问目标机的IP 地址*/

struct sockaddr_in dest;

struct hostent *hp;

int sockfd;

register int i, n;

int fromlen;

int packsize= 43;

u_charsendpack [100 ]= {0x30, 0x37, 2, 1, 0, 4, 6, 0x70, 0x75, 0x62, 0x6c,0x69, 0x63,0xa0, 0x26, 2, 4,0, 0, 0, 0, 2, 1, 0, 2, 1, 0, 0x30, 0x1c,0x30,0x0c, 6, 8, 0x2b, 6, 1, 2, 1, 1, 1, 0, 5, 0};/* get_ request 报文编码*/

u_char recvpack [150];  /* 收到get_ response 报文编码*/

main( )

{

if ((hp=gethostbyname(destaddress))== 0)

{

    printf (“unknown host”) ;

    exit (1) ;

}

dest.sin_family= AF_INET;

dest.sin_port= htons(snmp_port) ;

memcpy((char*)&dest.sin_addr, (char*)hp->h_addr, hp->h_length) ;

if ((sockfd=socket(AF_INET, SOCK_ DGRAM , 17)) < 0)

{

    printf (“can`t create udp socket”) ;

    exit (1) ;

}

/* 以上生成udp 套接字*/

i= sendto (sockfd, sendpack, packsize, 0, (struct sockaddr* )&dest, sizeof (dest)) ;

if(i<0)

{

    printf (“sendto error”) ;

    exit(1);

}

if (i!=packsize)

{

    printf(“wrote %d bytes, return= %d”, packsize, i) ;

    exit (1)

}

/* 发送udp 报文*/

puts (“receiving now ……”) ;

fromlen= sizeof(dest) ;

if ((n= recvfrom (sockfd, recvpack, sizeof ( recvpack) , 0, (struct sockaddr

*)&dest,&fromlen) ) < 0)

{

    printf (“recv from error!”) ;

    exit (1) ;

}

/* 接收udp 报文*/

for ( i= 0; i< n; i+ + )

printf (“%X”,recvpack[i]) ;

close(sockfd) ;

}

五 结束语

综上所述,阐述了对MIB的存取实现,优点是考虑到命令模块的可重用性,此方法而开发的网络管理系统基模块具备了发送网络管理查询请求到远程设备的能力,实现了对动态管理数据的收集,只有很好的实现对MIB的存取,网络管理系统才能更好的发挥作用,若对MIB进行深入的分析,可以将其应用到流量监控、性能分析、访问控制等重要的网络管理功能。

参考文献

1Case,J., Fedor,M.Schoffstall,M , and J. Davin. A Simple NetworkManagement Protocol (SNMP). RFC 1157, SNM P Research, PerformanceSystems International, Performance Systems International, and M ITLaboratory for Computer Science, May 1990

2Rose M , and K.Mc Cloghrie. Structure and Identification of ManagementInformation for TCP/IP- based internets RFC 1155, Performance SystemsInternational, Hughes LAN Systems ,May 1990

3M.Rose. Management Information Base for Net-work Management ofTCP/IP-based internets :M IB-Ⅱ RFC 1158, Performance SystemsInternational, May 1990

4 Conne Xions , SMP/ SNMP Version 2 : the Evolution of SNMP ,1992 ,6 (10) :3~5

5 岑贤道,安常青. 网络管理协议及应用开发. 北京:清华大学出版社,1998

6 杨家海,任宪坤, 王沛瑜编. 网络管理原理与实现技术.北京:清华大学出版社出版,2000