SNMP從入門到開發:進階篇
管理資訊庫:MIB
我們要擴充套件mib首先必須清楚mib是如何定義的,用的什麼語言,有哪些約定,遵循哪些規則等等。這些基本東西掌握過後,我們就可以很輕鬆的來寫自己的mib檔案了。
所謂管理資訊庫,或者MIB,就是所有代理程序包含的、並且能夠被管理程序進行查詢和設定的資訊的集合,或者叫管理物件的集合,在RFC 1213 [McColghrie 和Rose 1991]中定義了MIB-II,即第二版的MIB庫。MIB是採用SMI(RFC 1155)來定義的。SMI全稱為Structure Management Information,管理資訊結構。SMI規範定義了一個基本框架,使用框架內的規範可以定義
本節知識相對來說有些枯燥,但是沒辦法,如果你要看懂mib的定義檔案,並且能很靈活自如的對其進行擴充套件,那麼這些基礎是必須夯實的。俗話說“磨刀不誤砍柴工”。
ASN.1語法ASN.1(Abstract Syntax Notification 1),抽象語法描述語言,是一種獨立於機器的描述語言,用於描述在網路上傳遞的訊息。在SNMP中ANS.1主要用於MIB的定義,另一方面也用於協議的定義。所以理解ASN.1是理解協議、讀懂SNMP國際規範RFC、進行SNMP開發的前提。在SNMP
ASN.1 可分為兩個部分:
l語法規則:從資料型別、內容順序或結構等方面來描述訊息的內容
l編碼規則:如何編碼、解碼實際訊息中的資料
語法部分用於對資料結構、型別、順序進行描述。編碼則將語法部分描述的資料進行編碼,變為二進位制位元流,以便在網路上傳輸,或反方向地將接收到的資料流進行解碼。這使得編碼流可以跨平臺、跨裝置進行傳輸。
ASN.1的記法規則,ASN.1的結構、型別和取值的表示方法和程式語言的表示法相似:
Ø多個空格和空行都看作是一個空格。
Ø註釋用成對的連字元(--)在註釋的每行開始處表示,或者將一對連字元用在註釋的開始處和註釋行結束的結尾處。
Ø識別符號(取值和欄位的名稱)、型別引用(型別的名稱)和模組名稱由大寫字母、小寫字母、數字和連字元組成。
Ø識別符號、型別引用或模組名以由大寫字母開始。
Ø內建型別都由大寫字母組成。內建型別一般用作標準表示法提供的型別。
Octet(位元組)表示一個8bit的無符號整數。bit8表示最高位,bit1標識最低位。下列元語用於定義ASN.1符號:
lBIT 型別和值用等寬字體表示。它通暢表示一個十六進位制的位元組值。
ln1 粗斜體表示變數
l[] 粗的方括號標示該值為可選項
l{} 粗的大括號表示一組相關項。
l| 粗體豎槓表示一組之中的內容可任選其一。
l… 粗體省略號表示重複出現
l= 粗體等號,用一個子項表示該項
1 ASN.1術語1.抽象語法(Abstract Syntax)
l描述通用資料結構
l允許定義資料型別和值
2.資料型別(Data Type)
l值的集合,可以是簡單型別或結構型別可以對資料型別命名
3.編碼(Encoding)
l用於表示資料值的位元組序列
4.編碼規則(Encoding Rules)
l給出從一種語法到另一種的對映方法
5.傳輸語法(Transfer Syntax)
l位模式(Bits pattern):描述資料是在傳輸時是如何表示的
2 ASN.1模組定義模組(module)是ASN.1規範中的基本構造塊,定義一個名為modulereference的模組,其格式如下:
DEFINITIONS ::=
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中:EXPORTS 這個模組中的定義可能被其他模組引入,用的比較少;IMPORTS 定義將要由其他模組引入的物件或子模組;AssignmentList 這個模組中將定義型別分配、值分配及巨集定義。
3 ASN.1資料型別1. 基本型別:
ASN.1語法中有六種基本型別,分別如下,基本已經做到見名知意了:
BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
2. 字串型別(ISO10646-1的子集):
ØNumericString (0-9,)
ØPrintableString
(0-9,A-Z,a-z,,])
ØVisibleString
ØGraphicString
ØUTF8String
ØIA5String (ASCII)
3. 物件型別:
OBJECT IDENTIFIER
ObjectDescriptor:一個任意長的非負整數序列,用於標記物件(如演算法等)
4. 其它型別:
NULL 空值
UTCTime: yymmdd
hhmm[ss]
GeneralizedTime:yyyymmdd
hhmm[ss] ,強制始於2050年
ASN.1靈活之處在於,除了它內建的一些資料型別外,使用者還可以自定義自己想要的任何型別,一般都是通過現有型別來組合來實現。
新型別定義的語法: ::=
示例:
Counter ::= INTEGER
IpAddress ::= OCTET STRING
Months ::= ENUMERATED {
january (1), february (2), march (3), april (4), may (5), june (6),
july (7), august (8), september (9),october (10), november (11), december(12)
}
上面的定義過程中,INTEGER太常見了,就用Counter來作為它的一種別名,注意是一種,以後就可以用Counter來定義新變量了。同理,IpAddress就是OCTE STRING型別一種別名。
子型別是在型別的定義基礎上增加更明確限制條件,如設定新型別的取值範圍,預設值等等。
語法: ::= ()
示例:
Counter ::= INTEGER (0..65536)
IpAddress ::= OCTET STRING ( SIZE(4) )
Spring ::= Months (march | april | may)
Summer ::= Months (june | july | august )
SmallPrime ::= INTEGER ( 2 | 3 | 5 | 7 | 11 )
ExportKey ::= BIT STRING ( SIZE(40) )
這樣定義過後,以後用Counter定義的任何變數都被限定大於0小於65536。IpAddress定義變數長度都是4位元組,等等。
6 ASN.1賦值賦值在MIB庫檔案中的定義是最常見的一部分。
語法: ::=
value name :由使用者自定義,但一般最好不要重名;
type:就是前面ASN.1的內建資料型別,或使用者自定義型別;
value:當然就是該變數的值,一般要和變數型別所限定的範圍一致。示例:
ipInReceives Counter ::= 2450
ipRouteMask IpAddress ::= ‘FFFFFF00’H
currentMonth Months ::= july
currentTime UTCTime ::= “030708094018+0800”
name VisibleString ::= “John”
married BOOLEAN ::= TRUE
faxMessage BIT STRING ::= ‘01100001101’B
internet OBJECT IDENTIFIER ::= { iso(1) org(3) dod(6) 1 }
private OBJECT IDENTIFIER ::= { internet 4 }
最後兩種賦值格式,我們後面再講。
7 ASN.1的結構體型別lSEQUENCE一個或多個型別的有序集合,類似於C語言中的struct 型別定義:
UserAccount ::= SEQUENCE {
username PrintableString,
password PrintableString,
accountNr INTEGER
}
賦值
myAccount UserAccount ::= {
username “tly”,
password “guesswhat”,
accountNr 2345
}
lSEQUENCE OF 0個或多個某個給定型別多次出現的有序集合,對應於C語言中的陣列:
定義
MemberCountries ::= SEQUENCE OF PrintableString
AccountRegistry ::= SEQUENCE OF UserAccount
賦值
eastAsia MemberCountries ::= {
“China”, “Japan”, “Korean”, “DPR”
}
lSET一個或多個型別的無序集合,類似於SEQUENCE,但其中的元件不考慮分量順序:
定義
UserAccount ::= SET {
username [0] PrintableString,
password [1] PrintableString,
accountNr [2] INTEGER
}
賦值
myAccount UserAccount ::= {
accountNr 2345,
username “tly”,
password “guesswhat”
}
lSET OF 0個或多個某個給定型別多次出現的無序集合,每一分量(元件)型別必須相同,但不考慮順序要求。
型別定義
Keywords ::= SET OF PrintableString
賦值
someASN1Keywords Keywords ::= {
“INTEGER”, “BOOLEAN”, “REAL”
}
lCHOICE多個型別其中的一個,類似於C語言中的列舉型:
例如:
SimpleSyntax ::=
CHOICE{
number
INTEGER,
string
OCTER STRING,
object
OBJECT IDENTIFIER,
empty
NULL
}
SimpleSyntax可以是INTEGER、OCTER STRING、OBJECT IDENTIFIER、NULL中的一個型別的變數。上述結構型別允許有可選元件。可選元件可能有預設值。SNMP中使用到的結構型別包括SEQUENCE、SEQUENCE OF和CHOICE。
8 ANS.1標籤型別標籤用於區分不同的型別,並且在結構型別SEQUENCE和SET中,元件型別可能引起混淆,可以為它們的元件(分量)指定Context-specific標籤,清晰指示元件的型別。除了CHOICE和ANY外,每種ASN.1型別都有一個標籤,由一個類和一個非負的標籤陣列成。標籤值可以唯一區分ASN.1型別。也就是說,ASN.1型別的名字並不影響它的抽象含義,只有標籤才有這個作用。
標籤用在編碼中,可以唯一地標示型別,便於編碼。ASN.1提供了4中標籤:
lUniversal:標識ISO和ITU定義的型別,ASN.1定義的型別均有Universal值,該值在所有的程式裡都一致。
lApplication:應用程式自定義型別。本標識可以唯一地標識自定義型別。型別名在ASN.1中可以相同,所以Application就成為唯一標識自定義型別的方法。型別的含義由制定者自己定義。例如:
name ::=[APPLICATION 0] VisibleString
Name ::=[APPLICATION 1] SEQUENCE
{
givenname VisibleString,
initial VisibleString,
familiyName VisibleString
}
lPrivate:該型別的含義根據具體的企業而不同。Private標識不會被用在國際規範中。企業提供的程式一般經常使用application和context-specific標識。在特殊場合下,一個企業的技術規範想要擴充套件成為一個國際規範時,使用private標識在企業規範成為國際規範的過程中可以較好地保護該企業的規範。例如:
CompanyNumber ::=[PRIVATE 2] INTEGER
companyNumber CompanyNumber ::=5651
lContext-specific:專用於結構型別中。該型別的含義根據給定的結構型別而不同。對於SET和SEQUENCE,為了避免裡面的元件混淆,一般情況下給予不同的Context-specific標籤。如:
CustomerRecord ::=SET{
name [0] VisibleString
mailingAddress [1] VisibleString
accountNumber [2] INTEGER,
balanceDue [3] INTEGER -- in cents--
}
SET和CHOICE中的分量順序可能不同,例如name和mailingAddress都擁有同樣的型別VisibleString,且它們的順序可能顛倒,如果不指定一個context-specific標籤就不知道一個VisibleString型別的值究竟是賦給name還是mailingAddress的。使用標籤值就可以區分開,標籤0是name,標籤1是mailingAddress。
9 巨集定義ASN.1提供一種使用者可以將符號擴充套件為自己使用的或別人使用的符號的機制,這就允許設計者去擴充套件語言定義一個“物件”,比如定義一個調變解調器或定義一個交換機。這些物件有普通的ASN.1屬性和條件屬性,比如父母和物理位置等。例如一個一部的調變解調器可以以普通調變解調器作為父類,從父類處繼承屬性。使用ASN.1可以定義為:
mode ::=SEQUENCE{
speed INTEGER,
modulation IA5String,
manufacturer IA5String
}
一個巨集定義可以被匯入和匯出。ASN.1中的巨集模板為:
MACRO ::=
BEGIN
TYPE NOTATION ::=
VALUE NOTATION ::=
END
下面是一個使用巨集模板定義型別的例子:
ERROR MACRO ::=
BEGIN
TYPE NOTATION ::= Parameter
VALUE NOTATION ::=value(VALUE CHOICE
{
localValue INTEGER,
globalValue OBJECT INDENTIFIER
})
Parameter ::=“PARAMETER”NamedType | empty
NamedType ::=identifier type | type
END
PS:巨集在1994年從ASN.1中移除,取而代之的是Information Object Class。2002年X.680和X.690系列標準中已經使用Information Object Class代替。SNMPv1在1990年釋出,所以SNMPv1中使用ASN.1巨集。而SNMPv2 SMI的RFC中明確指出,SNMPv2中使用1998版ASN.1,所以SNMPv2還是使用ASN.1中的巨集定義管理物件和通告。
實戰演練之MIB檔案分析請自己分析rfc-1303.mib、rfc1065-SMI.mib、rfc1155-SMI.mib、rfc1213-MIB.mib,以及SNMPv2-SMI.mib(rfc2578)、SNMPv2-TC.mib(rfc2579)和SNMPv2-TM.mib(rfc3417)。
本章內容理論性較強,但是如果很好掌握了ASN.1語法50%的基礎知識就可以讀懂現有80%的MIB檔案,同時可以編寫初中級的簡單MIB檔案了。
未完,待續…
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(12634) | 評論(5) | 轉發(18) | 給主人留下些什麼吧!~~mecjh2015-07-07 10:42:07
求續集~~
回覆 | 舉報鴻丶哥2014-07-07 17:48:34
大哥,這個 未完待續。。。。
求續集啊
2014-07-03 15:52:38
看到一半發現未完待續,需要大神篇的指引啊親!!!
回覆 | 舉報2013-06-06 21:52:51
mxs810:未完待續,時間有點長了啊
呵呵,是啊,工作事兒太多了,都沒時間總結了
內疚,自責,虧欠ing....
2013-06-03 11:01:15
未完待續,時間有點長了啊
回覆 | 舉報 評論熱議