快速理解和掌握MIB

摘  要   本文介绍了SNMP中MIB的概念、框架结构、ASN.1语法,还列举了SNMP网管中常用到的管理对象。最后,笔者给出了ASN.1的一些重要规则。

关键词  简单网络管理协议(SNMP)  管理信息库(MIB)  MIB树   ASN.1语法  对象标识符(OID)

 

       SNMP(简单网络管理协议)是目前在计算机网络中用得最广泛的网络管理协议,该协议是基于TCP/IP的网管标准,它包括协议自身、数据库的定义和相关概念。用于TCP/IP网络管理的网络管理模型包括四个关键性部件:网络管理协议、管理站、管理代理和管理信息库。而管理信息库(MIB)是存放了被管对象资源的所有信息, MIB文件建立的好坏,会直接影响到整个网络管理的质量。笔者作为《全业务光纤接入网传输系统》的网络管理小组的成员,针对自已在开发过程中的体会,特归纳出关于MIB的相关知识,相信对网管开发感兴趣的读者阅读过后会很快的掌握MIB的精髓。

一、管理信息库(MIB)的概述

1.MIB的相关概念

在SNMP网络管理中,管理信息库MIB(Management Information Base)是对于通过网络管理协议可以访问的信息。这些信息更具体的理解为网管中被管资源,而网络管理中的资源是以对象来表示,每一个对象表示被管资源某一方面的属性,这些对象的集合形成管理信息库。

MIB文件是用ASN.1语法来描述的,所以为了精确定义MIB中各管理对象,用户不得不参考一些ASN.1语法的有关文档如RFC1155、RFC1212等等来定义设备自己的MIB。ASN.1是抽象句法表示法一(Abstract Syntax Notation One)的简称,对于每个管理对象它都用文本来描述,用户可以用记事本、写字板等一些编辑器来打开或编写MIB文件,一般文件的后缀名都用“.mib”。

2.ASN.1语法

ISO ASN.1的一个子集为MIB定义了语法。每个MIB都使用定义在ASN.1中的树型结构组织所有可用信息。其中的每片信息是一个有标号的节点。每个节点包含两个内容:一个对象标识符和一个简短的文本描述。其中对象标识符OID(object identifier)是由句点隔开的一组整数,它命名节点并指示它在ASN.1树中的准确位置。而简短的文本描述是对带标号的节点进行描述。一个带标号节点可以拥有包含其它带标号节点的子树。如果带标号节点没有子树,就是叶子节点,它包含一个值并被称为对象。如下图显示了一个带有相应的ASN.1编号的MIB树的实例。

二、MIB树的结构

MIB树的根节点并没有名字或编号,但是它有下面3个子树:

  1. iso(1),由ISO管理
  2. ccitt(2),由CCITT管理
  3. iso/ccitt(3),由ISO和CCITT共同管理

在iso(1)节点下有一些其它的子树,其中包括ISO为其他组织定义的子树---org(3)。在org(3)子树下,一个值得引起注意的特殊节点是被美国国防部(Department of Defense)使用的节点:dod(6),所有通过DOD的协议如TCP/IP通信的设备,能够从它们那里获得的信息都位于该子树下,它的完整的对象标识符是1.3.6.1。该对象标识符被称为internet。该标识符的文本形式是{iso  org(3)  dod(6)  1}。如下图为MIB树的上层结构:

 

 

  • Directory(1)子树

至目前,Directory(1)是保留在将来使用。

  • Mgmt(2)子树

Mgmt(2)子树包含关于DOD协议的管理信息,目前该子树中的对象是最广泛的。其中对象标识符1.3.6.1.2.1已被MIB-II所取代。

  • Experimental(3)子树

实验协议和MIB开发通常使用这个子树,在这个子树下的所有对象的标识符都以整数1.3.6.1.3开始,一个实验性的新的MIB可能被赋于和对象标识符相关联的编号或一个整数,如1{experimental 1}。

  • Private(4)子树

Private(4)子树用来指定单方面定义的对象。该子树中网络管理系统访问最多的部分是enterprises(1)节点。该节点下的每个子树分配给一个企业,而企业必须先向IAB登记注册它们自已的厂商代码,然后就可以在该代码下创建他们自己的对象。

三、理解和掌握ASN.1句法

1. 对象标识符类型(OBJECT IDENTIFIER)

在ASN.1中,对象标识符类型描述对象的抽象信息,MIB树中的每一个标号是用对象标识符描述的。由于树的各个分支是用数值表示的,所以实际上对象标识符是一个整数数值的序列。它用OBJECT IDENTIFIER来声明,如:

