1. 程式人生 > >網路協議篇之SNMP協議(二)—— 管理資訊庫MIB及OID

網路協議篇之SNMP協議(二)—— 管理資訊庫MIB及OID

       上篇文章提到一套完整的SNMP系統主要包括管理資訊庫(MIB)、管理資訊結構(SMI)及SNMP報文協議。

       本篇我們來學習管理資訊庫(MIB)

一、管理資訊庫MIB

       任何一個被管理的資源都表示成一個物件,稱為被管理的物件。MIB是被管理物件的集合。它定義了被管理物件的一系列屬性:物件的名稱、物件的訪問許可權和物件的資料型別等。每個SNMP裝置(Agent)都有自己的MIB。MIB也可以看作是NMS(網管系統)和Agent之間的溝通橋樑。它們之間的關係如圖所示:

        MIB檔案中的變數使用的名字取自ISO和ITU管理的物件識別符號(object identifier)名字空間。它是一種分級樹的結構。

        如下圖所示,第一級有三個節點:ccitt、iso、iso-ccitt。低階的物件ID分別由相關組織分配。一個特定物件的識別符號可通過由根到該物件的路徑獲得。一般網路裝置取iso節點下的物件內容。如名字空間ip結點下一個名字為ipInReceives的MIB變數被指派數字值3,因而該變數的名字為:

       iso.org.dod.internet.mgmt.mib.ip.ipInReceives

相應的數字表示(物件識別符號OID,唯一標識一個MIB物件)為:

1.3.6.1.2.1.4.3


         當網路管理協議在報文中使用MIB變數時,每個變數名後還要加一個字尾,以作為該變數的一個例項。如ipInReceives的例項數字表示為:

1.3.6.1.2.1.4.3.0.

         需要注意的是,MIB中的管理物件的OID有些需要動態確定,如IP路由表,為了指明地址202.120.86.71的下一站路由(next hop),我們可以引用這樣的例項:

         iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71,

相應的數字表示為:1.3.6.1.2.1.4.21.1.7.202.120.86.71

對於這種動態物件標識的例項,由於無法轉換為預先指定的Readkey名稱,與飛鄰的產品架構衝突(需要動態生成可變Readkey),暫不考慮支援。

二、管理資訊庫mib-2

        在Internet結點下面的第二個結點是mgmt(管理),標號是2。再下面是管理資訊庫,原先的結點名是mib。1991年定義了新的版本MIB-II,故結點名現改為mib-2,其標識為{1.3.6.1.2.1},或{Internet(1) .2.1}。這種標識為物件識別符號。

        最初的結點mib將其所管理的資訊分為8個類別(上圖展示了7個)。現在de mib-2所包含的資訊類別已超過40個

         應當指出,MIB的定義與具體的網路管理協議無關,這對於廠商和使用者都有利。廠商可以在產品(如路由器)中包含SNMP代理軟體,並保證在定義新的MIB專案後該軟體仍遵守標準。使用者可以使用同一網路管理客戶軟體來管理具有不同版本的MIB的多個路由器。當然,一個沒有新的MIB專案的路由器不能提供這些專案的資訊。

         這裡要提一下MIB中的物件{1.3.6.1.4.1},即enterprises(企業),其所屬結點數已超過3000。例如IBM為11.3.6.1.4.1.2},Cisco為{1.3.6.1.4.1.9},Novell為{1.3.6.1.4.1.23},Huawei為{1.3.6.1.4.1.2011}。世界上任何一個公司、學校只要用電子郵件發往[email protected]進行申請即可獲得一個結點名。這樣各廠家就可以定義自己的產品的被管理物件名,使它能用SNMP進行管理。

三、OID

        OID(物件識別符號),是SNMP代理提供的具有唯一標識的鍵值。MIB(管理資訊基)提供數字化OID到可讀文字的對映

