像已经描述的那样.MIB定义被管理对象是通过什么标准来定义的呢,就是SMI.SMI定义了管理信息怎么组织和命名.允许的操作.认可的数据类型和指定MIBs库的语法.被管理对象系统中资源的抽象,独立于被管理需求的存在.这些对象的MIB没有定义这些资源的实际实现,一些对象只有一个实例(比如一个系统的未知),而其他的有多个实例(比如网络连接),有相同实例类型有联系的对象在SNMP MIBs中在概念上组成一个表,和一个实例相关的对象标识符就称作一个SNMP 变量(SNMP Variable)
SMI就像是一个数据库系统的图解,它定义了被管理对象的模型和能在对象上执行的操作,还有对象允许的数据类型,OSI方法像一个面向对象的模型,而SNMP方法像一个关系数据库模型
4.1 对象标识符(OIDs)
在SNMP中,对象被明确的定义通过给他们指定一个OID值.在空间和事件上唯一.对象标识符就是一系列的正整数继承的组织起来,就像UNIX 和 PC-DOS文件系统名字是的,为了使用更加方便,每一个OID值都伴随着一个文本字符串.SNMP使用一个来自数字值的编码,而不是文本字符串.OIDs用以下的格式写出
例子:
OIDs能够用来唯一标识任何事物,不仅仅是被管理对象.一些OIDs被使用仅仅是帮助组织OID继承树
4.2 MIB模块
SNMP的MIB通过大量的来自多个文档的模块来定义.(...MIB在不同的语境下的不同含义 略)
MIB模块的名字必须以大写字母开始,被一个数字跟随,和".","."不能是最后一个字符,"."的后面也不能再跟着一个".",然而,MIB编译器或者是网络管理工作站对命名限制会更加严格
在OID树的注册节点在模块中被定义.这些会被详细的描述在这篇文章的后面.下面是SNMP MIBs 和 MIB 模块的语法.
4.3 模块规则结构
对象在OID树中的位置必须在写一个MIB 模块前就确定下来.对于IETF工作团体开发的MIBs,一个分支必须安排在"internet experimental"分支下,对于私有MIBs,一个分支必须安排在"enterprises"分支下.一旦一个MIB被发布,条目就不能在更改了.MIB模块总是以相同的形式开始.为这个模块选择一个唯一的名字,之后是导入注册点对象.模块中用到的语法类型,
和OBJECT-TYPE, TRAP-TYPE宏.当在一个模块中用到了某个条目,就需要导入此条目.下面是一个MIB模块的壳的例子
4.4 对象标识符条目
在SNMP的MIBs中,被定义为对象标识符的条目是高级的注册节点.对象标识符的名字必须以一个小写字母开头.后面可以接字母,数字,和连字符.
对象标识符的语法和例子如下图所示
4.5 被管理的对象定义
三种对象的类型能够使用OBJECT-TYPE宏来定义.其中包括表,行,叶对象.命名必须以一个小写字母开头,后面紧随一个字母,数字或者是连字符.总共有两个版本的OBJECT-TYPE宏.两个版本最大的不同点是当前的版本包含INDEX条款.用来指定构建SNMP变量的规则.
4.5.1 表对象(Table)
表由多个行组成.因为SNMP SMI定义的历史原因,表的结构有一些奇怪.通过SNMP一个表是不能获取到的,仅仅 列对象 能被获取到.一个表的语法必须是"SEQUENCE OF <sequence>".按照习俗,表都是以"Table"作为后缀命名的.序列的后缀被设置为"Entry".举个例子,如果"fooTable"是一个表的名字.那么和他相关联的序列就会被命名为"FooEntry".一个表的访问属性必须是"not-accessible".
4.5.2 行对象(Entry)
多个列组成一个行.通过SNMP一行是不可以返回的.仅仅是列对象才能返回.GET 和 GETNEXT请求能够用来获得一个被选择行的所有的列.一行的名字就是把和它相关的表的名字的后缀"Table"换成"Entry".一行的语法类型必须是被相关表使用的序列.行的访问属性必须是不可访问的.行的OID值就是在表的OID值后面简单的加上个".1".INDEX条款必须被指定一个规则才能构建一个表中的行的某一列对象的实例.下面是一个行对象语法的定义和例子.
4.5.3 序列的定义(sequence)
在一行中一个序列是用来指定所在的列.对于大多数表和行,序列的条目是行对象的子.然而如果表是一个已经存在的表的扩展,那么已存在的表中的所有或一部分列对象就会被加到序列中.
4.5.4 叶对象
叶对象是最小的信息结构.一个对象OID和它相关的信息实例结合起来称作SNMP变量.这些都是SNMP操作的参数.一个设备接口数的叶对象只有一个唯一的实例.这种情况,实例被指定为在SNMP变量后面加个".0".下面是