SMI定义和构造了MIB的总体框架,以及数据类型的表示和命名方法。

SMI的宗旨是保持MIB的简单性和可扩展性,只允许存储标量和二维数组,不支持复杂的数据结构。

MIB的层次结构:SNMP管理对象组织成分层的树结构

          分层结构的作用:

                 1)表示管理和控制关系:上层负责它下面子树信息的管理和审批。

                 2)提供了结构化的信息组织技术:沿着树层次访问相关信息就很方便

                 3)提供了对象命名机制:树中每个节点都有一个分层的编号,例如:ISO(1)

                       叶子节点代表实际的管理对象,从树根到树叶的编号串联起来,用圆点隔开,就形成了管理对象的全

                       局标识符。例如:{ISO(1)org(3)dod(6)1}。

internet下面的4个节点:directory(1)是OSI的目录服务(X.500)使用的

                                            mgmt(2)包括由IAB批准的所有管理对象

                                            experimental (3)子树用来标识在互联网上试验的所有管理对象。

                                            private(4)子树是为私人企业管理信息准备的。

ASN.1的数据类型:每个对象属于一定的对象类型,并且有具体的值。

                                    对象类型的定义是一种语法描述,对象的实例是对象实例的具体实现。

                                    SNMP的对象是用形式化方法定义的,它说明管理对象的类型,它的组成和值的范围,以及

                                    与其他对象的关系。只用到了ASN.1的一个子集。

数据类型:

                   1、通用类型:有20多种,在SNMP管理对象的定义中只用到5种,前四种简单数据类型,最后一种是

                         类型。

                         1)INTEGER                       UNIVERSAL2                整数

                         2)OCTET STRING           UNIVERSAL4               位组串

                         3)NULL                              UNIVERSAL5               NULL

                         4)OBJECT IDENTIFIER  UNIVERSAL6               对象标识符

                         5)SEQUENCE(OF)          UNIVERSAL16             序列        

                   2、子类型:

                        1)单个值  TestResult::=INTEGER(0|1|2):说明可取其中任何一个

                        2)允许的字符HouseNumber::=IA5String(FORM(“0”|“1”|“2”|“3”|“4”|“5”|“6”|“

                               8”|“9”)SIZE(1..5)),可取的值是5个数字组成的字符串。

                        3)值的范围EmployeeNumber::=INTEGER(1000..20000)

                               该变量取整数值,范围为1000至20000.

                         4)大小限制WorkstationNumber::=OCTET STRING(SIZE(32))

                                该变量的值为32个字节的串。

                     3、文字约定:ASN.1是区别大小写的,另外还由一些文字约定:                                         

                            1)跳空格,与布局无关

                            2)注释以----开头,以-----结束。

                            3)标识符由大、小写字母,数字和横线组成

                            4)内部类型标识符全部大写

                            5)用户定义的类型名和模块名以大写字母开头。

                            6)变量名以小写字母开头

            4、应用类型(RFC1155):ASN.1中的应用类型与特定的应用有关。

                  *NetworkAddress::=CHOICE{internet IpAddress}这种类型用ASN.1中的CHOICE构造定义,可以从

                    各种网络地址中选择一种。

                  *interne OBECT IDENTIFIER::={iso(1)org(3)dod(6)1}SNMP采用对象标识符作为对象的唯一

                    标识。

                  *IpAddress::=[APPLICATION 0]IMPLICIT OCTET STRING(SIZE(4))

                   32位的IP地址,定义为OCTET STRING类型。

                  *Counter::=[APPLICATION 1]IMPLICIT INTRGER(0..4294967295)计算器类型是一个非负整数

管理信息结构的定义:

       1)为每一类对象定义一种对象类型。MIB的实现很复杂

       2)定义一种带参数的通用对象类型,参数的不同代表不同种类的对象

       3)利用ASN.1宏定义表示一个有关类型的集合,然后用类型定义管理对象。SNMP采用此方法

定义层次:

       1)宏定义:定义了一组合法的宏实例,说明了有关类型的语法

       2)宏实例:由宏定义通过参数替换产生的实例,说明一种具体类型

       3)宏实例的值:表示一个具体特定值的实体。

图2.21  MIB-2定义对象类型的定义,如下

OBJECT-TYPE MACRO::=

        BEGIN

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

                                          "ACCESS" Access

                                          "STATUS"Status

                                          DescrPart

                                          ReferPart

                                          IndexPart

                                          DefValPart

    VALUE NOTATION::=value(VALUE ObjectName)

   Access::="read-only"|"read-write"|"write-only"|"not-accessible"

   Status::="mandatory"|"optional"|"obsolete"|deprecated"

   DescrPart::="DESCRIPTION" value(description DisplayString)|empty

   ReferPart::="REFERENCE" value(reference DisplayString)|empty

   IndexPart::="INDEX" "{"IndexType"}"

   Index Types::=IndexType|IndexType "," InextType

   IndexType::=value(indexobject ObjectName)|type (indextype)

   DefValPart::="DEFVAL" "{" value(defvalue ObjectSyntax) "}"|empty

   DisplayString::=OCTET STRING SIZE(0..255)

END

在此例中,SYNTAX,表示对象类型的抽象语法,在宏实例中关键字type应由RFC1155中定义的ObjectSyntax代替,举例:TYPE NOTACTION::="SYNTAX" type(TYPE ObjectSyntax),我们有:                                                            ObjectSyntax::=CHOICE{simple SimpleSyntax,application-wide ApplicationSyntax}simpleSyntax是指5种通用类型,ApplicationSyntax是指6种应用类型。

ACCESS:定义SNMP协议访问对象的方式。可选择的访问方式有只读,读写,只写,不可访问4种,这是通过访问子句定义的。任何实现必须支持宏定义实例中定义的访问方式,还可以增加其他访问方式,但不能减少。

例句:Access::="read-only"|"read-write"|"write-only"|"not-accessible"

STATUS:说明实现是否支持这种对象。状态子句中定义了必要的(mandatory)和任选的(optional)两种支持程度。obsolete是指老标准支持而新标准不支持类型。如果一个对象被说明为可取消的(deprecated),则表示当前必须支持这种对象,但在将来的标准中可能被取消。

例句:Status::="mandatory"|"optional"|"obsolete"|deprecated"      

DescrPart:这个句子是任选的,用文件说明对象类型的含义。

例句:      DescrPart::="DESCRIPTION" value(description DisplayString)|empty  

ReferPart:任选的,文字说明可参考在其他MIB模块中定义的对象

例句: ReferPart::="REFERENCE" value(reference DisplayString)|empty                  

IndexPart:用于定义表对象的索引项。

DefValPart:定义了对象实例默认值,这个子句是任选的。

例句:   DefValPart::="DEFVAL" "{" value(defvalue ObjectSyntax) "}"|empty    

VALUE NOTACTION:指明对象的访问名。

宏定义是有类型表示(TYPE NOTATION)、值表示(VALUE NOTATION)和支持产生式3部分表示,最后部分任选。