林 剛 文全剛 傅曉陽(yáng) 尹 賀
(吉林大學(xué)珠海學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)系 廣東 珠海 519041)
伴隨著科技的發(fā)展,網(wǎng)絡(luò)及其技術(shù)的應(yīng)用在人們?nèi)粘I钪械谋戎卦絹?lái)越大。足不出戶,就可以通過(guò)互聯(lián)網(wǎng)輕松完成購(gòu)物、訂餐、訂房、訂票、預(yù)約車等活動(dòng)。支撐網(wǎng)絡(luò)服務(wù)的硬件設(shè)備是否正常運(yùn)行,在一定程度上影響著現(xiàn)代人的生活質(zhì)量。由此,關(guān)注網(wǎng)絡(luò)管理相關(guān)技術(shù)具有重大意義。概括來(lái)說(shuō),網(wǎng)絡(luò)管理是管理進(jìn)程(也稱管理站)通過(guò)代理進(jìn)程對(duì)被管設(shè)備運(yùn)行狀態(tài)的監(jiān)測(cè)。TCP/IP網(wǎng)絡(luò)管理協(xié)議標(biāo)準(zhǔn)框架由3個(gè)部分組成,管理信息庫(kù)MIB,管理信息結(jié)構(gòu)SMI和簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議SNMP。其中,MIB包含代理進(jìn)程可被查詢和修改的參數(shù),正在被使用的是MIB-II?;ヂ?lián)網(wǎng)工程部(IETF)于1991年發(fā)布了MIB-II的定義文件RFC(Request For Comments) 1213,用于替代原先在RFC 1156文件中定義的MIB-I;SMI是MIB的公用結(jié)構(gòu)和表示符號(hào);SNMP是管理進(jìn)程和代理進(jìn)程之間的通信協(xié)議,版本有v1、v2和v3[1]。MIB文件的準(zhǔn)確解析,是獲取設(shè)備準(zhǔn)確信息,有效網(wǎng)絡(luò)管理的堅(jiān)實(shí)基礎(chǔ)。本文描述MIB定義文件,分析了幾種有代表性的數(shù)據(jù)類型,設(shè)計(jì)了一套MIB文件解析API,并使用C#實(shí)現(xiàn)了MIB文件的解析。
為了獲取到指定數(shù)據(jù)內(nèi)容,代理進(jìn)程需要知道對(duì)應(yīng)的對(duì)象標(biāo)識(shí)符OID以及數(shù)據(jù)結(jié)構(gòu)的定義。在MIB定義文件中,這些信息使用抽象語(yǔ)法標(biāo)記ASN.1(Abstract Syntax Notation One)進(jìn)行定義。ASN.1是國(guó)際的標(biāo)準(zhǔn)化,與廠家無(wú)關(guān),與平臺(tái)無(wú)關(guān),與語(yǔ)言無(wú)關(guān),使用ASN.1定義的數(shù)據(jù)結(jié)構(gòu),抽象程度高[2]。
下面代碼說(shuō)明了MIB定義文件內(nèi)容結(jié)構(gòu),節(jié)選自RFC 1213[4],其中“……”表示省略的部分內(nèi)容。
RFC1213-MIB DEFINITIONS ::= BEGIN
IMPORTS
mgmt,NetworkAddress,IpAddress,Counter,Gauge,TimeTicks
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC-1212;
……
END
MIB定義文件內(nèi)容結(jié)構(gòu)特點(diǎn)如下:
1) 以“xxx DEFINITIONS ::= BEGIN”開頭,以“END”結(jié)尾。
2) 可以引用其他MIB文件中已經(jīng)定義的數(shù)據(jù)類型,語(yǔ)法格式為“IMPORTS ... FROM...”。
3) 數(shù)據(jù)格式的標(biāo)準(zhǔn)定義被包含在“IMPORTS”語(yǔ)句結(jié)束之后,“END”之前的中間部分。
MIB定義文件中的使用數(shù)據(jù)類型較多,除了ASN.1定義的原始基本類型INTEGER、OCTET STRING、OBJECT IDENTIFIER和NULL之外,還包含定義類型NetworkAddress、IpAddress、Counter、Gauge、TimeTicks、Opaque,以及構(gòu)造類型SEQUENCE等,在RFC 1155中能找到相關(guān)說(shuō)明[3]。
下面列出幾種有代表性的數(shù)據(jù)類型,相關(guān)代碼節(jié)選自RFC 1213[4]和RFC 1743[5]。
1) 簡(jiǎn)單的OBJECT-TYPE類型定義,用于描述被管理對(duì)象[6]。如ifIndex,依附于父對(duì)象ifEntry。
ifIndex OBJECT-TYPE
SYNTAX INTEGER
ACCESS read-only
STATUS mandatory
DESCRIPTION
″A unique value for ……
::= { ifEntry 1}
2) SEQUENCE類型定義,如IfEntry類型,ifEntry包含子元素ifIndex,ifDescr等。
ifEntry OBJECT-TYPE
SYNTAX IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
″An interface ……
INDEX { ifIndex }
::= { ifTable 1 }
IfEntry ::=
SEQUENCE {
ifIndex
INTEGER,
ifDescr
DisplayString,
……
}
3) 有序列表類型定義,如ifTable是IfEntry有序列表類型。
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
″A list ……
::= { interfaces 2 }
4) MODULE-IDENTITY類型定義,用于描述信息模塊[6],如dot5。
dot5 MODULE-IDENTITY
LAST-UPDATED ″9410231150Z″
ORGANIZATION ″IETF ……
::= { transmission 9 }
5) 使用“OBJECT IDENTIFIER”定義一種對(duì)象的標(biāo)識(shí)符值[6],如mib-2。
mib-2 OBJECT IDENTIFIER ::= { mgmt 1 }
使用IMPORTS和EXPORTS語(yǔ)句之后,MIB定義文件不再是孤立的,而是彼此相互關(guān)聯(lián)。在MIB定義文件中,使用EXPORTS語(yǔ)句,導(dǎo)出定義的數(shù)據(jù)類型或者是父OID值,在其他MIB定義文件中,使用IMPORTS語(yǔ)句,導(dǎo)入和使用這些數(shù)據(jù)類型和值。通過(guò)分析MIB定義文件中的IMPORTS和EXPORTS語(yǔ)句,可以明確MIB定義文件之間的相互依賴關(guān)系。部分公有RFC文件的定義依賴關(guān)系,如圖1所示。
圖1 MIB定義文件相互依賴圖
圖1中,實(shí)線表示導(dǎo)入或?qū)С龆x的數(shù)據(jù)類型,虛線表示導(dǎo)入或?qū)С鰯?shù)據(jù)值;“CLNS-MIB”被定義在RFC 1238文件中。
MIB文件的加載和解析是實(shí)現(xiàn)基于SNMP的網(wǎng)管軟件的核心過(guò)程[7]。MIB文件解析API的設(shè)計(jì)過(guò)程可分為三個(gè)階段,即設(shè)計(jì)類、設(shè)計(jì)接口、實(shí)現(xiàn)接口。
根據(jù)MIB定義文件的特點(diǎn),為數(shù)據(jù)類型設(shè)計(jì)類,一種數(shù)據(jù)類型對(duì)應(yīng)一個(gè)類,如圖 2所示。還可以使用其他的方法進(jìn)行類設(shè)計(jì),比如,設(shè)計(jì)一個(gè)通用類,對(duì)應(yīng)MIB定義文件中的任何一種數(shù)據(jù)類型。一個(gè)類描述一種數(shù)據(jù)類型的設(shè)計(jì),復(fù)雜度低、簡(jiǎn)單實(shí)用、代碼可讀性強(qiáng)。
圖2 MIB定義中常見的數(shù)據(jù)結(jié)構(gòu)類圖
除了常見的數(shù)據(jù)類型之外,解析MIB定義文件和構(gòu)建MIB樹還需要設(shè)計(jì)IMibNode接口和MibNode類,用于存儲(chǔ)MIB樹的節(jié)點(diǎn)信息,以及兩個(gè)核心接口和實(shí)現(xiàn)類,如圖3和圖4所示。
圖3 IMibNode接口和MibNode類圖
圖4 MIB定義文件解析接口和實(shí)現(xiàn)類圖
IMibNode的AddChild方法用于往當(dāng)前節(jié)點(diǎn)中添加子節(jié)點(diǎn)。IMibDefinitionsDocument是MIB定義文件的接口,MibDefinitionsDocument是對(duì)應(yīng)的實(shí)現(xiàn)類。IMibDefinitionsDocumentParser是MIB定義文件解析器的接口,MibDefinitionsDocumentParser是對(duì)應(yīng)的實(shí)現(xiàn)類。整個(gè)API中,最核心的方法是解析器中的Parse,其主要算法如下:
步驟1遍歷需要解析的所有MIB文件IMPORTS部分,構(gòu)建依賴圖。其數(shù)據(jù)結(jié)構(gòu)可采用多路徑樹[8]、雙親樹表示法[9]、孩子鏈表法等。本文采用C#實(shí)現(xiàn)了面向?qū)ο蟮碾p親(Parent屬性)、孩子(Children屬性)一對(duì)多雙向的樹型結(jié)構(gòu),方便根、葉子和中間節(jié)點(diǎn)的遍歷。
1) 解析文件定義名稱,比如從“RFC1213-MIB DEFINITIONS ::= BEGIN”中解析出“RFC1213-MIB”。
2) 根據(jù)IMPORTS的內(nèi)容,解析依賴關(guān)系,逐步形成依賴圖。比如從“IMPORTS ... FROM RFC1155-SMI”解析出“RFC1155-SMI”,添加進(jìn)當(dāng)前文件對(duì)象的依賴列表中,即在依賴圖中的“RFC1155-SMI”應(yīng)該優(yōu)先于當(dāng)前文檔被解析。
步驟2基于第1步生成的依賴圖,按照順序,深度優(yōu)先或者廣度優(yōu)先遍歷MIB文件的其他部分,解析每個(gè)文件的內(nèi)容,構(gòu)建MIB樹。包括MODULE-IDENTITY,OBJECT-TYPE,Sequence類型等。比如從“application MODULE-IDENTITY ... ::= { mib-2 27 }”中解析出“application”父節(jié)點(diǎn)是對(duì)應(yīng)為“mib-2”對(duì)應(yīng)OID下的27,添加進(jìn)父節(jié)點(diǎn)列表。
依賴圖的引入,能夠有助于準(zhǔn)確定位缺失的MIB文件,為用戶收集完整的MIB文件提供有效線索。對(duì)缺失的MIB文件默認(rèn)不分析,提高M(jìn)IB樹的構(gòu)建效率,此時(shí)的MIB樹與RFC 1155定義的未標(biāo)記根(unlabeled root)嚴(yán)格保持一致。使用兩次遍歷,第一次構(gòu)建依賴圖,第二次構(gòu)建MIB樹。其優(yōu)點(diǎn)是分層清晰,便于理解。在構(gòu)建MIB樹時(shí),按照已經(jīng)生成的依賴圖,從根節(jié)點(diǎn)出發(fā),依次往葉子節(jié)點(diǎn)方向進(jìn)行構(gòu)建,避免了復(fù)雜的遞歸調(diào)用。構(gòu)建MIB樹中當(dāng)前元素時(shí),其父節(jié)點(diǎn)已經(jīng)被解析,且被標(biāo)識(shí),所以能高效、準(zhǔn)確地定位到父節(jié)點(diǎn),即除數(shù)據(jù)類型自身解析外,幾乎不需要花費(fèi)更多額外代價(jià)去處理節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系。
IMibDefinitionsDocumentParser中的AddFile方法是往解析器中增加MIB定義文件;Serialize和Deserialize是序列化和反序列化操作,序列化將當(dāng)前節(jié)點(diǎn)(包括所有子節(jié)點(diǎn)信息)輸出到指定文件或者數(shù)據(jù)庫(kù)中,反序列化則是相反過(guò)程;GetErrors方法獲取解析器的錯(cuò)誤信息;GetMibNodeRoot方法獲取MIB樹的根節(jié)點(diǎn),通過(guò)循環(huán)訪問(wèn)MibNode的Children屬性,可以從Root節(jié)點(diǎn)開始深度優(yōu)先或廣度優(yōu)先遍歷MIB樹的所有節(jié)點(diǎn),通過(guò)循環(huán)訪問(wèn)MibNode的Parent屬性,可以直達(dá)Root節(jié)點(diǎn),且只有一條路徑。
MIB文件解析API接口設(shè)計(jì)數(shù)目并不多,其應(yīng)用十分方便。連續(xù)調(diào)用AddFile方法往解析器中增加完全部相關(guān)MIB文件之后,調(diào)用Parse方法進(jìn)行解析,調(diào)用GetMibNodeRoot方法獲取解析得到的完整MIB樹,調(diào)用Serialize方法將MIB樹序列化到指定文件。相關(guān)代碼片段如下:
var p = new MibDefinitionsDocumentParser();
p.AddFile(fileName1);
……
p.AddFile(xxx);
p.Parse();
mibNode = p.GetMibNodeRoot();
p.Serialize(outFileName);
MIB文件解析API接口的應(yīng)用格式相對(duì)固定,功能靈活。如果將上述代碼中的第一行稍加修改,就可以實(shí)現(xiàn)在解析得到的MIB樹基礎(chǔ)上,進(jìn)一步解析其他MIB文件。修改代碼如下:
var p = new MibDefinitionsDocumentParser(mibNode);
使用解析MIB文件的API的應(yīng)用程序,在創(chuàng)建MIB樹時(shí),可以按照需要選擇合適的方法,或者創(chuàng)建完整的MIB樹;或者基于現(xiàn)有MIB樹添加更多節(jié)點(diǎn)信息;或者通過(guò)反序列化文件或者持久化數(shù)據(jù)記錄進(jìn)行MIB樹創(chuàng)建。
利用解析得到的MIB樹,根據(jù)特定節(jié)點(diǎn)OID信息,并獲取其值,可以實(shí)現(xiàn)對(duì)支持SNMP的網(wǎng)絡(luò)設(shè)備進(jìn)行故障跟蹤和準(zhǔn)確定位[10],包括調(diào)制解調(diào)器、路由器、交換機(jī)、服務(wù)器、工作站、打印機(jī)等[11]。
在前人研究成果的基礎(chǔ)上,提出了基于MIB文件依賴圖的解析MIB文件API的設(shè)計(jì)方法,過(guò)程中采用了面向?qū)ο蟮慕涌?、類、?shí)現(xiàn)三步設(shè)計(jì)方法,并在實(shí)際項(xiàng)目中得到了應(yīng)用,為有效的網(wǎng)絡(luò)管理奠定基礎(chǔ)。今后,可以為API引入并行算法,提高性能;標(biāo)準(zhǔn)化持久化文件和數(shù)據(jù)記錄格式,完善API應(yīng)用的多點(diǎn)訪問(wèn);考慮更多的常用場(chǎng)景,豐富接口等。
[1] Stevens W Richar.TCP/IP詳解卷1:協(xié)議[M].范建華,胥光輝,張濤,等譯.北京:機(jī)械工業(yè)出版社,2014.
[2] Larmouth John.ASN.1 Complete[M].Massachusetts:Morgan Kaufmann Publishers,1999.
[3] Rose M,McCloghrie K.RFC 1155-1990:Structure and Identification of Management Information for TCP/IP-based Internets[S].1990:1-13.
[4] McCloghrie K,Rose M.RFC 1213-1991:Management Information Base for Network Management of TCP/IP-based internets:MIB-II[S].1991:12-67.
[5] McCloghrie K,Decker E.RFC 1743-1994:IEEE 802.5 MIB using SMIv2[S].1994:4-5.
[6] McCloghrie K,Perkins D,Schoenwaelder J.RFC 2578-1999:Structure of Management Information Version 2 (SMIv2)[S].1999:2-19.
[7] 龔尚福,劉二恩,馮健.基于SNMP的MIB樹結(jié)構(gòu)研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(12):163-166.
[8] 周劍,張曉彤,王沁.SNMP協(xié)議動(dòng)態(tài)MIB結(jié)構(gòu)與高效查找算法[J].計(jì)算機(jī)工程,2008,34(2):171-174.
[9] 張姣,李宥謀,何萌,等.SNMP網(wǎng)管技術(shù)在嵌入式儀器測(cè)控領(lǐng)域的研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2014,31(10):329-333.
[10] 趙燦明,紀(jì)詩(shī)厚,石滾,等.面向以太網(wǎng)的網(wǎng)絡(luò)故障自動(dòng)實(shí)時(shí)發(fā)現(xiàn)與定位方法[J].計(jì)算機(jī)應(yīng)用與軟件,2016,33(9):101-105.
[11] SNMP wiki[EB/OL].[2017-4-7].https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol.