zoukankan      html  css  js  c++  java
  • 【snmp】MIB结构与语法

    一、 MIB基础知识

    MIBManagement Information Base,管理信息库)是MOManaged Object管理对象)定义的集合。MIB文件是按照ASN.1定义的文本文件。

     每个管理对象都对应一个节点,并且用OID(Object Identifier)来标识;数据管理对象对应叶子节点;所有的管理对象形成了一棵管理树。

    1.1 基本概念

    对象标识:对象标识是一种数据类型,它指明一种授权命名的对象。表示为一个整数序列,以点分隔。

    MIB树:表示对象标识的整数构成一个树型结构,类似于DNS和文件系统。

    对象标识从顶部开始,顶部没有标识,以root表示。所有的MIB变量都从1.3.6.1.2.1这个标识开始。树上的每个节点还有文字名,例如:1.3.6.1.2.1就和iso.org.dod.internet.memt.mib对应。

              

    1.2  MIB分类

    MIB依据数据的通用性可以分为:

    1)标准MIBrfc1213, rfc1471 , rfc1724, rfc2618等等

       注: 通用性MIB rfc1213习惯称为MIB-II

    2)自定义MIB:当标准MIB信息不足以描述厂商设备,需要自定义MIB,但首先要向IANA组织申请编号。

    1.3 MIB管理对象的基本属性

    管理对象的四个基本属性如下:

    1)对象类型(Object Type):定义了一个特定对象的名字,例如sysUpTime。这个名字只是一个标示符。MIB对象既可以用这个标示符来表示,也可以用相应的MIB号码来表示。例如定义internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }

    那么既可以用internet也可以用字串 .1.3.6.1来表示这个对象。

    2)语法(Syntax) :指定了数据类型,例如整数、8位组串数字(字符串;范围为0255)、对象标识符(预先定义的数据类型别名)或NULLNULL是留待的后使用的空位。

    3)访问(Access):表明了这个特定对象的访问级别。合法的值有:只读、读写、只写和不可存取。

    4)状态(Status):定义了这个对象的实现需要:必备的(被管理节点必须实现该对象);可选的(被管理对象可能实现该对象):或者已废弃的(被管理设备不需要再实现该对象)

    1.4  MIB两种对象类型

    1)标量(Type-Specific Objects):

      例如以下oid是标量:

        iso.org.dod.internet.mgmt.mib-2.system.sysDesrc.0

    2)表量(Columnar Objects):

      例如以下oid是表量:

        iso.org.dod.internet.mgmt.mib-2.interface.ifTable.ifEntry.ifDescr.2

        iso.org.dod.internet.mgmt.mib-2.interface.ifTable.ifEntry.ifType.1

    二、  自定义MIB

       自定义MIB包含的内容有:模块级别信息、对象定义(OBJECT TYPE,包括标量对象和表对象)、陷阱定义(TRAP TYPE)。

     第1部分MIB开始,第2部分引入外部定义,第3部分是模块信息定义,第4部分MO定义,第5部分TRAP定义,最后MIB结束。

    2.1  常用对象类型

    v1中的

    1)简单类型:IntegerOctet StringObject IdentifierNull

    2)应用类型:IpAddressCounterGaugeTimeTicksOpaque

    v2中的

    1)简单类型:Integer32OctetStringObject IdentifierNull

    2)应用类型:IpAddressCounter32Counter64Gauge32Unsigned32TimeTicksOpaqueBIT STRING

    2.2  自定义MIB基本原则

    1)优先采用标准MIB:如果确实无法满足要求才考虑自定义MIB

    2)采用最新的SNMPV2SMI来定义MIB:使用最新的SNMPv2定义MIB可以使得对MIB的描述更详尽,可用的类型也更丰富。

    3)层次清晰,定义时顺序合理

            — 先定义根节点。

            — 在定义对象前,如有自定义类型,应当先书写自定义类型的定义。

            — 先定义标量对象,再表量对象。

    4)符合惯例,以标准MIB为参考

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

    3.1  对象标识符 类型(OBJECT IDENTIFIER

    ASN.1中,对象标识符 类型 描述对象的抽象信息,MIB树中的每一个标号是用对象标识符描述的。由于树的各个分支是用数值表示的,所以实际上对象标识符是一个整数数值的序列。它用OBJECT IDENTIFIER来声明,如:

    myBranch OBJECT IDENTIFIER ::= { parentBranch 10 }

    其中myBranch是一个子树支,它定义在parentBranch树支下,“10”是子树myBranch在父树支parentBranch下的一个唯一对象标识符,即通常所说的OID。在parentBranch树支下,可以定义多个子树支,但子树支的名字和数字(如上的10)不能重复,即必须是唯一的。

    3.2  标量(叶子)对象标识符——简单变量

    在一个树支下,读者可以定义多个子树,也可以定义被管理资源的管理对象,其定义的句法如下:

    (objectname) OBJECT-TYPE
    	SYNTAX (syntax)
    	ACCESS (access)
    	STATUS (status)
    	DESCRIPTION (description)
    	::= { (parent) (number) }

    sysContact OBJECT-TYPE
        SYNTAX  DisplayString (SIZE (0..255))
        ACCESS  read-write
        STATUS  mandatory
        DESCRIPTION
          "The textual identification of the contact person
           for this managed node, together with information
           on how to contact this person."
        ::= { system 4 }

       以上的各部分解释如下:

    1(objectname):这是被管对象的名字,ASN.1句法要求所有对象的名字必须以小写字母开头,而且该名字在MIB中必须是唯一的。

    2OBJECT-TYPE:这是一个每一个叶子对象的所必须的关键字。

    3SYNTAX:被管对象类型的关键字,说明随后跟着的是一个类型。

    4(syntax):被管对象的类型,ASN.1句法要求所有的对象类型必须以大写字母开头,其中已预定义了的类型有CounterGaugeDisplayStringINTEGER等等,请参阅“3.对象语法定义”及“5.ASN.1的派生类型”。

    5ACCESS:被管对象的访问方式的关键字。在SNMP第二版中为MAX-ACCESS关键字。

    6(access):被管对象的访问方式,可为如下列举值中之一:read-onlyread-writeno-accessibleSNMP2版中又新增了read-create

    7STATUS:被管对象的状态的关键字。

    8(status):可取的值为:mandatory optionalobsoletedeprecateSNMP1版中),currentobsoletedeprecateSNMP2版)。

    status 说明
    mandatory 表示该对象的状态是必备的
    optional 表示该对象的状态是可选的
    obsolete 使用该值使得MIB的某些部分标记为过时,被标记为“废弃”的对象将从现行版本中删除,并在新的MIB版本中标记为“过时”。
    current 表示该对象的状态是当前可用的

    9DESCRIPTION:对被管对象的功能、特征等等进行描述的关键字。

    10)(description):被管对象的文本描述。须用双引号把其文本说明括起来,有时由于用MIB编译器编译结果太大时,可以把文本说明删除,即只保留一个空的双引号。

    11)(parent):包含此叶子对象的树支,即叶子对象的父亲必须是用“OBJECT IDENTIFIER”声明。

    12)(number):在此父树支下的第几个叶子对象,这个数字在此父树支下必须是唯一的。一般number都是从取1开始的。例如:“::={ myObject 22 }”,则在myObject树支下22必须是唯一的,否则在用MIB编译器(如pSOS所提供的MIB编译器)进行编译时会提示有错。

    除此之外,还有一些关键字:UNITSINDEXREFERENCEDEFVAL等等,分别代表被管对象的单位、索引、参考、缺省值。值得注意的是INDEX关键字在表对象定义中必须存在的,否则表内的对象不能使用。

    3.3  表类型 

    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)中的ACCESSnot-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

        }   

    上表中有三个列对象myIndexmyColumn1myColumn2

    mib内容如下:

    XXX-TEST-MIB DEFINITIONS ::= BEGIN
    
    	IMPORTS
    		enterprises
                FROM RFC1155-SMI
            Integer32
                FROM SNMPv2-SMI            
            DisplayString
                FROM SNMPv2-TC;
    
        xxx OBJECT IDENTIFIER ::= {enterprises 22566}
    	zkClassInfoTable OBJECT IDENTIFIER ::= {xxx 1}    
      
    	zkClassInfoTable OBJECT-TYPE
    		SYNTAX   SEQUENCE OF ZkClassInfoEntry
    		MAX-ACCESS not-accessible
    		STATUS current
    		DESCRIPTION
    			"This is test table."
    		::= {xxx 1}
    
    	zkClassInfoEntry OBJECT-TYPE
    		SYNTAX    ZkClassInfoEntry
    		MAX-ACCESS  not-accessible    
    		STATUS current
    		DESCRIPTION
    			"This is teat entry. "     
    		INDEX {zkClassInfoIndex}             
    		::= {zkClassInfoTable 1}   
    
    	ZkClassInfoEntry ::= SEQUENCE {
    		zkClassInfoIndex Integer32,
    		zkClassInfoSex Integer32,
    		zkClassInfoAge Integer32,
    		zkCLassInfoName DisplayString,
    		zkClassInfoAddress DisplayString
    	}
    		 
    	zkClassInfoIndex OBJECT-TYPE
    		SYNTAX Integer32
    		MAX-ACCESS read-write
    		STATUS current
    		DESCRIPTION
    			""
    		::= {zkClassInfoEntry 1} 	
    		
    	zkClassInfoSex OBJECT-TYPE
    		SYNTAX Integer32  {
    				  man(1),
    				  woman(2)
    		}
    		MAX-ACCESS read-write
    		STATUS current
    		DESCRIPTION
    			""
    		::= {zkClassInfoEntry 2}   
    	 
    	zkClassInfoAge OBJECT-TYPE
    		SYNTAX Integer32
    		MAX-ACCESS read-write
    		STATUS current
    		DESCRIPTION
    			"	"
    		::= {zkClassInfoEntry 3}
    	 
    	zkCLassInfoName OBJECT-TYPE
    		SYNTAX DisplayString
    		MAX-ACCESS read-write
    		STATUS current
    		DESCRIPTION
    			""
    		::= {zkClassInfoEntry 4}
    
    	zkClassInfoAddress OBJECT-TYPE
    		SYNTAX DisplayString
    		MAX-ACCESS read-write
    		STATUS current
    		DESCRIPTION
    			""
    		::= {zkClassInfoEntry 5}   
    
    
    END

    参考地址

    MIB结构和语法

  • 相关阅读:
    【插件开发】—— 10 JFace开发详解
    百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。
    Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)
    Python 3.X 要使用urllib.request 来抓取网络资源。转
    python创建目录保存文件
    Python返回数组(List)长度的方法
    python中for、while循环、if嵌套的使用
    (转)python3 urllib.request.urlopen() 错误UnicodeEncodeError: 'ascii' codec can't encode characters
    python 之 string() 模块
    (转)Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/13365850.html
Copyright © 2011-2022 走看看