快速理解和掌握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個子樹:
- iso(1),由ISO管理
- ccitt(2),由CCITT管理
- 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句法中關於定義一個表的規則如下:
- 在表名(tablename)的命名中,必須要有一個“Table”關鍵字,例如定義一個表物件“myTable”
- 同樣,在表物件下面的表目(entryname)也須有一個“Entry”關鍵字,例如“myEntry”
- (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所取代),存在很多的管理物件,初學者往往不知道從何下手或者不知道哪些用得上或用不上。筆者為此羅列了以下常用的管理物件:
- 幾個重要的葉子物件
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.0為sysDescr葉子物件的例項,而一個表物件例項1.3.6.1.2.1.2.2.1.2.3為ifDescr表物件的第三個例項。
最後重申一下ASN.1規則,這些規則對於理解SNMP的MIB定義是極其重要
- 在RFC1155中描述了許多已定義的ASN.1型別;
- 某些名字用小寫保留開頭,這些名字僅為增強ASN.1表示法的易讀性而引入的。
- 一律用大寫字母顯示某些保留字,這些保留字是有專門含義的;
- ASN.1型別名總是用大寫字母開頭;