myBranch OBJECT IDENTIFIER ::= { parentBranch 10 }

其中myBranch是一个子树支,它定义在parentBranch树支下,“10”是子树myBranch在父树支parentBranch下的一个唯一对象标识符,即通常所说的OID。在parentBranch树支下,可以定义多个子树支,但子树支的名字和数字(如上的10)不能重复,即必须是唯一的。

2. 标量(叶子)对象标识符

在一个树支下,读者可以定义多个子树,也可以定义被管理资源的管理对象,其定义的句法如下:

(objectname) OBJECT-TYPE

SYNTAX (syntax)

ACCESS (access)

STATUS (status)

DESCRIPTION (description)

::= { (parent) (number) }

以上的各部分解释如下:

(1)(objectname). 这是被对象的名字,ASN.1句法要求所有对象的名字必须以小写字母开头,而且该名字在MIB中必须是唯一的。

(2)OBJECT-TYPE.这是一个每一个叶子对象的所必须的关键字。

(3)SYNTAX.被管对象类型的关键字,说明随后跟着的是一个类型。

(4)(syntax).被管对象的类型,ASN.1句法要求所有的对象类型必须以大写字母开头,其中已预定义了的类型有Counter、Gauge、DisplayString、INTEGER等等,请参阅“3.对象语法定义”及“5.ASN.1的派生类型”。

(5)ACCESS.被管对象的访问方式的关键字。在SNMP第二版中为MAX-ACCESS关键字。

(6)(access).被管对象的访问方式,可为如下列举值中之一:read-only、read-write、 no-accessible,SNMP第2版中又新增了read-create。

(7)STATUS.被管对象的状态的关键字。

(8)(status).可取的值为:mandatory 、optional、obsolete、deprecate(SNMP第1版中),current、obsolete、deprecate(SNMP第2版)。

其中:mandatory为该对象的状态是必备的

optional为该对象的状态是可选的

obsolete为该对象的状态是不再使用

deprecate使用该值使得MIB的某些部分标记为过时,被标记为“废弃”的对象将从现行版本中删除,并在新的MIB版本中标记为“过时”。

current为该对象的状态是当前可用的。

(7)DESCRIPTION.对被管对象的功能、特征等等进行描述的关键字。

(8)(description).被管对象的文本描述。须用双引号把其文本说明括起来,有时由于用MIB编译器编译结果太大时,可以把文本说明删除,即只保留一个空的双引号。

(9)(parent).包含此叶子对象的树支,即叶子对象的父亲必须是用“OBJECT IDENTIFIER”声明。

(10)(number).在此父树支下的第几个叶子对象,这个数字在此父树支下必须是唯一的。一般number都是从取1开始的。例如:“::={ myObject 22 }”,则在myObject树支下22必须是唯一的,否则在用MIB编译器(如pSOS所提供的MIB编译器)进行编译时会提示有错。

除此之外,还有一些关键字:UNITS、INDEX、REFERENCE、DEFVAL等等,分别代表被管对象的单位、索引、参考、缺省值。这些关键字都并不是很重要,有兴趣的读者可参阅RFC1155的说明。值得注意的是INDEX关键字在表对象定义中必须存在的,否则表内的对象不能使用。

3. 对象句法定义

作为被管对象定义里的一部分,SYNTAX对象如下表1中定义。

表1   Syntax对象

SNMP 第2版

SNMP  第1版

SNMP  第2版

SNMP  第1版

BITS

 

Gauge32

Gauge

Counter64

 

OBJECT IDENTIFIER

OBJECT IDENTIFIER

NaspAddress

 

OCTET  STRING

OCTET  STRING

Unsigned32

 

TimeTicks

TimeTicks

Integer32

INTEGER

IpAddress

NetworkAddress

Counter32

Counter

Opaque

Opaque

 

4. INTEGER句法

INTEGER类型或者可以定义为在一定范围内的整数(如INTEGER(0…10),表明该整数的范围是从0到10),或者可以定义为一个枚举型,如下:

myEnumObject OBJECT-TYPE

SYNTAX INTEGER

{

first(1),

second(2),

third(3),

fourth(4)

}

ACCESS read-only

DESCRIPTION "An enumerated value"

::= { parentObject 22 }

