管理信息庫:MIB
我們要擴展mib首先必須清楚mib是如何定義的,用的什么語言,有哪些約定,遵循哪些規(guī)則等等。這些基本東西掌握過后,我們就可以很輕松的來寫自己的mib文件了。
所謂管理信息庫,或者MIB,就是所有代理進程包含的、并且能夠被管理進程進行查詢和設(shè)置的信息的集合,或者叫管理對象的集合,在RFC 1213 [McColghrie 和Rose 1991]中定義了MIB-II,即第二版的MIB庫。MIB是采用SMI(RFC 1155)來定義的。SMI全稱為Structure Management Information,管理信息結(jié)構(gòu)。SMI規(guī)范定義了一個基本框架,使用框架內(nèi)的規(guī)范可以定義MIB,而SMI同時又是ASN.1的一個子集,它主要約定了使用到的語法、類型、宏、數(shù)據(jù)格式等。
本節(jié)知識相對來說有些枯燥,但是沒辦法,如果你要看懂mib的定義文件,并且能很靈活自如的對其進行擴展,那么這些基礎(chǔ)是必須夯實的。俗話說“磨刀不誤砍柴工”。
ASN.1語法
ASN.1(Abstract Syntax Notification 1),抽象語法描述語言,是一種獨立于機器的描述語言,用于描述在網(wǎng)絡(luò)上傳遞的消息。在SNMP中ANS.1主要用于MIB的定義,另一方面也用于協(xié)議的定義。所以理解ASN.1是理解協(xié)議、讀懂SNMP國際規(guī)范RFC、進行SNMP開發(fā)的前提。在SNMP開發(fā)中,不但要用ASN.1編寫MIB文件,還要使用ASN.1中的BER進行編解碼。
ASN.1 可分為兩個部分:
1)語法規(guī)則:從數(shù)據(jù)類型、內(nèi)容順序或結(jié)構(gòu)等方面來描述消息的內(nèi)容
2)編碼規(guī)則:如何編碼、解碼實際消息中的數(shù)據(jù)
語法部分用于對數(shù)據(jù)結(jié)構(gòu)、類型、順序進行描述。編碼則將語法部分描述的數(shù)據(jù)進行編碼,變?yōu)槎M制比特流,以便在網(wǎng)絡(luò)上傳輸,或反方向地將接收到的數(shù)據(jù)流進行解碼。這使得編碼流可以跨平臺、跨設(shè)備進行傳輸。
ASN.1的記法規(guī)則,ASN.1的結(jié)構(gòu)、類型和取值的表示方法和編程語言的表示法相似:
1)多個空格和空行都看作是一個空格。
2) 注釋用成對的連字符(--)在注釋的每行開始處表示,或者將一對連字符用在注釋的開始處和注釋行結(jié)束的結(jié)尾處。
3)標識符(取值和字段的名稱)、類型引用(類型的名稱)和模塊名稱由大寫字母、小寫字母、數(shù)字和連字符組成。
4)標識符、類型引用或模塊名以由大寫字母開始。
5) 內(nèi)建類型都由大寫字母組成。內(nèi)建類型一般用作標準表示法提供的類型。
6)Octet(字節(jié))表示一個8bit的無符號整數(shù)。bit8表示最高位,bit1標識最低位。下列元語用于定義ASN.1符號:
BIT 類型和值用等寬字體表示。它通暢表示一個十六進制的字節(jié)值。
n1 粗斜體表示變量
?。郏?粗的方括號標示該值為可選項
{} 粗的大括號表示一組相關(guān)項。
| 粗體豎杠表示一組之中的內(nèi)容可任選其一。
… 粗體省略號表示重復(fù)出現(xiàn)
= 粗體等號,用一個子項表示該項
一、ASN.1術(shù)語
1、抽象語法(Abstract Syntax)
2)描述通用數(shù)據(jù)結(jié)構(gòu)
允許定義數(shù)據(jù)類型和值
2、數(shù)據(jù)類型(Data Type)
值的集合,可以是簡單類型或結(jié)構(gòu)類型可以對數(shù)據(jù)類型命名
3)編碼(Encoding)
用于表示數(shù)據(jù)值的字節(jié)序列
4、編碼規(guī)則(Encoding Rules)
給出從一種語法到另一種的映射方法
5、傳輸語法(Transfer Syntax)
位模式(Bits pattern):描述數(shù)據(jù)是在傳輸時是如何表示的
二、ASN.1模塊定義
模塊(module)是ASN.1規(guī)范中的基本構(gòu)造塊,定義一個名為modulereference的模塊,其格式如下:
其中:EXPORTS 這個模塊中的定義可能被其他模塊引入,用的比較少;IMPORTS 定義將要由其他模塊引入的對象或子模塊;AssignmentList 這個模塊中將定義類型分配、值分配及宏定義。
三、ASN.1數(shù)據(jù)類型
1、基本類型:
ASN.1語法中有六種基本類型,分別如下,基本已經(jīng)做到見名知意了:
BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
2、字符串類型(ISO10646-1的子集):
3、對象類型:
OBJECT IDENTIFIER
ObjectDescriptor:一個任意長的非負整數(shù)序列,用于標記對象(如算法等)
4、其它類型:
NULL 空值
UTCTime: yymmdd hhmm[ss]
GeneralizedTime:yyyymmdd hhmm[ss] ,強制始于2050年
四、ASN.1類型定義
ASN.1靈活之處在于,除了它內(nèi)置的一些數(shù)據(jù)類型外,用戶還可以自定義自己想要的任何類型,一般都是通過現(xiàn)有類型來組合來實現(xiàn)。
上面的定義過程中,INTEGER太常見了,就用Counter來作為它的一種別名,注意是一種,以后就可以用Counter來定義新變量了。同理,IpAddress就是OCTE STRING類型一種別名。
五、ASN.1子類型定義
子類型是在類型的定義基礎(chǔ)上增加更明確限制條件,如設(shè)定新類型的取值范圍,缺省值等等。
這樣定義過后,以后用Counter定義的任何變量都被限定大于0小于65536。IpAddress定義變量長度都是4字節(jié),等等。
六、ASN.1賦值
賦值在MIB庫文件中的定義是最常見的一部分。
七、ASN.1的結(jié)構(gòu)體類型
八、ANS.1標簽類型
標簽用于區(qū)分不同的類型,并且在結(jié)構(gòu)類型SEQUENCE和SET中,組件類型可能引起混淆,可以為它們的組件(分量)指定Context-specific標簽,清晰指示組件的類型。除了CHOICE和ANY外,每種ASN.1類型都有一個標簽,由一個類和一個非負的標簽數(shù)組成。標簽值可以唯一區(qū)分ASN.1類型。也就是說,ASN.1類型的名字并不影響它的抽象含義,只有標簽才有這個作用。
標簽用在編碼中,可以唯一地標示類型,便于編碼。ASN.1提供了4中標簽:
1)Universal:標識ISO和ITU定義的類型,ASN.1定義的類型均有Universal值,該值在所有的程序里都一致。
2)Application:應(yīng)用程序自定義類型。本標識可以唯一地標識自定義類型。類型名在ASN.1中可以相同,所以Application就成為唯一標識自定義類型的方法。類型的含義由制定者自己定義。例如:
Private:該類型的含義根據(jù)具體的企業(yè)而不同。Private標識不會被用在國際規(guī)范中。企業(yè)提供的程序一般經(jīng)常使用application和context-specific標識。在特殊場合下,一個企業(yè)的技術(shù)規(guī)范想要擴展成為一個國際規(guī)范時,使用private標識在企業(yè)規(guī)范成為國際規(guī)范的過程中可以較好地保護該企業(yè)的規(guī)范。例如:
CompanyNumber ::=[PRIVATE 2] INTEGER
companyNumber CompanyNumber ::=5651
Context-specific:專用于結(jié)構(gòu)類型中。該類型的含義根據(jù)給定的結(jié)構(gòu)類型而不同。對于SET和SEQUENCE,為了避免里面的組件混淆,一般情況下給予不同的Context-specific標簽。如:
九、宏定義
ASN.1提供一種用戶可以將符號擴展為自己使用的或別人使用的符號的機制,這就允許設(shè)計者去擴展語言定義一個“對象”,比如定義一個調(diào)制解調(diào)器或定義一個交換機。這些對象有普通的ASN.1屬性和條件屬性,比如父母和物理位置等。例如一個一部的調(diào)制解調(diào)器可以以普通調(diào)制解調(diào)器作為父類,從父類處繼承屬性。使用ASN.1可以定義為:
PS:宏在1994年從ASN.1中移除,取而代之的是Information Object Class。2002年X.680和X.690系列標準中已經(jīng)使用Information Object Class代替。SNMPv1在1990年發(fā)布,所以SNMPv1中使用ASN.1宏。而SNMPv2 SMI的RFC中明確指出,SNMPv2中使用1998版ASN.1,所以SNMPv2還是使用ASN.1中的宏定義管理對象和通告。
評論