1. 程式人生 > >快速理解和掌握MIB

快速理解和掌握MIB

摘  要   本文介紹了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型別名總是用大寫字母開頭;