摘 要 本文介绍了SNMP中MIB的概念、框架结构、ASN.1语法,还列举了SNMP网管中常用到的管理对象。最后,笔者给出了ASN.1的一些重要规则。
关键词 简单网络管理协议(SNMP) 管理信息库(MIB) MIB树 ASN.1语法 对象标识符(OID)
SNMP(简单网络管理协议)是目前在计算机网络中用得最广泛的网络管理协议,该协议是基于TCP/IP的网管标准,它包括协议自身、数据库的定义和相关概念。用于TCP/IP网络管理的网络管理模型包括四个关键性部件:网络管理协议、管理站、管理代理和管理信息库。而管理信息库(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树的根节点并没有名字或编号,但是它有下面3个子树:
在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)是保留在将来使用。
Mgmt(2)子树包含关于DOD协议的管理信息,目前该子树中的对象是最广泛的。其中对象标识符1.3.6.1.2.1已被MIB-II所取代。
实验协议和MIB开发通常使用这个子树,在这个子树下的所有对象的标识符都以整数1.3.6.1.3开始,一个实验性的新的MIB可能被赋于和对象标识符相关联的编号或一个整数,如1{experimental 1}。
Private(4)子树用来指定单方面定义的对象。该子树中网络管理系统访问最多的部分是enterprises(1)节点。该节点下的每个子树分配给一个企业,而企业必须先向IAB登记注册它们自已的厂商代码,然后就可以在该代码下创建他们自己的对象。
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句法中关于定义一个表的规则如下:
为了加深理解,举个例子如下:
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。
在RFC1213.mib中(即基于TCP/IP的因特网网络管理之管理信息库:MIBII,现已被RFC2013所取代),存在很多的管理对象,初学者往往不知道从何下手或者不知道哪些用得上或用不上。笔者为此罗列了以下常用的管理对象:
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.0为sysDescr叶子对象的实例,而一个表对象实例1.3.6.1.2.1.2.2.1.2.3为ifDescr表对象的第三个实例。
最后重申一下ASN.1规则,这些规则对于理解SNMP的MIB定义是极其重要