管理資訊庫:MIB
我們要擴充mib首先必須清楚mib是如何定義的,用的什麼語言,有哪些約定,遵循哪些規則等等。這些基本東西掌握過後,我們就可以很輕松的來寫自己的mib檔案了。
所謂管理資訊庫,或者MIB,就是所有代理程序包含的、并且能夠被管理程序進行查詢和設定的資訊的集合,或者叫管理對象的集合,在RFC 1213 [McColghrie 和Rose 1991]中定義了MIB-II,即第二版的MIB庫。MIB是采用SMI(RFC 1155)來定義的。SMI全稱為Structure Management Information,管理資訊結構。SMI規範定義了一個基本架構,使用架構内的規範可以定義MIB,而SMI同時又是ASN.1的一個子集,它主要約定了使用到的文法、類型、宏、資料格式等。
本節知識相對來說有些枯燥,但是沒辦法,如果你要看懂mib的定義檔案,并且能很靈活自如的對其進行擴充,那麼這些基礎是必須夯實的。俗話說“磨刀不誤砍柴工”。
ASN.1文法
ASN.1(Abstract
Syntax Notification 1),抽象文法描述語言,是一種獨立于機器的描述語言,用于描述在網絡上傳遞的消息。在SNMP中ANS.1主要用于MIB的定義,另一方面也用于協定的定義。是以了解ASN.1是了解協定、讀懂SNMP國際規範RFC、進行SNMP開發的前提。在SNMP開發中,不但要用ASN.1編寫MIB檔案,還要使用ASN.1中的BER進行編解碼。
ASN.1 可分為兩個部分:
l 文法規則:從資料類型、内容順序或結構等方面來描述消息的内容
l 編碼規則:如何編碼、解碼實際消息中的資料
文法部分用于對資料結構、類型、順序進行描述。編碼則将文法部分描述的資料進行編碼,變為二進制比特流,以便在網絡上傳輸,或反方向地将接收到的資料流進行解碼。這使得編碼流可以跨平台、跨裝置進行傳輸。
ASN.1的記法規則,ASN.1的結構、類型和取值的表示方法和程式設計語言的表示法相似:
Ø 多個空格和空行都看作是一個空格。
Ø 注釋用成對的連字元(--)在注釋的每行開始處表示,或者将一對連字元用在注釋的開始處和注釋行結束的結尾處。
Ø 辨別符(取值和字段的名稱)、類型引用(類型的名稱)和子產品名稱由大寫字母、小寫字母、數字和連字元組成。
Ø 辨別符、類型引用或子產品名以由大寫字母開始。
Ø 内建類型都由大寫字母組成。内建類型一般用作标準表示法提供的類型。
Octet(位元組)表示一個8bit的無符号整數。bit8表示最高位,bit1辨別最低位。下列元語用于定義ASN.1符号:
l BIT 類型和值用等寬字型表示。它通暢表示一個十六進制的位元組值。
l <b>n</b>1 粗斜體表示變量
l [] 粗的方括号标示該值為可選項
l {} 粗的大括号表示一組相關項。
l | 粗體豎杠表示一組之中的内容可任選其一。
l … 粗體省略号表示重複出現
l = 粗體等号,用一個子項表示該項
1.抽象文法(Abstract
Syntax)
l 描述通用資料結構
l 允許定義資料類型和值
2.資料類型(Data
Type)
l 值的集合,可以是簡單類型或結構類型可以對資料類型命名
3.編碼(Encoding)
l 用于表示資料值的位元組序列
4.編碼規則(Encoding
Rules)
l 給出從一種文法到另一種的映射方法
5.傳輸文法(Transfer
l 位模式(Bits
pattern):描述資料是在傳輸時是如何表示的
子產品(module)是ASN.1規範中的基本構造塊,定義一個名為modulereference的子產品,其格式如下:
DEFINITIONS ::=
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中:EXPORTS 這個子產品中的定義可能被其他子產品引入,用的比較少;IMPORTS 定義将要由其他子產品引入的對象或子子產品;AssignmentList 這個子產品中将定義類型配置設定、值配置設定及宏定義。
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位元組,等等。
指派在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 }
最後兩種指派格式,我們後面再講。
l <b>SEQUENCE</b> 一個或多個類型的有序集合,類似于C語言中的struct 類型定義:
UserAccount ::= SEQUENCE {
username
<b>PrintableString</b>,
password
accountNr
<b>INTEGER</b>
}
指派
myAccount UserAccount ::= {
username “tly”,
password “guesswhat”,
accountNr 2345
}
l <b>SEQUENCE</b>
OF 0個或多個某個給定類型多次出現的有序集合,對應于C語言中的數組:
定義
MemberCountries ::= <b>SEQUENCE OF</b> <b>PrintableString</b>
AccountRegistry ::= <b>SEQUENCE OF</b> <b>UserAccount</b>
指派
eastAsia
MemberCountries ::= {
“China”,
“Japan”,
“Korean”, “DPR”
l <b>SET</b> 一個或多個類型的無序集合,類似于<b>SEQUENCE</b>,但其中的元件不考慮分量順序:
UserAccount
::= SET {
username [0] PrintableString,
password [1] PrintableString,
accountNr [2] INTEGER
accountNr 2345,
username “tly”,
password “guesswhat”
l <b>SET OF</b> 0個或多個某個給定類型多次出現的無序集合,每一分量(元件)類型必須相同,但不考慮順序要求。
類型定義
Keywords ::= <b>SET OF</b> <b>PrintableString</b>
指派
someASN1Keywords
Keywords ::= {
“INTEGER”, “BOOLEAN”, “REAL”
l <b>CHOICE</b> 多個類型其中的一個,類似于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。
标簽用于區分不同的類型,并且在結構類型SEQUENCE和SET中,元件類型可能引起混淆,可以為它們的元件(分量)指定Context-specific标簽,清晰訓示元件的類型。除了CHOICE和ANY外,每種ASN.1類型都有一個标簽,由一個類和一個非負的标簽數組成。标簽值可以唯一區分ASN.1類型。也就是說,ASN.1類型的名字并不影響它的抽象含義,隻有标簽才有這個作用。
标簽用在編碼中,可以唯一地标示類型,便于編碼。ASN.1提供了4中标簽:
l Universal:辨別ISO和ITU定義的類型,ASN.1定義的類型均有Universal值,該值在所有的程式裡都一緻。
l Application:應用程式自定義類型。本辨別可以唯一地辨別自定義類型。類型名在ASN.1中可以相同,是以Application就成為唯一辨別自定義類型的方法。類型的含義由制定者自己定義。例如:
name ::=[APPLICATION 0] VisibleString
Name ::=[APPLICATION 1] SEQUENCE
{
givenname VisibleString,
initial VisibleString,
familiyName VisibleString
l Private:該類型的含義根據具體的企業而不同。Private辨別不會被用在國際規範中。企業提供的程式一般經常使用application和context-specific辨別。在特殊場合下,一個企業的技術規範想要擴充成為一個國際規範時,使用private辨別在企業規範成為國際規範的過程中可以較好地保護該企業的規範。例如:
CompanyNumber
::=[PRIVATE 2] INTEGER
companyNumber
CompanyNumber ::=5651
l Context-specific:專用于結構類型中。該類型的含義根據給定的結構類型而不同。對于SET和SEQUENCE,為了避免裡面的元件混淆,一般情況下給予不同的Context-specific标簽。如:
CustomerRecord
::=SET{
name [0]
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。
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 ::=
TYPE NOTATION ::= Parameter
VALUE NOTATION ::=value(VALUE CHOICE
{
localValue INTEGER,
globalValue OBJECT INDENTIFIER
})
Parameter
::=“PARAMETER”NamedType | empty
NamedType
::=identifier type | type
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檔案了。
未完,待續…