摘  要   本文介绍了SNMP中MIB的概念、框架结构、ASN.1语法,还列举了SNMP网管中常用到的管理对象。最后,笔者给出了ASN.1的一些重要规则。

关键词  简单网络管理协议(SNMP)  管理信息库(MIB)  MIB树   ASN.1语法  对象标识符(OID)

SNMP(简单网络管理协议)是目前在计算机网络中用得最广泛的网络管理协议,该协议是基于TCP/IP的网管标准,它包括协议自身、数据库的定义和相关概念。用于TCP/IP网络管理的网络管理模型包括四个关键性部件:网络管理协议、管理站、管理代理和管理信息库。而管理信息库(MIB)是存放了被管对象资源的所有信息, 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树的结构

MIB树的根节点并没有名字或编号,但是它有下面3个子树:

  1. iso(1),由ISO管理
  2. ccitt(2),由CCITT管理
  3. iso/ccitt(3),由ISO和CCITT共同管理

在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)子树

至目前,Directory(1)是保留在将来使用。

  • Mgmt(2)子树

Mgmt(2)子树包含关于DOD协议的管理信息,目前该子树中的对象是最广泛的。其中对象标识符1.3.6.1.2.1已被MIB-II所取代。

  • Experimental(3)子树

实验协议和MIB开发通常使用这个子树,在这个子树下的所有对象的标识符都以整数1.3.6.1.3开始,一个实验性的新的MIB可能被赋于和对象标识符相关联的编号或一个整数,如1{experimental 1}。

  • Private(4)子树

Private(4)子树用来指定单方面定义的对象。该子树中网络管理系统访问最多的部分是enterprises(1)节点。该节点下的每个子树分配给一个企业,而企业必须先向IAB登记注册它们自已的厂商代码,然后就可以在该代码下创建他们自己的对象。

三、理解和掌握ASN.1句法

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句法中关于定义一个表的规则如下:

  1. 在表名(tablename)的命名中,必须要有一个“Table”关键字,例如定义一个表对象“myTable”
  2. 同样,在表对象下面的表目(entryname)也须有一个“Entry”关键字,例如“myEntry”
  3. (column1)是表的列对象,(column1type)是此列对象的类型

为了加深理解,举个例子如下:

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。

四、常用的MIB对象

在RFC1213.mib中(即基于TCP/IP的因特网网络管理之管理信息库:MIBII,现已被RFC2013所取代),存在很多的管理对象,初学者往往不知道从何下手或者不知道哪些用得上或用不上。笔者为此罗列了以下常用的管理对象:

  1. 几个重要的叶子对象

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.0sysDescr叶子对象的实例,而一个表对象实例1.3.6.1.2.1.2.2.1.2.3ifDescr表对象的第三个实例。

最后重申一下ASN.1规则,这些规则对于理解SNMP的MIB定义是极其重要

  1. 在RFC1155中描述了许多已定义的ASN.1类型;
  2. 某些名字用小写保留开头,这些名字仅为增强ASN.1表示法的易读性而引入的。
  3. 一律用大写字母显示某些保留字,这些保留字是有专门含义的;
  4. ASN.1类型名总是用大写字母开头;

快速理解和掌握MIB相关推荐

  1. Java快速创建大量对象_3分钟 快速理解JVM创建对象的步骤!

    原标题:3分钟 快速理解JVM创建对象的步骤! 我们平时创建一个对象只需要new.然而我们知道对象的创建到底经历了哪些呢?实际上只不过仅仅的3步就完成了.先来看看完整的创建过程,再来一步一步的分析. ...

  2. python爬虫入门教程--快速理解HTTP协议(一)

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道.下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要 ...

  3. 通俗易懂:快速理解ipv4的NAT穿透原理

    NAT基础   IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了地址耗尽危机.   NAT(Network Address Translation,网络地址转换),也 ...

  4. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一 ...

  5. TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅

    TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...

  6. 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...

  7. IM开发基础知识补课(三):快速理解服务端数据库读写分离原理及实践建议

    1.前言 IM应用从服务端数据的角度来看,它是一种很特殊的应用场景,抛开基础数据.增值业务和附属功能不谈,单从IM聊天工具的立身之本--聊天数据来说,理论上是不需要在服务端存储的(或者说只需要短暂存储 ...

  8. 网络编程懒人入门(三):快速理解TCP协议一篇就够

    1.前言 本系列文章的前两篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>.<网络编程懒人入门(二):快速理解网络通信协议(下篇)>快速介绍了网络基本通信协议及理论基 ...

  9. 网络编程懒人入门(二):快速理解网络通信协议(下篇)

    1.前言 本文上篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>分析了互联网的总体构思,从下至上,每一层协议的设计思想.基于知识连贯性的考虑,建议您先看完上篇后再来阅读本文. 本 ...

  10. 网络编程懒人入门(一):快速理解网络通信协议(上篇)

    1.写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统,很多时候连基本的网络编程理论(如网络协议等)都不了解,就贸然定方案.写代码,显得非常盲目且充满技术风险. 即时通讯网论坛里精心整 ...

最新文章

  1. 北京大力度建设城市绿道,我们身边处处是风景
  2. 用extjs4做个登录框
  3. codeforces contest 1142
  4. server之后安装ssms失败 安装sql_SQL Server 2017 安装问题(转)
  5. Hadoop 2.2.0源码浏览:4. NodeManager
  6. h5文字垂直居中_CSS中垂直居中和水平垂直居中的方法
  7. php登录注册脚本,PHP - 登录脚本
  8. oracle备份表和数据
  9. poj1036-dp
  10. 数据结构与算法(java)
  11. 怎么用ps做一个黑底白字_ps怎么把白底黑字变成黑底白字
  12. LiveQing流媒体RTMP推流服务-如何获直播流地址 HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP视频流地址
  13. LVS+Keepalived之DR模式配置
  14. LINUX内核编译选项-5
  15. 2022年全球市场筒仓称重系统总体规模、主要生产商、主要地区、产品和应用细分研究报告
  16. Zabbix-Linux-邮箱报警
  17. SPI 读取不同长度 寄存器_敏矽微电子Cortex-M0学习笔记10-SPI通信详解
  18. python QT designer tableview 滑条QScrollBar样式设置后失效解决方案
  19. js 所有的网络请求方式
  20. VTK学习笔记(九)vtkDiskSource

热门文章

  1. 【Paper笔记】Complement Objective Training
  2. linux pl2303 驱动下载,ubuntu装pl2303USB转串口驱动(详细,亲测)
  3. 热点讨论:IT人,40岁以后能干什么?
  4. 【线性代数(2)】n阶行列式三种定义
  5. 制作一幅简单的ArcGIS故事地图
  6. MATLAB——网格图画法
  7. 树莓派 pico pio 可编程io
  8. 1004-史丰收速算
  9. ERP企业资源管理系统的介绍
  10. ubi命令用法(linux)