+ -

网络管理 SNMP 2 [转]

时间:2006-09-21

来源:agg230

在手机上看
手机扫描阅读
自:http://blog.newsfan.net/leelin/archive/2006/04/15/3155.aspx

SMI管理信息结构

1.概述

    SNMP网 络管理的基础是含有被管理元素信息的数据库。比如,工作站、服务器、网桥、路由器等各自维护着一个含有自身运行状态信息的树形结构,每一个叶子结点代表一 个信息、变量、配置,设备对这个树中相应的标量(叶子结点)进行赋值,以反映自己的状态。管理站读取相应的变量以获得网络节点设备的状态信息,也可以通过 修改某些值以达到简单的控制功能。这种结构在TCP/IP和OSI环境下被称作:管理信息库(MIB)。MIB中每一个被管理资源都由一个对象来表示。

    比如MIB-II,定义了system(设备基本信息,如联系人、生产商、地理位置等)、interfaces(设备上的网络接口)、at(地址转换表)、ip、icmp、tcp、udp等几个管理信息组,每组又有自己的管理信息与子树,实现具体的状态信息管理:


图1:MIB-II的结构

    SNMP协议下有众多的供应商提供设备和服务,如果没有一种约束机制,可能各个企业写出来的MIB都各不相同,使这样的一些网络设备在SNMP层上的协同工作上出现大麻烦,所以,需要一种机制,来限制和规范MIB的定义,这就是:管理信息结构(SMI)。SMI是ASN.1的一个子集,约定了使用到的语法、类型、宏、数据格式等。

    RFC 1155定义了SNMP SMI的规范。该规范定义了一个基本框架,在这个构架内,可以对MIB进行定义和构造。SMI确定了可以用于MIB中的数据类型并说明对象在MIB内部怎样表示和命名。SMI背后的原理是在MIB内部鼓励简单性和可扩展性,因此,MIB只能存储简单的数据类型:标量和标量的二维数组。SNMP只能检索标量,包括表中的单个条目。SMI不支持复杂数据结构的创建和检索。

    SMI的内容包括:

Ø         提供标准化的技术来定义特定的MIB结构

Ø         提供标准化的技术来定义单个对象,包括语法和每个对象的值

Ø         提供标准化的技术来对对象数据进行编码

 

本章描述管理信息的结构定义。管理信息由:名字、语法和编码三部分组成。相应地,有语法进行定义。

2. 管理信息的结构和标识

    管理对象以虚拟信息存储方式存储和访问,我们称这一结构为MIB(管理信息库)。MIB中的对象以ASN.1语言定义。

    看一个例子:

atIfIndex { atEntry 1 }

Syntax:            

INTEGER

Definition:    

The interface number for the physical address.

Access:        

read-write

Status:            

mandatory

    例子中定义了一个管理对象,他的名字为:atIndex;语法为:INTEGER。编码方法由INTEGER的BER编码方法指定。所以,本章定义了管理对象使用BER进行编码,具体编码方法在BER定义中。参见BER一章。

 

    每个对象有自己的名字、类型(SYNTAX)和编码。

²        名字:对象名字与对象标识一样,是唯一的。对象标识和对象名字都可以唯一地识别对象,对象名字更直观,对象标识更简洁,在PDU中需要使用对象标识,因为标识是数字型,更容易编码,编码更小。

²        语法(SYNTAX):定义对象的类型,比如是:INTEGER或OCTET STRING型。

²        编码:描述如何对对象实例按对象类型(SYNTAX)进行编码,以使数据在网络上传输。

2.1 名字

    名字用于标识管理对象,对象标识则可以更准确地标识对象。标识比名字更可靠、简洁。比如,每一个国际规范都有一个唯一的对象标识。一个标识就是一个简单的文本描述和一个整数。

    标识是一个树型结构,根结点不进行标记,但它至少有三个子结点:

l         一个由CCITT管理,标记为ccitt(0);

l         另一个子结点由国际标准化组织管理,标记为iso(1);

l         第三个由两者共同管理,标记为:joint-iso-ccitt(2)。

    在iso(1)下,ISO有一个子树用于其它国际组织,org(3),对于子结点来说,两个留给美国国家标准和技术局,另一个由NIST转给美国国防部,dod(6)。

Internet由IAB按下面的方式管理:

       internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }

    也就是说,对象标记的Internet子树以1.3.6.1开始,下面管理四个结点:

       directory     OBJECT IDENTIFIER    ::= { internet 1 }

       mgmt          OBJECT IDENTIFIER    ::= { internet 2 }

       experimental OBJECT IDENTIFIER    ::= { internet 3 }

       private       OBJECT IDENTIFIER    ::= { internet 4 }


图2:管理信息库中的对象标识

 

    对象标识使用IAB统一管理的树形结构来唯一定义管理信息目录,可以保证管理信息具有唯一识别性。比如udp管理信息树就定义在mib下,从根目录访问起,地址就是:1.3.6.1.2.1.7,这是他唯一的组标识,udp是它的名字,名字也可以这样唯一标识:iso.org.dod.internet.mgmt.mib.snmp。当然udp组还需要很多其它标量才能提供完整的管理信息。


图3:UDP组的结构

 

    SMI中预定义了许多目录,供SNMP服务提供者使用,这些目录都有自己的意义和用处,下面分别说明。

2.1.1. directory

directory(1)子树为将来使用OSI目录(X.500)保留。

2.1.2. Mgmt

    mgmt(2)子树用于标记IAB文件中定义的管理信息库。到目前为止,已经发展了两个版本:MIB-I和MIB-II。MIB-II是MIB-I的第二版,对第一版进行了修正和扩充。

2.1.3. Experimental

    experimental(3)子树定义用于存放Internet实验的对象。例如实验者可能接收到定义号17,那可用的对象标记就是:{ experimental 17 }或1.3.6.1.3.17。IANA对如何使用这个子树提出要求。

2.1.4. Private

    private(4)子树用于定义其它对象。此子树最初只有一个孩子:

        enterprises OBJECT IDENTIFIER ::= { private 1 }

    使用enterprises(1)时可以允许提供网络子系统的机构来注册它们产品的模型。enterprise子树的分支分配给每个注册enterprises对象标识符的供应商。

    在被授权使用一棵enterprises的子树后,企业可以在子树中定义新的MIB对象。而且企业也应该在此子树下注册它的网络子系统,这样可以在管理协议中进行有效地管理。例如,如果"Flintstones, Inc."生产网络子系统,它会要求一个在enterprises子树下的结点,这样的结点可能进行如下编号:

1.3.6.1.4.1.42,它可能在此下面注册它自己的路由器为:1.3.6.1.4.1.42.1.1

2.2. 语法

    每一个SNMP MIB内部对象都要正式定义。定义规定了对象的数据类型、允许的形式、取值范围、以及与其它MIB内部对象之间的关系。定义时使用ASN.1来定义每一个对象,也用来定义整个MIB的结构,为了保持对象的简单性和SNMP的简约,只使用了ASN.1元素和特征的一个有限子集。

    SMI中使用三种语法:原始类型、SMI预定义类型、自定义类型。

    相关的类型与定义语法如下。

2.2.1. 原始类型

    SNMP中使用到如下ASN.1原始类型:

INTEGER、OCTET STRING、OBJECT IDENTIFIER、NULL

 

    其中,整数类型可以作为枚举类型使用,如:

          ifAdminStatus { ifEntry 7 }

              SYNTAX:  INTEGER {

                          up(1),       -- ready to pass packets

                          down(2),

                          testing(3)   -- in some test mode

                      }.

这种情况下,拥有值0的命名号不应该出现在枚举列表中,而且不能使用此值。

2.2.2. 构造类型

    SNMP使用ASN.1中的SEQUENCE建立行或表。

    对于行,语法如下:

SEQUENCE {

<type1>,

...,

<typeN>

}

        其中<type>是原始类型,为行中的列,一个行可以有若干列组成。

 

    对于表,语法如下:SEQUENCE OF <entry>

        其中<entry>指向行,定义时定义一个表中使用的行,实际使用时,行有很多实例,也就是一个表中可能有很多行。

2.2.3. 定义的类型

    SNMP允许在一个新应用产品的范围内定义新类型,新类型必须能够分解为基本类型、行、表或其它新类型。这些类型是SNMP使用ASN.1语言自定义的类型,在SNMP中使用,和其它ASN.1基本类型和结构类型一起构成了SNMP中使用的类型。

 

    SMI中定义了用于SNMP的一些自定义类型:

NetworkAddress

此类型代表多个可能的协议族中的一个地址格式。当前只有Internet协议族。

IpAddress

这种定义的类型代表32位的IP地址,它表示为长度为4的字符串。在ASN.1类型使用BER规则进行编码时,只能使用原始编码形式。

Counter

这种定义的类型代表一个非负整数,它只能增加,直到最大值。当达到最大值后,它会返回0重新开始。本文指定它的最大值为 ,也就是4294967295。

Gauge

此类型代表一个非负整数,它可以可以增加或减少,但在最大值时停止。本文指定它的值为 ,也就是4294967295。

TimeTicks

此类型为非负整数,用于记录从一时间点起经过了多少个百分之一秒的时间。

Opaque

此类型支持对ASN.1语法进行扩充的能力。只类型只要求接收方能够对数据进行解密,并没有要求接收方一定要理解其内容。

 

Counter也称为循环计数器,是定义对象时常见的类型之一。典型的应用程序要对接收或发送的数据包和字节的数目计数。

TimeTicks是和计时器相关的。TimeTicks是两个时间点的差值,所以定义时需要在描述里告诉用户这两个时间参考点。

 

上面类型都是定义在RFC1155中的基本类型,在随后的RFC1212又定义了一个应用广泛的类型,这里一并列出:

DisplayString

可打印的字符串,使用可读的字符,是一种方便阅读的类型。定义为:DisplayString ::= OCTET STRING

    PhysAddress

       存放接口的MAC地址。定义为:PhysAddress ::= OCTET STRING

 

       同时,允许企业使用ASN.1的类型定义语法定义自己的类型。在SNMP相关的RFC中,广泛定义着其它可读性强的类型。

2.3. 编码

使用ASN.1的BER编码规则将数据从ASN.1编码为字节流在网络上传输。

3. 管理对象定义语法

SMI不定义MIB对象,但SMI规定了定义管理对象的格式。一个对象定义通常包括下面五个域:

Ø         OBJECT:是一个字符串名,它叫OBJECT DESCRIPTOR,它指定对象类型,这个类型和OBJECT IDENTIFIER相对应。

Ø         SYNTAX:对象类型的抽象语法。它必须可以解析到ASN.1类型ObjectSyntax的一个实例上。

Ø         DEFINITION:对象类型语义的文本描述。实现中必须保证对象的实例满足这个定义,因为这个MIB是用于多厂商环境中的,要照顾到它们的情况。对象在不同的机器上有相同的意义是很重要的,这要靠文本约束。

Ø         ACCESS:取只读,读写,只写或不能访问这四个值。

Ø         STATUS:强制(mandatory),可选(optional)或过时的(obsolete)。

 

以后的文档中可能会定义其它域。

3.1. 对象标识

在Internet标准中的MIB对象标识中不能有0,0留作扩展。每个和对象类型相对应的OBJECT DESCRIPTOR应该有独一无二的,可记忆和打印的字符串名。这对于人们的阅读和开发对象用户接口的表机制很有好处。

如前面提到的snmp的对象标识和对象描述为:

对象标识:1.3.6.1.2.1.7

对象描述:iso.org.dod.internet.mgmt.mib.snmp

3.2. 对象类型和实例

对象类型(OBJECT-TYPE)是一类可管理的对象的定义,而对象实例就是一个对象类型的实例,而这个实例有具体的值。

MIB中定义了许多对象类型,每个类型通过OBJECT IDENTIFIER唯一地进行标识,同时也有一个文本名(如下面例子中第一个对象,文本名是:atIndex),称为OBJECT DESCRIPTOR。MIB中的数据如果被访问是由特定协议决定的,而不在MIB中规定,SMI不包含这部分内容,SMI用来设计和描述对象,而不包括访问的方法和实例的描述。

还可以在MIB中定义一个对象,这个对象的实例描述一个信息集合,这个集合还是由许多其它的对象实例组成,比如下面的AT表:

前面三个对象是三个标量,基本的列对象。

OBJECT:

 atIndex { atEntry 1 }

Syntax:            

INTEGER

Definition:    

The interface number for the physical address.

Access:        

read-write

Status:            

mandatory

 

OBJECT:

atPhysAddress { atEntry 2 }

Syntax:

OCTET STRING

Definition:

The media-dependent physical address.

Access:

read-write

Status:

mandatory

 

OBJECT:

atNetAddress { atEntry 3 }

Syntax:

NetworkAddress

Definition:

The network address corresponding to the media-dependent physical address.

Access:

read-write

Status:

mandatory

 

第四个对象类型也可能被定义在MIB中,是一个行对象,由上面定义的3个标量对象组成:

OBJECT:

atEntry { atTable 1 }

Syntax:

AtEntry ::= SEQUENCE {

atIndex

INTEGER,

atPhysAddress

OCTET STRING,

atNetAddress

NetworkAddress

}  

Definition:

    An entry in the address translation table.

Access:

read-write.

Status:

mandatory.

 

每个对象类型的实例包括由前三个对象类型实例表示的信息。把这种定义出的对象类型称为列表(list)。同样的,列表类型的集合可以组成表(table)。例如,第五个对象的定义如下:

OBJECT:

atTable { at 1 }

Syntax:

SEQUENCE OF AtEntry

Definition:

The address translation table.

Access:

read-write.

Status:

mandatory.

上面的atTable就是由AtEntry的集合构成的。下面我们看一个例子,下面是一个对象类型:

{ atPhysAddress }

而下面是与协议相关的对象实例:

{ atNetAddress } = { internet "10.0.0.52" }

一个网络设备的具体atPhyAddress它的atNetAddress相关值{ internet "10.0.0.52 }构成了atEntry的一部分,构成了一个完整的atEntry,称为atEntry的一行实例。如果还有其它网络接口,则可能还有另外一组实例,是atEntry的另一行数据,如:{ atNetAddress } = { internet “10.0.0.53” }.

每个管理协议均提供了访问非集合对象类型的机制,每个管理协议也说明了它是否支持访问集合对象类型。而且,协议必须指定当一个对象类型、实例对访问多个类型的实例时会返回哪个实例。为支持不同的管理协议,所有能够使对象能够区分的信息由对象类型的实例定义在MIB中。具体访问表的方法和例子这里不详述,请参见SNMP协议一章。

3.3. 管理对象宏

       管理对象宏定义了对象定义的格式。RFC 1155中定义了一个管理对象宏,后面的RFC 1212引入了新的格式,被称为:简明管理对象宏。这两种宏都有应用,所以一并给出。

       Trap的宏定义并没有在RFC 1155中包括,在随后的RFC中给出了Trap的定义宏,本节一并详述。

3.3.1 管理对象宏

RFC 1155定义了OBJECT-TYPE宏来处理MIB中的对象定义。这个宏定义了统一的格式来定义对象。

OBJECT-TYPE MACRO ::=

BEGIN

TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax) –- 类型

"ACCESS" Access               -- 权限

"STATUS" Status               -- 状态

VALUE NOTATION ::= value (VALUE ObjectName) -- 对象标识值

 

Access ::= "read-only"              --只读

| "read-write"          --读写

| "write-only"          --读写

| "not-accessible"      --不可访问(由代理管理或表或行条目)

Status ::= "mandatory"              --强制使用

| "optional"            --可选

| "obsolete"            --废除

END

 

根据上面定义的管理对象宏定义,我们可以如下的对象例子:

atIndex       OBJECT-TYPE

SYNTAX      INTEGER

ACCESS      read-write

STATUS      mandatory

::= { atEntry 1 }

 

atPhysAddress OBJECT-TYPE

SYNTAX      OCTET STRING

ACCESS      read-write

STATUS      mandatory

::= { atEntry 2 }

 

atNetAddress OBJECT-TYPE

SYNTAX      NetworkAddress

ACCESS      read-write

STATUS      mandatory

::= { atEntry 3 }

 

atEntry       OBJECT-TYPE

SYNTAX      AtEntry

ACCESS      read-write

STATUS      mandatory

::= { atTable 1 }

 

atTable       OBJECT-TYPE

SYNTAX      SEQUENCE OF AtEntry

ACCESS read-write

STATUS mandatory

::= { at 1 }

 

对象可以是普通标量,也可以是表对象。行(atEntry)的类型是AtEntry,是一个标准的ASN.1结构类型,如下面定义:

AtEntry ::= SEQUENCE {

atIndex

INTEGER,

atPhysAddress

OCTET STRING,

atNetAddress

NetworkAddress

}

3.3.2 简明对象定义

       RFC 1212定义了新的简明MIB格式,将OSI的MIB格式引入SNMP.使用简明对象定义的对象格式与RFC1155的格式基本一致.

       简明对象定义宏:

 
          -- ASN.1的模块中引入了ObjectName对象名和DisplayString类型
          IMPORTS
              ObjectName
                  FROM RFC1155-SMI
              DisplayString
                  FROM RFC1158-MIB;
 
         -- 简明对象定义宏
          OBJECT-TYPE MACRO ::=
          BEGIN
              TYPE NOTATION ::=
                                 -- must conform to  RFC1155's ObjectSyntax
                                "SYNTAX" type(ObjectSyntax)
                                "ACCESS" Access
                                "STATUS" Status
                                DescrPart       -- 描述(又名定义),对该对象进行相关描述
                                ReferPart       -- 参考,相关参考描述
                                IndexPart       -- 索引,定义表时,定义表索引
                                DefValPart      -- 缺省值
              VALUE NOTATION ::= value (VALUE ObjectName)
 
              Access ::= "read-only"         -- 缺省值是read-only。还有其它3种权限可选
                              | "read-write"
                              | "write-only"
                              | "not-accessible"
              Status ::= "mandatory"          -- 缺省是强制执行。还有三种状态可选
                              | "optional"
                              | "obsolete"
                              | "deprecated"
 
              DescrPart ::=                   -- 描述对象的意义,使用范围、环境等相关信息
                         "DESCRIPTION" value (description DisplayString)
                              | empty
 
              ReferPart ::=                   -- 引用描述,与其它对象的引用关系及描述
                         "REFERENCE" value (reference DisplayString)
                              | empty
 
              IndexPart ::=                   -- 当对象类型是entry时,需要为表指定索引
                         "INDEX" "{" IndexTypes "}"
                              | empty
              IndexTypes ::=
                         IndexType | IndexTypes "," IndexType
              IndexType ::=
                                  -- if indexobject, use the SYNTAX
                                  -- value of the correspondent
                                  -- OBJECT-TYPE invocation
                         value (indexobject ObjectName)
                                  -- otherwise use named SMI type
                                  -- must conform to IndexSyntax below
                              | type (indextype)
 
              DefValPart ::=                  -- 允许为对象提供缺省值
                         "DEFVAL" "{" value (defvalue ObjectSyntax) "}"
                              | empty
 
          END
 
         -- 以下类型的对象允许成为索引
          IndexSyntax ::=
              CHOICE {
                  number
                      INTEGER (0..MAX),
                  string
                      OCTET STRING,
                  object
                      OBJECT IDENTIFIER,
                  address
                      NetworkAddress,
                  ipAddress
                      IpAddress
              }

    例如:

       这是一个简单的使用简明管理对象定义的实例。

          atIfIndex OBJECT-TYPE

              SYNTAX  INTEGER

              ACCESS  read-write

              STATUS  deprecated

              DESCRIPTION

                      "The interface on which this entry's equivalence

                      is effective.  The interface identified by a

                      particular value of this index is the same

                      interface as identified by the same value of

                      ifIndex."

              ::= { atEntry 1 }

    MIB-II就是使用简明管理对象定义进行对象定义的,虽然SMI里定义了对象定义的方法,但是很快就被简明对象定义语句取代了,所以我们见到的SNMPv1 MIB基本都是使用简明对象定义进行定义的。后面的例子就都使用这种格式了。

    更多类子见下面各节示例。

3.3.3 SNMP中的表

    SMI只支持一种形式的数据结构:简单的二维标量表。表的定义涉及到ASN.1的sequence和sequences of类型及OBJECT-TYPE宏中的IndexPart的使用。

    SNMP中把一些标量在逻辑上组织在一起,形成一个逻辑上的表结构:一些个单个对象作为表中的列,所有的列组成表中的一行(entry),若干个行就组成了一个表(table)。SNMP不支持整表的读取,只支持标量的读取,所以,在协议中,对表读取也是通过标量的逐个读取实现,参见SNMPv1协议一章。

    跟关系型的表一样,SNMP中的表也需要有索引,不然无法唯一地标识行。索引的设计需要考虑到索引列能不能唯一地标识列,如果有歧义将会引起很多问题,是不被支持的。

    例:

       MIB-II中的atTable是描述地址转换表的表,请参见表的定义与结构。

          atTable OBJECT-TYPE

              SYNTAX  SEQUENCE OF AtEntry

              ACCESS  not-accessible

              STATUS  deprecated

              DESCRIPTION

                      "The Address Translation tables contain the

                      NetworkAddress to `physical' address equivalences.

                      Some interfaces do not use translation tables for

                      determining address equivalences (e.g., DDN-X.25

                      has an algorithmic method); if all interfaces are

                      of this type, then the Address Translation table

                      is empty, i.e., has zero entries."

              ::= { at 1 }

 

          atEntry OBJECT-TYPE

              SYNTAX  AtEntry

              ACCESS  not-accessible

              STATUS  deprecated

              DESCRIPTION

                      "Each entry contains one NetworkAddress to

                      `physical' address equivalence."

              INDEX   { atIfIndex,

                        atNetAddress }

              ::= { atTable 1 }

 

          AtEntry ::=

              SEQUENCE {

                  atIfIndex

                      INTEGER,

                  atPhysAddress

                      PhysAddress,

                  atNetAddress

                      NetworkAddress

              }

 

          atIfIndex OBJECT-TYPE

              SYNTAX  INTEGER

              ACCESS  read-write

              STATUS  deprecated

              DESCRIPTION

                      "The interface on which this entry's equivalence

                      is effective.  The interface identified by a

                      particular value of this index is the same

                      interface as identified by the same value of

                      ifIndex."

              ::= { atEntry 1 }

 

          atPhysAddress OBJECT-TYPE

              SYNTAX  PhysAddress

              ACCESS  read-write

              STATUS  deprecated

              DESCRIPTION

                      "The media-dependent `physical' address.

 

                      Setting this object to a null string (one of zero

                      length) has the effect of invaliding the

                      corresponding entry in the atTable object.  That

                      is, it effectively dissasociates the interface

                      identified with said entry from the mapping

                      identified with said entry.  It is an

                      implementation-specific matter as to whether the

                      agent removes an invalidated entry from the table.

                      Accordingly, management stations must be prepared

                      to receive tabular information from agents that

                      corresponds to entries not currently in use.

                      Proper interpretation of such entries requires

                      examination of the relevant atPhysAddress object."

              ::= { atEntry 2 }

          atNetAddress OBJECT-TYPE

              SYNTAX  NetworkAddress

              ACCESS  read-write

              STATUS  deprecated

              DESCRIPTION

                      "The NetworkAddress (e.g., the IP address)

                      corresponding to the media-dependent `physical'

                      address."

              ::= { atEntry 3 }

    AT表有三列,atIfIndex、atIfPhysAddress、atNetAddress,他们组成了一个atEntry行。atIfIndex是索引,atIfIndex是一个整形对象,取值为interface中的ifTable中的ifIndex值。ifIndex在表中是唯一的,所以atIfIndex也可以唯一地识别列。atTable由atEntry行组成,这是一个典型的SNMP表结构。

图4:atTable管理对象表

3.3.4 trap定义

       由于SMI独立于SNMP协议定义,所以SNMP中设计了Trap,但SMI中没有相关定义语法,所以后来定义了RFC1215给出了Trap的定义格式,该RFC是SMI的补充。

3.3.4.1 trap定义语法

IMPORTS

              ObjectName

                  FROM RFC1155-SMI;        -- 从SMI中引入ObjectName对象

 

          TRAP-TYPE MACRO ::=

          BEGIN

              TYPE NOTATION ::= "ENTERPRISE" value

                                    (enterprise OBJECT IDENTIFIER)

                                VarPart

                                DescrPart

                                ReferPart

              VALUE NOTATION ::= value (VALUE INTEGER)

 

              VarPart ::=

                         "VARIABLES" "{" VarTypes "}"

                              | empty

              VarTypes ::=

                         VarType | VarTypes "," VarType

              VarType ::=

                         value (vartype ObjectName)

 

              DescrPart ::=

                         "DESCRIPTION" value (description DisplayString)

                              | empty

 

              ReferPart ::=

                         "REFERENCE" value (reference DisplayString)

                              | empty

 

          END

3.3.4.2 规则

1. TRAP-TYPE

   标识下面定义的是一个Trap,定义是用在设计得实现期,不是在运行期。

2. enterprise

企业标识,已经定义好的合法的标识。企业的标识定义在private.enterprise下。本域必须提供定义此Trap的企业的标识,以标识这个Trap是哪个企业定义的。这个值将被放在Trap PDU的enterprise字段内。

MIB-II中定义了SNMP的标识:snmp OBJECT IDENTIFIER ::= { mib-2 11 }。

根据惯例,如果企业标识的值是snmp,sysObjectID 的值被放在Trap PDU的enterprise字段内。这提供了一种使用TRAP-TYPE宏来描述SNMP标准trap的简单方法,标准Trap都是定义在snmp下,将这些标准Trap企业标识放在enterprise内,则TRAP-TYPE即可定义标准Trap又可以定义企业自定义Trap,一种方法解决了两个问题。

3. variables

    变量定义了MIB对象的有序的序列,这些对象包含在每个trap类型的实例中。每个变量按顺序被放置在SNMPTrap PDU的variable-bindings内。如果enterprise的值是snmp OBJECT IDENTIFIER ::= { mib-2 11 }。那么附加变量的出现不会导致连续的SNMP 消息超过484字节。

4. description

包含一个trap类型的原文的定义。注意到为了符合ASN.1的语法,description的全部值必须包含在双引号内。

更要注意如果MIB模块其他地方没有包含trap的原文描述,描述域必须定义。

5. reference

    参考,可选项,包含有在其他MIB模块中定义的一个trap的description的相互参照。当其他一些组织产生出 MIB时,这是非常有用的,如果新定义一个Trap,reference指向本Trap,则表示新trap的description参考本Trap的description。

6. value

    trap的值是整数。值为enterprise下的唯一值。value将被放在Trap PDU的专用字段(special-trap)内。该值用一唯一地标识一个Trap,enterprise值相同的情况下,value用来标识具体的Trap。enterprise用来标识Trap属于哪个企业。

3.3.4.3  SNMP中预定义的trap

SNMP协议中定义了6种基本trap,这6种trap可以涵盖大部分的设备主要状态改变,与企业自定义Trap配合使用,就可以处理几乎所有的重要状态改变情况。

       1. coldStart

SNMP发送实体正在重新初始化,以便能修改代理的配置或协议实体的实现,特别是由于崩溃或重大故障而引起的意外重启。

          coldStart TRAP-TYPE

              ENTERPRISE  snmp

              DESCRIPTION

                          "A coldStart trap signifies that the sending
                          protocol entity is reinitializing itself such
                          that the agent's configuration or the protocol
                          entity implementation may be altered."

              ::= 0

       2. warmStart

发送实体正在重新初始化,但不修改代理的配置或协议实例的实现。这是典型的常规启动。

          warmStart TRAP-TYPE

              ENTERPRISE  snmp

              DESCRIPTION

                          "A warmStart trap signifies that the sending

                          protocol entity is reinitializing itself such

                          that neither the agent configuration nor the

                          protocol entity implementation is altered."

              ::= 1

       3. linkDown

表示代理的一个通信连接失败。variablebindings字段中的第一个元素就是响应接口的ifIndex实例的名称和取值。

          linkDown TRAP-TYPE

              ENTERPRISE  snmp

              VARIABLES   { ifIndex }

              DESCRIPTION

                          "A linkDown trap signifies that the sending
                          protocol entity recognizes a failure in one of
                          the communication links represented in the
                          agent's configuration."

              ::= 2

       4. linkUp

表示代理的一个通信连接成功。variablebindings字段中的第一个元素就是响应接口的ifIndex实例的名称和取值。

          linkUp TRAP-TYPE

              ENTERPRISE  snmp

              VARIABLES   { ifIndex }

              DESCRIPTION

                          "A linkUp trap signifies that the sending
                          protocol entity recognizes that one of the
                          communication links represented in the agent's
                          configuration has come up."

              ::= 3

       5. authenticationFailure

表示发送方的SNMP消息检验失败。

          authenticationFailure TRAP-TYPE

              ENTERPRISE  snmp

              DESCRIPTION

                          "An authenticationFailure trap signifies that
                          the sending protocol entity is the addressee
                          of a protocol message that is not properly
                          authenticated.  While implementations of the
                          SNMP must be capable of generating this trap,
                          they must also be capable of suppressing the
                          emission of such traps via an implementation-
                          specific mechanism."

              ::= 4

       6. egpNeighborLoss

表示发送协议实体的EGP领居是已被标记为Down,相邻关系已经不存在。variablebindings字段中第一个对象就是这个关闭的EGP实体的egpNeighAddr。

          egpNeighborLoss TRAP-TYPE

              ENTERPRISE  snmp

              VARIABLES   { egpNeighAddr }

              DESCRIPTION

                          "An egpNeighborLoss trap signifies that an EGP

                          neighbor for whom the sending protocol entity

                          was an EGP peer has been marked down and the

                          peer relationship no longer obtains."

              ::= 5

3.3.4.4  企业专用trap

SNMP定义的6个Trap可以涵盖大部分的Trap情况,但是很多情况下设备有自己特殊的状态情况,企业也希望发送或接收自己定义的Trap以得到特殊的消息。通用Trap不能涵盖所有的情况,使用trap定义宏就可以定义企业自己的Trap。

企业设备能够发送自己的自定义Trap时,必须同时将定义Trap的MIB一起分发出去,否则,其它的管理站不能识别自定义Trap的格式。

       下面是一个自定义Trap例子:

 

          myEnterprise OBJECT IDENTIFIER ::= { enterprises 9999 }

 

          myLinkDown TRAP-TYPE

              ENTERPRISE  myEnterprise

              VARIABLES   { ifIndex }

              DESCRIPTION

                          "一个myLinkDown trap表示发送的SNMP 请求实体确认了表

现在代理配置通信里的一次失败连接。"

              ::= 2

4. MIB扩展

每个Internet标准MIB文档都将前面文档标记为过时的。在下面标记处标记的名字是在改变版本时没有进行过改变的:

{ mgmt version-number }

新版本可以会

(1) 宣布老的对象类型过时,但不删除它们的名字;

(2) 通过添加非集合对象类型到列表(list)中对象类型而扩展一个对象类型的定义;

(3) 要么就索性定义新的对象。

新版本不能在未改变对象名字的情况下改变对象的语义。这样就保证了相同的名字在不同的版本下会有相同的语义,这样在实现起来就比较方便。

但是,管理代表可能会返回一个对象,它是需要对象的一个超集。考虑到健壮性,管理程序应该忽略掉这些附加信息。但是我们要注意:如果一个实例没有和希望的对象类型相同的语法,控制将会失败。在监视和控制的情况下,由一个操作返回的对象名必须和操作要求的对象名一致。

MIB是可以也是必然要增长的,SMI定义已经考虑了这个问题,并预先做好定义.私有的扩展可以加到private子树下面.这使供应商可以创建新的对象来管理其产品中的具体实体,并使管理工作站可以看见这些对象.由于使用标准化的SMI和标准化的对象标识方案,能从不同供应商的管理站来管理私有对象.

当代理使用供应商私有的MIB管理设备时,他就具备了提供私有MIB的能力,如果管理站也装入相应的MIB,就可以与代理通讯,对设备进行监控和管理了.

5. SMI RFC

       RFC 1155定义了SMI,使用ASN.1进行描述,清晰而全面,这里录出所有定义,以供学习与参考。

 

RFC1155-SMI DEFINITIONS ::= BEGIN

 

EXPORTS -- EVERYTHING

internet, directory, mgmt,

experimental, private, enterprises,

OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax,

ApplicationSyntax, NetworkAddress, IpAddress,

Counter, Gauge, TimeTicks, Opaque;

 

-- 定义根目录

internet OBJECT IDENTIFIER      ::= { iso org(3) dod(6) 1 }

directory OBJECT IDENTIFIER         ::= { internet 1 }

mgmt OBJECT IDENTIFIER              ::= { internet 2 }

experimental OBJECT IDENTIFIER ::= { internet 3 }

private OBJECT IDENTIFIER           ::= { internet 4 }

enterprises OBJECT IDENTIFIER       ::= { private 1 }

 

-- 定义目的类型(宏)

OBJECT-TYPE MACRO ::=

BEGIN

TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)

"ACCESS" Access

"STATUS" Status

VALUE NOTATION ::= value (VALUE ObjectName)

 

Access ::= "read-only"

| "read-write"

| "write-only"

| "not-accessible"

Status ::= "mandatory"

| "optional"

| "obsolete"

END

 

-- MIB中的对象名

ObjectName ::=

OBJECT IDENTIFIER

 

-- MIB中的类型

ObjectSyntax ::=

CHOICE {

simple

SimpleSyntax,

 

-- note that simple SEQUENCEs are not directly

-- mentioned here to keep things simple (i.e.,

-- prevent mis-use). However, application-wide

-- types which are IMPLICITly encoded simple

-- SEQUENCEs may appear in the following CHOICE

 

application-wide

ApplicationSyntax

}

 

-- SMI使用ASN.1中的4个基本类型

SimpleSyntax ::=

CHOICE {

number

INTEGER,

 

string

OCTET STRING,

 

object

OBJECT IDENTIFIER,

 

empty

NULL

}

 

-- SMI为SNMP定义的预定义类型

ApplicationSyntax ::=

CHOICE {

address

NetworkAddress,

 

counter

Counter,

 

gauge

Gauge,

 

ticks

TimeTicks,

 

arbitrary

Opaque

 

-- other application-wide types, as they are

-- defined, will be added here

}

 

 

-- SNMP预定义类型

 

NetworkAddress ::=

CHOICE {

internet

IpAddress

}

 

IpAddress ::=

[APPLICATION 0] -- in network-byte order

IMPLICIT OCTET STRING (SIZE (4))

 

Counter ::=

[APPLICATION 1]

IMPLICIT INTEGER (0..4294967295)

 

Gauge ::=

[APPLICATION 2]

IMPLICIT INTEGER (0..4294967295)

 

TimeTicks ::=

[APPLICATION 3]

IMPLICIT INTEGER (0..4294967295)

 

Opaque ::=

[APPLICATION 4] -- arbitrary ASN.1 value,

IMPLICIT OCTET STRING -- "double-wrapped"

 

END


声明
  文章由leelin(李明江)原创,欢迎转载,但请保持文章内容、个人联系资料、版权信息及本声明的完整性。违反本声明者将追究其法律责任。请尊重别人的劳动。
  联系方式:
      QQ:1625716
       Email:[email protected]
          MSN:[email protected] 
    首发地址:http://blog.newsfan.net/leelin
    版权所有: 李明江
    对本书保留所有权利!

热门下载

更多