在上面的定义中,被管对象myEnumObject是一个从1到4的整型数,每一个数值都对应一个标签,它用来描述各数值的具体含义,有时可用标签来代表其整数,但实际上起作用的是整型数。值得一提的是,这种枚举型的整型数可以不连续,如上可以定义为:first(1)、second(3)、third(5)、fourth(7)。

5. ASN.1的派生类型

读者有时可以从ASN.1现有的类型中派生出一个新的类型来,新类型具有不同的名称和相似的句法,但语义更加精确定义,这语义在SNMP第2版中被称之为文本约定(TC),它们有助于读者更容易地理解。如:

MyEnumValue ::= INTEGER

{

first(1),

second(2),

third(3),

fourth(4)

}

MyEnumValue为新派生的类型,读者可以在MIB文件中的SYNTAX句法中用此类型,但在用MIB编译器进行编译时,编译器会用INTEGER{first(1),second(2),third(3),fourth(4)}替换MyEnumValue。

6.表类型

SNMP表是一个特殊类型的声明,表内声明的对象称为列对象,声明如下:

(tablename) OBJECT-TYPE

SYNTAX SEQUENCE OF (tabletype)

ACCESS not-accessible

STATUS  mandatory

DESCRIPTION (description)

::= { (parent) (number) }

 

(entryname) OBJECT-TYPE

SYNTAX (tabletype)

ACCESS not-accessible

STATUS  mandatory

DESCRIPTION (description)

::= { (tablename) 1 }

 

(tabletype) ::= SEQUENCE {

(column1) (column1type),

(column2) (column2type),

(columnN) (columnNtype) }

读者也许注意到(tablename)和(entryname)中的ACCESS为not-accessible,这是因为表和行对象没有叶子对象,因此不能被SNMP访问。ASN.1句法中关于定义一个表的规则如下:

  1. 在表名(tablename)的命名中,必须要有一个“Table”关键字,例如定义一个表对象“myTable”
  2. 同样,在表对象下面的表目(entryname)也须有一个“Entry”关键字,例如“myEntry”
  3. (column1)是表的列对象,(column1type)是此列对象的类型

为了加深理解,举个例子如下:

myTable  OBJECT-TYPE

SYNTAX  SEQUENCE OF MyEntry

ACCESS  not-accessible

STATUS  mandatory

DESCRIPTION

  " 这是一个表名为myTable的表对象. "

::={ myParent 1 }

 

myEntry  OBJECT-TYPE

SYNTAX  MyEntry

ACCESS  not-accessible

STATUS  mandatory

DESCRIPTION

  " 这是一个表的表目,其中INDEX关键字必须存在,它的索引值为列对象中的第一个对象"

INDEX  {myIndex }

::={ myTable 1 }

 

MyEntry::=

SEQUENCE  {

myIndex INTEGER,

myColumn1 INTEGER,

myColumn2 OCTET STRING,

  }

上表中有三个列对象myIndex、myColumn1、myColumn2。

 

四、常用的MIB对象

在RFC1213.mib中(即基于TCP/IP的因特网网络管理之管理信息库:MIBII,现已被RFC2013所取代),存在很多的管理对象,初学者往往不知道从何下手或者不知道哪些用得上或用不上。笔者为此罗列了以下常用的管理对象:

  1. 几个重要的叶子对象