1、OID

      OID的編寫規則和習慣

      SNMP OID是用一種按照層次化格式組織的、樹狀結構中的唯一地址來表示的,它與DNS層次相似。與其他格式的定址方式型別,OID以兩種格式加以應用:全名和先對名(有時稱為“相關”)

      完全驗證格式從root根開始,並且向外移到某個裝置的獨立的質上。例如一個完整驗證的地址為:

      該OID可用人們可讀的方式重寫為:

      所有完全驗證OID都有 .iso.org.dod.internet.private 開始,數字表達為: .1.3.6.4. 。幾乎所有的OID都會跟上企業(.1)和由IANA(網際網路編號分配中心分配的)唯一的廠商標號。例如OID 789表示Network Appliance格式的廠商編號( NetApp )。廠商編號後面的是基於廠商實現的功能,並且各不相同。請注意,在iso.前面的 . ` ,與DNS中的後點相似,正確驗證的OID是有一個表示根的字首 `. 開始的。

      OID的相對格式,從企業值開始,略過所有的隱含地址。因此,我們可以用相對地址 enterprises.netapp.netappl.raid.diskSUmmary.diskSpaceCount.0 來表示上述的OID,或者用數字格式 .1.789.6.4.8.0 .

       寫OID的常用格式是用MIB名稱和在MIB中定義的唯一鍵值。例如,我們可以用簡寫的格式重寫上述OID

       NETWORK-APPLIANCE-MIB::diskSpareCount.0

       MIB中OID的書寫格式規則為::MIB Name::唯一鍵值.instance.

       某些唯一鍵值,可用多個例項表示,這樣所有的OID都以例項值結尾。這就是為什麼你得注意到大多數OID都是以一個 .0 結尾的。

四、MIB內部結構

       MIB的內部結構剛開始時會讓人感覺有些奇怪和不好理解,不過它的結構非常好,你可以在不懂的情況下一個一個看進去。MIB的結構來源於IETF RFC1155和2578定義的管理資訊結構。如果你想要修改或編寫自己的MIB,在動手前理解SMI非常有幫助。

      為了更好地理解他們是怎樣工作的,我們先來看看MIB的頭:

-- PowerNet-MIB {iso org(3) dod(6) internet(1) private(4)
-- enterprises(1) apc(318) }

PowerNet-MIB DEFINITIONS ::= BEGIN

IMPORTS
enterprises, IpAddress, Gauge, TimeTicks FROM RFC1155-SMI
DisplayString FROM RFC1213-MIB
OBJECT-TYPE FROM RFC-1212
TRAP-TYPE FROM RFC-1215;

apc OBJECT IDENTIFIER ::= { enterprises 318 }
products OBJECT IDENTIFIER ::= { apc 1 }
apcmgmt OBJECT IDENTIFIER ::= { apc 2 }

Comments can be inserted into a MIB by prepending them with two dashes. In the header the declaration BEGIN starts off the MIB. Imports can be used to pull information from other MIBs, typically those mandated by the MIB-II standard.

可以用行開頭為 -- 的方法在MIB中加入註釋

在頭部用 BEGIN`宣告來開始MIB的定義。 

`Imports 可用來從其他MIB中提取資訊,通常用它來提取MIB-II規範要求的內容

MIB放置從enterprise值開始的OID地址的結構

       在此,enterprise值是318, 對應 "apc" (相對地址為 .1.318)。 通常之後會定義幾個類別。注意在花括號間定義的兩個值,其父地址後面跟一個它自己的地址。因此產品識別符號有apc識別符號表示,其父為enterprise識別符號,以此類推。類別和自類別的型別通常跟在MIB頭的後面,並且把有用的鍵值分割為子組。通過分段,各種值分別被列出,這樣可用的值更容易瀏覽。

MIB的真正好處在於物件型別的描述。以下是一個整形鍵值的例子:

upsBasicOutputStatus OBJECT-TYPE
SYNTAX INTEGER {
   unknown(1),
   onLine(2),
   onBattery(3),
   onSmartBoost(4),
   timedSleeping(5),
   softwareBypass(6),
   off(7),
   rebooting(8),
   switchedBypass(9),
   hardwareFailureBypass(10),
   sleepingUntilPowerReturn(11),
   onSmartTrim(12)
}
ACCESS read-only
STATUS mandatory
DESCRIPTION
   "The current state of the UPS. If the UPS is unable
    to determine the state of the UPS this variable is set
    to unknown(1)."
::= { upsBasicOutput 1 }

      因此,在這裡真正需要注意的是,MIB其實只是提供給我們一張我們想從某個SNMP代理中獲得的可用OID的各種值的地圖。一個MIB描述了在哪裡找某個值、以及返回結果是什麼。我們可以不用MIB與裝置進行互動,只不過在理獲得'Up'的返回值,要比‘1’的返回值要簡單的多。通過利用Net-SNMP命令列工具,你可以決定你希望返回結果的輸出樣式(這種方式下使用“Up"這樣的格式更好),或者你用指令碼呼叫工具時(這種方式下使用”1“的格式就更好)。