TCP/IP 協定與 Internet 網路:第十六章 SNMP 網路管理協定 上一頁 下一頁
16-7 MIB 訊息資料庫
『管理訊息資料庫』(Management Information Base, MIB)是描述被管理物件的資料結構。SNMP 被設計成可以管理各種網路設備,造成它所管理的訊息也隨著設備有成千上萬種,而每種網路或設備對自己資料的表達方式也不會相同,為了讓這些資訊納入同一套管理系統,就必須採用一套抽象的語法,來描述所有類型的訊息,因此,SNMP 定義了『管理訊息資料庫』(MIB),以階層式來描述所有被管理物件的屬性,並稱這些被管理訊息為『SNMP 物件』(SNMP Object)。
16-7-1 管理物件表示法
SNMP 針對每一個 SNMP Object 都以『物件描述樹』(Object Identified Tree)來描述。因此,MIB 為一樹狀結構(MIB Tree),它的每一節點代表一個管理群組(如 internet、private、snmp)或管理物件(如 system、ip、tcp),而其末端(leaf)為 SNMP Object 的訊息(如 tcpRtoAlgorithm)。每一節點或端點都有編號,此邊號稱之為『物件識別值』(Object Identifier, OID)。SNMP 的物件描述樹如圖 16-5 所示。
圖 16-5 MIB 樹狀結構部份樣本
我們用 udp 群組來說明管理物件的內容數值、MIB 編排的順序、以及這些功能的簡單例子。如圖 16-6 中 udp 群組包含了 4 個管理物件(udpInDatagrams、udpNoPort、udpInErrors 與 udpOutDatagrams)和一個表格(udpTable),在樹狀結構圖中以『●』 表示某一樹狀描述的分支端點,它並沒有真正的數值內容,因此無法讀取或寫入。另外以『■』表示描述樹的分葉,它代表著某一管理物件,也表示存放著一個數值內容可以讀取,在某些情況下允許更改該數值內容。
圖 16-6 udp 群組的樹狀結構
我們用表 16-1 來登錄這些管理物件,並且編排某一物件的號碼,以 udp 群組物件編號是 1.3.6.1.2.1.7,則 udpInDatagrams(1) 為 1.3.6.1.2.1.7.1,或者以 udp.1 表示之;資料型態欄位表示該數值變數的型態,可能是 Integer32、Counter32、或其它型態;讀/寫欄位表示該數值是否允許變更,如標示『NA』表示不可以讀取(該物件為分支端點);描述欄位是對該管理物件功能作簡單的描述。
表 16-1 udp 群組的管理物件(1.3.6.1.2.1.7)
物件名稱 |
資料型態 |
讀/寫 |
描 述 |
udpInDatagrams(1) |
Counter |
|
傳入的 UDP 封包總數 |
udpNoPorts(2) |
Counter |
|
沒有特定連接埠口的 UDP 封包總數。 |
udpInErrors(3) |
Counter |
|
傳入的錯誤 UDP 封包總數。 |
udpOutDatagrams(4) |
Counter |
|
傳出 UDP 封包總數。 |
udpTable(5) |
Sequece of |
NA |
Udp 表格。 |
在圖 16-6 中有一個 udpTable 表格(UDP 傾聽表格),資料型態為 Sequence of udpEntry,它的結構非常類似 C 語言的 Structure 資料型態。udpEntry 描述表格內容如下:
udpEntry ::= Sequence {
udpLocalAddress IpAddress,
udpLocalPort Integer,
}
表 16-2 為 udpTable 表格的物件編排號碼及其內容描述,其中 udpLocalAddress 的物件識別標號為 1.3.6.1.2.7.5.1.1,udpLocalPort 是 1.3.6.1.2.7.5.1.2。如以一般表示方法為 <udpLocalAddress>.<udpLocalAddress>,簡單的說,就是哪一個本地網路位址下的哪一個傳輸埠口正在傾聽等待接收資料。
表 16-2 udpTable 表格之管理物件(1.3.6.1.2.7.5)
物件名稱 |
資料型態 |
讀/寫 |
描 述 |
udpEntry(1) |
Sequence |
NA |
Udp 表格入口。 |
udpLocalAddress(1.1) |
IpAddress |
|
本地 IP 位址。 |
udpLocalPort(1.2) |
Integer |
|
本端埠口。 |
16-7-2 引例識別
當 SNMP 參照到 MIB 裡的每一變數時,這些變數必須被辨識出來,以供取得或設定其內容,這裡面有兩個重點:第一,只有葉部的節點可以被參考;第二,SNMP 並不操作表格內的全部列數或全部行數的內容。由圖 16-5 中可以看出,SNMP 不能直接讀取 mib-2、udp、udpTable 和 udpEntry 的內容,因為它們不是描述樹中的葉部。但我們在追蹤描述樹時,可能會由一個端點往下一個端點來探索,針對每一端點如何引導下一個節點(或端點),稱之為『引例識別』(Instance Identified),有下列兩種方式:
(A) 簡單變數
簡單變數表示在描述樹中的葉部,它只描述某一個管理物件,也無法再由這個分葉再往下探索,因此都是藉由將『.0』附加到物件描述值的後面。例如,1.3.6.1.2.7.1.0(udpIndatagram.0) 表示指定到 udpIndatagram 變數的內容。簡單變數在存取方面比較簡單,直接指定到該變數位址即可,但是執行 SNMP 命令時,只能使用絕對位址,而不能使用相對位址。如 SNMP Manager 以標準命令格式擷取變數內如如下:
GetRequest(iso.org.dod.internet.mgnt.mib-2.udp.udpInDatagrams.0) 或
GetRequest(1.3.6.1.2.7.1.0)
則 SNMP Agent 回應:
GetResponse(iso.org.dod.internet.mgnt.mib-2.udp.udpInDatagrams.0=30) 或
GetResponse(1.3.6.1.2.7.1.0=30)
有些文件(如 RFC)為了簡化書寫繁雜,將其簡化成 GetRequest (udpInDatagrams)或 GetResponse(udpInDatagrams=30),但它也是表示絕對位址的意思。
我們可以利用 snmputil 命令來擷取變數的內容(snmputil 是 Windows 2000 的 SNMP Manager 程式,請參考附錄安裝手冊),snmputil 命令格式為:
C:\>snmputil [get|getnext|walk] agent community oid [oid ….]
其中:get|getnext|walk 為擷取方式,get 表示擷取某一 oid(Object Identified)變數內容,因此必須指定某一絕對位址,而 oid 後面必需加上『.0』;getnext 表示 oid 下一變數的內容;walk 表示按照 MIB-II 描述樹追蹤下去。agent 是 SNMP Agent 的識別碼,一般皆以 IP 位址表示。community 為共同體的識別字,除非 Agent 上有特別設定,否則都以內定值是 public 表示。oid 是物件識別碼,標準表示方式為『.3.6.1.2.1.7.1』,但 snmputil 允許以較簡潔的『udp.1』表示。
C:\Resource Kit>snmputil get 163.15.2.33 public udp.1.0 <Enter> Variable = udp.InDatagrams.0 Value = Counter32 915 C:\Resource Kit>snmputil getnext 163.15.2.33 public udp.1.0 <Enter> Variable = udp.udpNoPorts.0 Value = Counter32 7 |
上述第一個 snmputil 是以 get 命令擷取,而指定到 oid 位址是 udp.1.0,第二命令則以 getnext 命令擷取,雖然指定到同一個變數,但它是擷取下一個變數(udpNoPorts.0)的內容。
(B) 表格
圖 16-7 為 UTP 傾聽表格(udpTable)與 MIB 描述樹之間的關係。udpTable 中有兩個屬性(Attribute):udpLocalAddress 和 udpLocalPort 變數分別在描述樹的分葉上,如用一般表格表示方式,表格中的『行』表示各變數的內容,也就是描述樹的分葉(如 udpLocalAddress);而『列』是哪一筆資料,如第一筆資料是 0.0.0.0:7,表示本地網路位址是 0.0.0.0,埠口位址是 7,正在傾聽是否有資料傳送過來,另外四筆資料也是一樣(只節錄某些資料)。
圖 16-7 udpTable 表格與描述樹關係的範例
MIB 是以物件識別值(Object Identifier, OID)的順序排列,排列方式有一個特殊的隱含性,也就是 MIB 的所有紀錄都是以它們物件識別值為順序,作為辭典編篡順序。如以圖 16-7 中的 udpTable 表格內容為例,每一列(或稱每一紀錄)的物件識別值如表 16-3 所示,但 MIB 字典編篡是以每一行(或稱每一物件確認值)為順序排列,如同表 16-3 的紀錄順序經過以物件識別值為順序排例,其排列結果如表 16-4 所示。
表 16-3 udpTable 表格內每一列物件確認值
列 |
物件確認值(OID) |
簡寫名稱 |
值(Value) |
1 |
1.3.6.1.2.7.5.1.0.0.0.0.7 1.3.6.1.2.7.5.2.0.0.0.0.7 |
udp.udpLocalAddress.0.0.0.0.7 udp.udpLocalPort.0.0.0.0.7 |
0.0.0.0 7 |
2 |
1.3.6.1.2.7.5.1.127.0.0.1.53 1.3.6.1.2.7.5.2.127.0.0.1.53 |
udp.udpLocalAddress.127.0.0.1.53 udp.udpLocalPort.127.0.0.1.53 |
127.0.0.1 53 |
3 |
1.3.6.1.2.7.5.1.127.0.0.1.1029 1.3.6.1.2.7.5.2.127.0.0.1.1029 |
udp.udpLocalAddress.127.0.0.1.1029 udp.udpLocalPort.127.0.0.1.1029 |
127.0.0.1 1029 |
4 |
1.3.6.1.2.7.5.1.163.15.2.33.53 1.3.6.1.2.7.5.2.163.15.2.33.53 |
udp.udpLocalAddress.163.15.2.33.53 udp.udpLocalPort.163.15.2.33.53 |
163.15.2.33 53 |
5 |
1.3.6.1.2.7.5.1.163.15.2.33.67 1.3.6.1.2.7.5.2.163.15.2.33.67 |
udp.udpLocalAddress.163.15.2.33.67 udp.udpLocalPort.163.15.2.33.67 |
163.15.2.33 67 |
表 16-4 udpTable 表格之 MIB 辭典編篡順序
行 |
物件確認值(OID) |
簡寫名稱 |
值(Value) |
1 |
1.3.6.1.2.7.5.1.0.0.0.0.7 1.3.6.1.2.7.5.1.127.0.0.1.53 1.3.6.1.2.7.5.1.127.0.0.1.1029 1.3.6.1.2.7.5.1.163.15.2.33.53 1.3.6.1.2.7.5.1.163.15.2.33.67 |
udpLocalAddress.0.0.0.0.7 udpLocalAddress.127.0.0.1.53 udpLocalAddress.127.0.0.1.1029 udpLocalAddress.163.15.2.33.53 udpLocalAddress.163.15.2.33.67 |
0.0.0.0 127.0.0.1 127.0.0.1 163.15.2.33 163.15.2.33 |
2 |
1.3.6.1.2.7.5.2.0.0.0.0.7 1.3.6.1.2.7.5.2.127.0.0.1.53 1.3.6.1.2.7.5.2.127.0.0.1.1029 1.3.6.1.2.7.5.2.163.15.2.33.53 1.3.6.1.2.7.5.2.163.15.2.33.67 |
udpLocalPort.0.0.0.0.7 udpLocalPort.127.0.0.1.53 udpLocalPort.127.0.0.1.1029 udpLocalPort.163.15.2.33.53 udpLocalPort.163.15.2.33.67 |
7 53 1029 53 67 |
我們以 snmputil 的 GetNext 命令格式來擷取 utpTable 的表格內容,也可容易的發現,GetNext 所追蹤的路徑就如圖 16-7 中的虛線方向,而描述樹中的 udpLocalAdress(udp.5.1.1)就是 MIB 辭典中的第一行,而 udpLocalPort(udp.5.1.2)就是辭典中的第二行。我們依照圖 16-7 擷取 udpLocalAddress(udp.5.1.1)所追蹤的範例如下:
C:>snmputil getnext 163.15.2.33 public udp.5.1.1 <Enter> Variable = udp.udpTable.udpEntry.udpLocalAddress.0.0.0.0.7 Value = IpAddress 0.0.0.0 C:>snmputil getnext 163.15.2.33 public udp.5.1.1.0.0.0.7 <Enter> Variable = udp.udpTable.udpEntry.udpLocalAdrress.127.0.0.1.53 Value = IpAddress 127.0.0.1 C:>snmputil getnext 163.15.2.33 public udp.5.1.1.127.0.0.1.53 <Enter> Variable = udp.udpTable.udpEntry.udpLocalAdrress.127.0.0.1.1029 Value = IpAddress 127.0.0.1 C:>snmputil getnext 163.15.2.33 public udp.5.1.1.127.0.0.1.1029 <Enter> Variable = udp.udpTable.udpEntry.udpLocalAdrress.163.15.2.33.53 Value = IpAddress 163.15.2.33 C:>snmputil getnext 163.15.2.33 public udp.5.1.1.163.15.2.33 <Enter> Variable = udp.udpTable.udpEntry.udpLocalAdrress.163.15.2.33.67 Value = IpAddress 163.15.2.33 |
同樣的,我們擷取 udpLocalPort(udp.5.1.2)的追蹤的路徑如下:
C:>snmputil getnext 163.15.2.33 public udp.5.1.2 <Enter> Variable = udp.udpTable.udpEntry.udpLocalPort.0.0.0.0.7 Value = Integer32 7 C:>snmputil getnext 163.15.2.33 public udp.5.1.2.0.0.0.0.7 <Enter> Variable = udp.udpTable.udpEntry.udpLocalPort.127.0.0.1.53 Value = Integer32 53 C:>snmputil getnext 163.15.2.33 public udp.5.1.2.127.0.0.1.53 <Enter> Variable = udp.udpTable.udpEntry.udpLocalPort.127.0.0.1.1029 Value = Integer32 1029 C:>snmputil getnext 163.15.2.33 public udp.5.1.2.127.0.0.1.1029 <Enter> Variable = udp.udpTable.udpEntry.udpLocalPort.163.15.2.33.53 Value = Integer32 53 C:>snmputil getnext 163.15.2.33 public udp.5.1.2.163.15.2.33.53 <Enter> Variable = udp.udpTable.udpEntry.udpLocalPort.163.15.2.33.67 Value = Integer32 67 |