管理信息庫: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 可分為兩個部分:
1)語法規則:從數據類型、內容順序或結構等方面來描述消息的內容
2)編碼規則:如何編碼、解碼實際消息中的數據
語法部分用于對數據結構、類型、順序進行描述。編碼則將語法部分描述的數據進行編碼,變為二進制比特流,以便在網絡上傳輸,或反方向地將接收到的數據流進行解碼。這使得編碼流可以跨平臺、跨設備進行傳輸。
ASN.1的記法規則,ASN.1的結構、類型和取值的表示方法和編程語言的表示法相似:
1)多個空格和空行都看作是一個空格。
2) 注釋用成對的連字符(--)在注釋的每行開始處表示,或者將一對連字符用在注釋的開始處和注釋行結束的結尾處。
3)標識符(取值和字段的名稱)、類型引用(類型的名稱)和模塊名稱由大寫字母、小寫字母、數字和連字符組成。
4)標識符、類型引用或模塊名以由大寫字母開始。
5) 內建類型都由大寫字母組成。內建類型一般用作標準表示法提供的類型。
6)Octet(字節)表示一個8bit的無符號整數。bit8表示最高位,bit1標識最低位。下列元語用于定義ASN.1符號:
BIT 類型和值用等寬字體表示。它通暢表示一個十六進制的字節值。
n1 粗斜體表示變量
[] 粗的方括號標示該值為可選項
{} 粗的大括號表示一組相關項。
| 粗體豎杠表示一組之中的內容可任選其一。
… 粗體省略號表示重復出現
= 粗體等號,用一個子項表示該項
一、ASN.1術語
1、抽象語法(Abstract Syntax)
2)描述通用數據結構
允許定義數據類型和值
2、數據類型(Data Type)
值的集合,可以是簡單類型或結構類型可以對數據類型命名
3)編碼(Encoding)
用于表示數據值的字節序列
4、編碼規則(Encoding Rules)
給出從一種語法到另一種的映射方法
5、傳輸語法(Transfer Syntax)
位模式(Bits pattern):描述數據是在傳輸時是如何表示的
二、ASN.1模塊定義
模塊(module)是ASN.1規范中的基本構造塊,定義一個名為modulereference的模塊,其格式如下:
其中:EXPORTS 這個模塊中的定義可能被其他模塊引入,用的比較少;IMPORTS 定義將要由其他模塊引入的對象或子模塊;AssignmentList 這個模塊中將定義類型分配、值分配及宏定義。
三、ASN.1數據類型
1、基本類型:
ASN.1語法中有六種基本類型,分別如下,基本已經做到見名知意了:
BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING
2、字符串類型(ISO10646-1的子集):
3、對象類型:
OBJECT IDENTIFIER
ObjectDescriptor:一個任意長的非負整數序列,用于標記對象(如算法等)
4、其它類型:
NULL 空值
UTCTime: yymmdd hhmm[ss]
GeneralizedTime:yyyymmdd hhmm[ss] ,強制始于2050年
四、ASN.1類型定義
ASN.1靈活之處在于,除了它內置的一些數據類型外,用戶還可以自定義自己想要的任何類型,一般都是通過現有類型來組合來實現。
上面的定義過程中,INTEGER太常見了,就用Counter來作為它的一種別名,注意是一種,以后就可以用Counter來定義新變量了。同理,IpAddress就是OCTE STRING類型一種別名。
五、ASN.1子類型定義
子類型是在類型的定義基礎上增加更明確限制條件,如設定新類型的取值范圍,缺省值等等。
這樣定義過后,以后用Counter定義的任何變量都被限定大于0小于65536。IpAddress定義變量長度都是4字節,等等。
六、ASN.1賦值
賦值在MIB庫文件中的定義是最常見的一部分。
七、ASN.1的結構體類型
八、ANS.1標簽類型
標簽用于區分不同的類型,并且在結構類型SEQUENCE和SET中,組件類型可能引起混淆,可以為它們的組件(分量)指定Context-specific標簽,清晰指示組件的類型。除了CHOICE和ANY外,每種ASN.1類型都有一個標簽,由一個類和一個非負的標簽數組成。標簽值可以唯一區分ASN.1類型。也就是說,ASN.1類型的名字并不影響它的抽象含義,只有標簽才有這個作用。
標簽用在編碼中,可以唯一地標示類型,便于編碼。ASN.1提供了4中標簽:
1)Universal:標識ISO和ITU定義的類型,ASN.1定義的類型均有Universal值,該值在所有的程序里都一致。
2)Application:應用程序自定義類型。本標識可以唯一地標識自定義類型。類型名在ASN.1中可以相同,所以Application就成為唯一標識自定義類型的方法。類型的含義由制定者自己定義。例如:
Private:該類型的含義根據具體的企業而不同。Private標識不會被用在國際規范中。企業提供的程序一般經常使用application和context-specific標識。在特殊場合下,一個企業的技術規范想要擴展成為一個國際規范時,使用private標識在企業規范成為國際規范的過程中可以較好地保護該企業的規范。例如:
CompanyNumber ::=[PRIVATE 2] INTEGER
companyNumber CompanyNumber ::=5651
Context-specific:專用于結構類型中。該類型的含義根據給定的結構類型而不同。對于SET和SEQUENCE,為了避免里面的組件混淆,一般情況下給予不同的Context-specific標簽。如:
九、宏定義
ASN.1提供一種用戶可以將符號擴展為自己使用的或別人使用的符號的機制,這就允許設計者去擴展語言定義一個“對象”,比如定義一個調制解調器或定義一個交換機。這些對象有普通的ASN.1屬性和條件屬性,比如父母和物理位置等。例如一個一部的調制解調器可以以普通調制解調器作為父類,從父類處繼承屬性。使用ASN.1可以定義為:
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中的宏定義管理對象和通告。
評論
查看更多