mgmt/mib-2/system/sysDescr.0(OID为1.3.6.1.2.1.1.1.0

此对象为只读的显示串,它包含所用硬件、操作系统和网络软件的名称和版本等完整信息。

mgmt/mib-2/system/sysContact.0(OID为1.3.6.1.2.1.1.4.0

此对象为可读写的显示串,它给出负责这一节点的人的名字和地址,有时可用它来测试代理(Agent)是否可写如检测写社团是否有效等。

mgmt/mib-2/system/sysUpTime.0(OID为1.3.6.1.2.1.1.3.0

此对象为只读的TimeTicks类型,它定义自最近一次重新初始化网络管理软件以来所经过的时间(以1/100秒为单位)。通常代理(Agent)在启动时便初始化时钟,有时可比较sysUpTime的值来决定被管设备的稳定性。

mgmt/mib-2/ip/ipInReceives.0(OID为1.3.6.1.2.1.4.3.0

此对象为只读的计数器(Counter),它累计从接口收到的IP输入数据报的总数,包括出错的数据报。数据报包括TCP和UDP层,此对象可以用来检测设备的忙碌程度。

mgmt/mib-2/ip/ipOutRequests.0(OID为1.3.6.1.2.1.4.10.0

此对象为只读计数器,它累计IP的上层协议(如TCP、UDP或ICMP)提供给IP传送的全部数据报个数。

mgmt/mib-2/ip/ipOutDiscards.0(OID为1.3.6.1.2.1.4.11.0

此对象为只读计数器,它累计在把报文传送到最后目的地时没有出错,但被丢弃(通常是由于缓冲区的空间有限)的输出IP数据报数。如果此对象值不为0,则表明设备接口卡或网线有问题。

mgmt/mib-2/ip/ipForwDatagrams.0(OID为1.3.6.1.2.1.4.6.0

此对象为只读计数器,它累计不以本实体为目标机的数据报个数。当被管设备是网关、网桥、路由器时此对象特别有用,它显示被管设备(如路由器)的忙碌程度,如果发送一个通过路由器的数据报后,此对象的值为0,则此路由器可能有问题。

mgmt/mib-2/tcp/tcpCurrEstab.0(OID为1.3.6.1.2.1.6.9.0

此对象为只读的量规计数器,它显示被管设备的当前状态是ESTABLISHED或CLOSE WAIT状态的TCP连接数。一个TCP会话可以是HTTP连接、FTP连接、Telnet连接、Mail连接或其它使用TCP/IP协议的连接,当想知道被管设备是如何工作的,利用对象是最合适不过了。

2.接口表的几个常用对象

在标准的SNMP MIB(RFC1213.mib)中有不同的表,但初学者首先需要知道和理解的是接口表(ifTable)。它包含了一个设备接口的公共信息,当需要管理路由器、网桥、网关等时此表尤为重要,因为用户可以确定哪一个接口正忙。以下.N为第几个接口的相关内容,如“ifDescr.3”为被管设备的第3个接口描述。

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifDescr.N

为只读显示串,它描述了第N个接口的厂商名、产品名和硬件接口的版本号。

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifOperStatus.N

值为Up(1)、Downd(2)、Testing(3)的只读枚举型,它描述了第N个接口的描述条件或接口状态。在网管的失效管理中,此对象可以和接口表中唯一的可写对象ifAdminStatus.N结合在一起,确定接口的当前状态。两个对象都返回整数:1、2、3,组合结果的意义如下表:

ifOperStatus

ifAdminStatus

含义

Up(1)

Up(1)

正常运行

Down(2)

Up(1)

失败

Down(2)

Down(2)

Down(关闭)

Testing(3)

Testing(3)

Testing(测试)

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifSpeed.N

为只读的量规(Gauge),此对象类型定义为第N个接口当前带宽的估算值。(按位/秒计算)

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifInOctets.N

为只读的计数器(Counter),它定义在第N个接口上收到的字节总数(包括帧格式)。

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifOutOctets.N

为只读的计数器(Counter),它显示在第N个接口上输出的字节总数(包括帧格式)。

/mgmt/mib-2/interfaces/ifTable/ifEntry/ifInErrors.N

为只读的计数器(Counter),它显示在第N个接口上入站的错误报文数,防止把它们转发到高层协议。

mgmt/mib-2/interfaces/ifTable/ifEntry/ifOutErrors.N

为只读的计数器(Counter),它显示在第N个接口上由于出错而没有发出的输出方向报文总数。

 

五、总结

SNMP中标量(叶子)对象和表对象的一些重要约定:在标量对象中,在一个对象类型和那个对象的一个实例之间不存在模糊性,每一个标量对象类型只有一个对象实例。为了和表对象的约定一致,并区别一个对象类型和一个对象实例,SNMP规定一个不成表的标量对象的实例标识由它的对象标识加上.0组成。说具体一点就是:叶子对象的实例为该叶子对象标识符加上.0,而表对象的实例为表对象标识符加上.表的索引值,例如一个叶子对象实例1.3.6.1.2.1.1.1.0sysDescr叶子对象的实例,而一个表对象实例1.3.6.1.2.1.2.2.1.2.3ifDescr表对象的第三个实例。

最后重申一下ASN.1规则,这些规则对于理解SNMP的MIB定义是极其重要

  1. 在RFC1155中描述了许多已定义的ASN.1类型;
  2. 某些名字用小写保留开头,这些名字仅为增强ASN.1表示法的易读性而引入的。
  3. 一律用大写字母显示某些保留字,这些保留字是有专门含义的;
  4. ASN.1类型名总是用大写字母开头;

猜你喜欢

转载自blog.csdn.net/zhigang0529/article/details/83182011
今日推荐