1、引言
基於TCP/IP的網絡管理包含3個組成部分:
1) 一個管理信息庫MIB(Management Information Base)。管理信息庫包含所有代理進程的所有可被查詢和修改的參數。RFC 1213[McCloghrie and Rose 1991]定義了第二版的MIB,叫做MIB-II。
2) 關於MIB的一套公用的結構和表示符號。叫做管理信息結構SMI(Structure of Management Information)。這個在RFC 1155 [Rose and McCloghrie 1990] 中定義。例如:SMI定義計數器是一個非負整數,它的計數范圍是 0~4294967295,當達到最大值時,又從0開始計數。
3) 管理進程和代理進程之間的通信協議,叫做簡單網絡管理協議SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定義。SNMP包括數據報交換的格式等。盡管可以在傳輸層采用各種各樣的協議,但是在SNMP中,用得最多的協議還是UDP。
2、SNMP協議概述
簡單網絡管理協議(SNMP:Simple Network Management Protocol)是由互聯網工程任務組(IETF:Internet Engineering Task Force )定義的一套網絡管理協議。該協議基於簡單網關監視協議(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一個管理工作站可以遠程管理所有支持這種協議的網絡設備,包括監視網絡狀態、修改網絡設備配置、接收網絡事件警告等。 雖然SNMP開始是面向基於IP的網絡管理,但作為一個工業標准也被成功用於電話網絡管理。
http://www.fjzzled.com/hzjdyyyyjs/95.html
http://www.fjzzled.com/hzjdyyyyjs/94.html
http://www.sjys365.com/smzl/2999.html
http://www.sjys365.com/smzl/2998.html
3、SNMP的發展史
SNMP經過了一個相對較長的發展過程,到目前為止一共經歷了三個版本。當下使用最廣泛是SNMPv2。
l 1989年發布了第一個版本的SNMP,稱為SNMPv1。
l 1991年發布SNMP的一個補充---RMON(Remote Network Monitoring,遠程網絡監視)。RMON擴充了SNMP的功能,包括對LAN的管理以及對依附於這些網絡設備的管理。注:RMON沒有修改和增加SNMP協議本身以及SMI,只是增加了SNMP監視子網的能力,把整個子網當成一個個體來監視,提供了新的MIB庫及相關的MIB行為。
l 1993年SNMPv1的升級版被提出,SNMPv2。
l 1995年SNMPv2正式發布,v2增加了SNMPv1的功能,並規定了如何在基於OSI的網絡中使用SNMP。同時RMON於本年度擴展為RMONv2
l 1998年SNMPv3發布,一系列文檔定義了SNMP的安全性,並定義了將來改進的總體結構。SNMPv3可以和v2、v1一起使用。
4、SNMP的工作原理
SNMP采用特殊的客戶機/服務器模式,即代理/管理站模型。對網絡的管理與維護是通過管理工作站與SNMP代理間的交互工作完成的。每個SNMP從代理負責回答SNMP管理工作站(主代理)關於MIB定義信息的各種查詢。
SNMP的應用場景如圖1所示:
管理站和代理端使用MIB進行接口統一,MIB定義了設備中的被管理對象。管理站和代理都實現相應的MIB對象,使得雙方可以識別對方的數據,實現通信。管理站向代理請求MIB中定義的數據,代理端識別后,將管理設備提供的相關狀態或參數等數據轉換成MIB定義的格式,最后將該信息返回給管理站,完成一次管理操作。
5、SNMP的報文類型
SNMP中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap 。
(1)Get-Request 、Get-Next-Request與Get-Response
SNMP 管理站用Get-Request消息從擁有SNMP代理的網絡設備中檢索信息,而SNMP代理則用Get-Response消息響應。Get-Next- Request用於和Get-Request組合起來查詢特定的表對象中的列元素。
(2)Set-Request
SNMP管理站用Set-Request 可以對網絡設備進行遠程配置(包括設備名、設備屬性、刪除設備或使某一個設備屬性有效/無效等)。
(3)Trap
SNMP代理使用Trap向SNMP管理站發送非請求消息,一般用於描述某一事件的發生,如接口UP/DOWN,IP地址更改等。
上面五種消息中Get-Request、Get-Next-Request和Set-Request是由管理站發送到代理側的161端口的;后面兩種Get-Response和Trap 是由代理進程發給管理進程的,其中Trap消息被發送到管理進程的162端口,所有數據都是走UDP封裝。SNMP工作流程如圖2:
6、SNMP的報文格式
SNMP代理和管理站通過SNMP協議中的標准消息進行通信,每個消息都是一個單獨的數據報。SNMP使用UDP(用戶數據報協議)作為第四層協議(傳輸協議),進行無連接操作。SNMP消息報文包含兩個部分:SNMP報頭和協議數據單元PDU。
在實際網絡傳輸環境下,SNMP報文的長度取決於其所采用的編碼方式。SNMP統一采用BER(Basic Encoding Rule)的編碼規則,同時在正式SNMP規范中使用的是ASN.1語法,Abastract Syntax Notation v1,即抽象語法描述語言。這兩個概念在后面實踐環節再做進一步介紹,這里只要稍微了解一下即可,不妨礙我們對協議本身的分析。這里我們簡單解釋一下BER編碼規則:
BER作為ANS.1的基本編碼規則,描述具體的ANS.1對象如何編碼為比特流在網絡上進行傳輸。BER編碼規則由三部分組成:
SNMP中定義了幾種基本的數據類型,其中v1和v2版有些改動,具體參見相應的RFC文檔。這里我們只介紹幾種最常見的類型:
l INTEGER:一個整數
l OCTER STRING: 0或多個8bit字節,每個字節在0~255之間取值
l DisplayString:0或多個8bit字節,每個字節必須是ASCII碼。在MIB-II中,所有該類型變量不能超過255個字符(0個字符可以)
l NULL:代表相關的變量沒有值
l IpAddress:4字節長的OCTER STRING,以網絡字節序表示IP地址
l PhyAddress:6字節長的OCTER STRING,代表物理地址
l Counter:非負整數,可以從0遞增到232-1()。達到最大值后歸0
l TimeTicks:時間計數器,以0.01秒為單位遞增,不同的變量可以有不同的遞增幅度。所以在定義這種類型的變量時需要制定遞增幅度
l SEQUENCE:與C語言中的結構體類似
l SEQUENCE OF:一個向量,參見后面ANS.1語法詳細介紹章節
SNMP報文在傳輸層是封裝在UDP報文中的,而UDP又是基於IP網絡的,因此,我們可以得到完整的報文描述結構,如下圖所示:
PDU類型其實包含兩個字節,第一個字節表示真實的PDU的類型;第二個字節表示后面報文所占的字節總數。針對SNMPv1,這個字段取值如下:
表1 PDU類型
PDU類型 |
名 稱 |
0 |
get-request |
1 |
get-next-request |
2 |
get-response |
3 |
set-request |
4 |
trap |
也就是說,trap的類型是4。但是在數據報文中,該字段一般表示為ax,其中x取[0,4],即a0~a3表示相應的get、set等操作,a4表示trap報文。這里除了類型字段意外,其他字段均采用BER編碼方式:
實戰演練之報文格式分析
Trap報文格式和上述圖5所展示的結構有些差別,這里我們只分析SNMPv1和SNMPv2的Trap報文格式。trap報文前面的部分都一樣,區別在PDU協議數據單元部分。
SNMPv1 Trap報文
SNMPv1的Trap報文格式如下所示:
注意:除了PDU類型和PDU長度字段外,后面的每個字段都是BER編碼方式。
trap類型”可以取以下值,其中0~6是已定義的特定trap,7及其以后的類型由供應商自定義。
表2 trap類型、名稱及描述信息
trap類型 |
名稱 |
描述信息 |
0 |
coldStart |
代理進程對自己初始化 |
1 |
warmStart |
代理進程對自己重新初始化 |
2 |
linkDown |
一個接口已從工作狀態變為故障狀態(報文中的第一個變量標識此接口) |
3 |
linkUp |
一個接口已從故障狀態變為工作狀態(報文中的第一個變量標識此接口) |
4 |
authenticationFailure |
從SNMP管理進程收到無效共同體的報文 |
5 |
egpNeighborLoss |
一個EGP鄰站已變為故障狀態(報文中的第一個變量包含鄰站IP地址) |
6 |
enterpriseSpecific |
在這個特定的代碼段中查找trap信息 |
通過wireshark抓包工具,捕獲一條如下的SNMP報文,接下來對其進行仔細分析。
SNMPv1原始報文內容:
00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8 0a 05 0c 00 00 a2 00 34 ff e0 30 2a02 01 00 04 06 70 75 62 6c 69 63 a4 1d 06 0a 2b 06 01 04 01 bf 08 03 02 0a 40 04 c0 a8 0a 01 02 01 00 02 01 00 43 01 0e 30 00
目的MAC:00 23 5a 9e 58 b9
源MAC:00 4c 41 49 50 55
協議類型:08 00 ,為IP數據報
IP頭:45 00 00 48 00 00 40 00 40 11 a5 4e c0 a8 0a 01 c0 a8 0a 05 0c
UDP頭:0c 00 00 a2 00 34 ff e0
其余部分都為SNMP報文,接下來我們對照前面的報文結構體來逐個分析一下。
n 30 表示SNMP消息是ASN.1的SEQUENCE類型;
n 2a 表示該SNMP報文的總長度是42(0x2a)個字節,該字段所表示的報文長度起始於它后面的第一個字節直到報文結束;
n 02 01 00 表示版本號,可見其確實為BER編碼方式。02表示該字段是INTEGER類型;01表示該字段占1個字節;00表示版本號,該值為“版本號-1”;
n 04 06 70 75 62 6c 69 63 表示團體名,04表示該字段為OCTET STRING類型;06表示該字段占6個字節;70 75 62 6c 69 63 表示團體名的ANSII碼的十六進制形式,這里是“public”;
n a4 1d 其中a4中的“4”表示這是一個trap報文,a4又叫報文的標簽標記;1d表示后面還有29(0x1d)個字節的數據;
n 06 0a 2b 06 01 04 01 bf 08 03 02 0a 企業OID標識。06表示該字段是個對象標識符,OBJECT IDENTIFIER;0a表示該字段占10(0x0a)個字節;關於SNMP的OID的編碼方式有些奇特:例如1.3.6.1.2…. 取前兩個數字分別記為x和y。編碼時40*x+y,這里x=1,y=3,因此結果為40*1+3=43,即表示十六進制的2b。因此,這里的企業OID編碼即為1.3.6.1.4.1.8072.3.2.10;
n 40 04 c0 a8 0a 01 同樣40表示該字段為OCTET STRING 類型;04表示IP地址占4個字節;IP地址為192.168.10.1;
n 02 01 00 其中00表示trap類型為coldStart;
n 02 01 00 其中00表示我們指定的trap即specific-trap也為coldStart類型;
n 43 01 0e 43表示為TimeTicks類型;01表示該字段占1個字節;0e即十進制的14表示時間標簽為0.14秒,這里時間計數器以0.01秒遞增;
n 30 00 30表示“鍵-值”值對的編碼類型為SEQUENCE;00表示該字段占0個字節,即沒有該字段。
SNMPv2 Trap報文
同樣的,這里除了trap類型和報文長度是標准網絡字節序之外,其余協議字段也均為BER編碼方式。可以看到v2版的trap報文正在向統一的報文格式發展,已經非常類似普通的SNMP請求、響應報文了。
SNMPv2原始報文內容:
00 23 5a 9e 58 b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a 01 c0 a8 0a 05 0c 01 00 a2 00 67 04 bb 30 5d02 01 01 04 06 70 75 62 6c 69 63 a7 50 02 04 17 73 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 1706 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 06 03 01 01 05 01 30 18 06 0a 2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a
目的MAC:00 23 5a 9e 58 b9
源MAC:00 4c 41 49 50 55
協議類型:08 00,IP報文
IP頭:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a 01 c0 a8 0a 05
UDP頭:0c 01 00 a2 00 67 04 bb
余下部分全為SNMP報文內容,這里我們做一下簡單的約定:
xx 標注類型;xx 標注長度;xx 標注真正的數據。
這樣一來上面這串原始數據就好分析多了J
n 30 5d 整個SNMP報文的編碼方式為30,即SEQUENCE類型,報文長度93(0x5d)字節;
n 02 01 01 版本號01即v2版本;
n 04 06 70 75 62 6c 69 63 團體名70 75 62 6c 69 63 即英文的“public”;
n a7 50 a7表示trap類型為7,即廠商自定義trap;50表示PDU區段占80(0x50)字節;
n 02 04 17 73 2c fb 請求ID為17 73 2c fb 十進制的393424123;
n 02 01 00 錯誤狀態0;
n 02 01 00 錯誤索引0;
n 30 42 “變量名-值”對編碼類型30 即SEQUENCE類型;“變量名-值”所占總字節0x42,即66字節;
n 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 第一個“名-值”對區段編碼方式30 即SEQUENCE類型;第一個“名-值”對總長度0x0d,13字節;第一個變量名的編碼類型0x06,時間標簽;第一個變量名占0x08個字節;第一個變量名2b 06 01 02 01 01 03 00,為1.3.6.1.2.1.1.3.0;第一個變量值為0x0e,即14;
n 30 17 06 0a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 06 03 01 01 05 01 第二個“名-值”對;變量名1.3.6.1.6.3.1.1.4.1.0;變量值1.3.6.1.6.3.1.1.5.1;
n 30 18 06 0a 2b 06 01 06 03 01 01 04 03 00 06 0a 2b 06 01 04 01 bf 08 03 02 0a 第三個“名-值”對;變量名1.3.6.1.6.3.1.1.4.3.0;變量值1.3.6.1.4.1.8072.3.2.10;
今天我們簡單對SNMP協議做個入門普及,包括它的原理,應用場景報文格式等。下面的章節,我們將以開源net-snmp為例來向大家闡述多種代理開發流程和原理,以及要注意的問題,其中每種擴展mib的方式都對應不同的開發需求。
第二篇
管理信息庫: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 n1 粗斜體表示變量
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的模塊,其格式如下:
<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,<space>)
Ø PrintableString (0-9,A-Z,a-z,<space>,<s[ecial>])
Ø VisibleString
Ø GraphicString
Ø UTF8String
Ø IA5String (ASCII)
3. 對象類型:
OBJECT IDENTIFIER
ObjectDescriptor:一個任意長的非負整數序列,用於標記對象(如算法等)
4. 其它類型:
NULL 空值
UTCTime: yymmdd hhmm[ss] <local offset from UTC>
GeneralizedTime:yyyymmdd hhmm[ss] <local offset from UTC>,強制始於2050年
ASN.1靈活之處在於,除了它內置的一些數據類型外,用戶還可以自定義自己想要的任何類型,一般都是通過現有類型來組合來實現。
新類型定義的語法:<type name> ::= <type>
示例:
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類型一種別名。
5 ASN.1子類型定義
子類型是在類型的定義基礎上增加更明確限制條件,如設定新類型的取值范圍,缺省值等等。
語法: <subtype name> ::= <type> (<constraint>)
示例:
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> ::= <value>
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的結構體類型l SEQUENCE 一個或多個類型的有序集合,類似於C語言中的struct 類型定義:
UserAccount ::= SEQUENCE {
username PrintableString,
password PrintableString,
accountNr INTEGER
}
賦值
myAccount UserAccount ::= {
username “tly”,
password “guesswhat”,
accountNr 2345
}
l SEQUENCE OF 0個或多個某個給定類型多次出現的有序集合,對應於C語言中的數組:
定義
MemberCountries ::= SEQUENCE OF PrintableString
AccountRegistry ::= SEQUENCE OF UserAccount
賦值
eastAsia MemberCountries ::= {
“China”, “Japan”, “Korean”, “DPR”
}
l SET 一個或多個類型的無序集合,類似於SEQUENCE,但其中的組件不考慮分量順序:
定義
UserAccount ::= SET {
username [0] PrintableString,
password [1] PrintableString,
accountNr [2] INTEGER
}
賦值
myAccount UserAccount ::= {
accountNr 2345,
username “tly”,
password “guesswhat”
}
l SET OF 0個或多個某個給定類型多次出現的無序集合,每一分量(組件)類型必須相同,但不考慮順序要求。
類型定義
Keywords ::= SET OF PrintableString
賦值
someASN1Keywords Keywords ::= {
“INTEGER”, “BOOLEAN”, “REAL”
}
l CHOICE 多個類型其中的一個,類似於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中標簽:
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] 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 name>MACRO ::=
BEGIN
TYPE NOTATION ::=<user-defined type notation>
VALUE NOTATION ::=<user-defined value notation>
<supporting syntxt>
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文件了。
未完,待續…