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部分表示,最后部分任选。