武 一,吳 桐
(河北工業(yè)大學(xué)信息工程學(xué)院,天津 300401)
隨著網(wǎng)絡(luò)的迅速發(fā)展,數(shù)據(jù)中心對(duì)交換機(jī)的傳輸速度要求越來(lái)越高,網(wǎng)絡(luò)從百兆網(wǎng)卡發(fā)展到現(xiàn)在40G的光模塊通信。交換機(jī)上需要支持的協(xié)議也越來(lái)越多,而這些協(xié)議直接的通信和用戶配置界面等也越來(lái)越復(fù)雜。大部分三層交換機(jī)使用的代碼不開源,很難進(jìn)行完全個(gè)性化的配置和修改。
XORP是一個(gè)開放的網(wǎng)絡(luò)平臺(tái),支持OSPF,RIP的BGP,OLSR協(xié)議,PIM,IGMP(組播)和其他路由協(xié)議。大多數(shù)協(xié)議支持IPv4和IPv6(如適用)。XORP的首要目標(biāo)是要成為一個(gè)開放式平臺(tái)替代專有和封閉的網(wǎng)絡(luò)產(chǎn)品。XORP的開放性使得任何個(gè)人或者單位可以免費(fèi)使用其源代碼進(jìn)行個(gè)性的配置以及更改。
簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(Simple Network Management Protocol,SNMP)是由簡(jiǎn)單網(wǎng)關(guān)監(jiān)控協(xié)議(SGMP)發(fā)展而來(lái)的,其同SGMP的主要區(qū)別是加入了符合Internet定義的SMI和MIB體系結(jié)構(gòu)[1]。SNMP的目標(biāo)是管理互聯(lián)網(wǎng)或者數(shù)據(jù)中心中各設(shè)備的鏈路狀態(tài)以及設(shè)備硬件狀態(tài)?,F(xiàn)在SNMP協(xié)議發(fā)展到版本3,其增強(qiáng)了SNMP協(xié)議的安全性能,包括封包加密以及認(rèn)證等。可以使用SNMP進(jìn)行網(wǎng)絡(luò)管理,需要管理基站,管理代理,管理信息庫(kù)和網(wǎng)絡(luò)管理工具等[2]。
本設(shè)計(jì)主要研究了在XORP平臺(tái)上SNMP協(xié)議的實(shí)現(xiàn),包括配置XORP中添加SNMP的XRL、SNMP協(xié)議參數(shù)的用戶命令、SNMP協(xié)議的移植以及MIB庫(kù)的添加等。
XORP是一個(gè)完全開源的網(wǎng)絡(luò)平臺(tái),支持多種協(xié)議,提供對(duì)IPv4和IPv6的支持。由于其開放性,因此方便用戶對(duì)其進(jìn)行剪裁以及根據(jù)本身硬件進(jìn)行優(yōu)化。其中重要的是rtrmgr(XORP Router Manager Process),XRL接口的解析和模板的解析都是由其完成,CLI(Command Line Interface)用戶命令行向用戶提供設(shè)備配置命令行,其負(fù)責(zé)完成命令樹文件的語(yǔ)法解析以及命令樹和配置樹的生成、不同用戶之間的同步等。XORP進(jìn)程的結(jié)構(gòu)如圖1所示。
圖1 XORP結(jié)構(gòu)圖
在XORP中,XRL接口是各個(gè)模塊通信的接口,XORP默認(rèn)的通信接口定義文件是XIF文件,在編譯過程中會(huì)自動(dòng)利用腳本把XIF文件編譯成.hh和.cc文件。其定義有固定的語(yǔ)法。例如:
其第一個(gè)接口定義了一個(gè)給SNMP發(fā)送系統(tǒng)內(nèi)存狀況的接口,0.1是其版本號(hào)?!?”的含義是后面是傳給該接口函數(shù)的輸入?yún)?shù),默認(rèn)添加的返回值是程序執(zhí)行結(jié)果,由類XorpError定義。如果需要其他的返回值,則需要一個(gè)回調(diào)的callback函數(shù),在XRL接口定義中使用“->”標(biāo)示進(jìn)行聲明,在該接口函數(shù)執(zhí)行完成之后,XORP會(huì)自動(dòng)調(diào)用該callback函數(shù)。上述聲明生成的XRL在執(zhí)行過程中,實(shí)際調(diào)用的XRL如下:
在snmp.xif文件中按照上述格式聲明其他協(xié)議,例如OSPF,RIP,IGMP等傳遞給SNMP數(shù)據(jù)的接口。自動(dòng)腳本會(huì)生成.cc和.hh文件,例如接口set_location會(huì)自動(dòng)生成如下函數(shù):
其生成的只是XRL的接口函數(shù),還需要自行添加該接口的實(shí)現(xiàn)函數(shù)。
在XORP中,CLI是XORP與用戶進(jìn)行交互的界面,供用戶來(lái)對(duì)設(shè)備進(jìn)行個(gè)性化配置以及查看設(shè)備運(yùn)行狀態(tài)和各個(gè)參數(shù)等。默認(rèn)的CLI模塊命令行中不存在SNMP協(xié)議的命令,需要按照XORP的語(yǔ)法規(guī)定手動(dòng)添加模板文件,CLI模塊對(duì)模板進(jìn)行解析,XORP中模板有兩種格式,擴(kuò)展名分別為.tp以及.cmd,其中.tp文件中的命令的調(diào)用是通過XRL來(lái)實(shí)現(xiàn)的,而在.cmd中的命令是用Shell,Linux命令等非XRL來(lái)實(shí)現(xiàn)的。
SNMP模塊必須提供啟動(dòng)SNMP協(xié)議、配置SNMP版本號(hào)、關(guān)閉SNMP協(xié)議、配置SNMP協(xié)議family等接口。示例如下:
1)TP文件示例
上述tp文件中需要聲明SNMP模塊的信息,包括版本號(hào)、依賴程序、路徑信息以及默認(rèn)名稱,除此之外是各個(gè)SNMP模塊相關(guān)命令的調(diào)用XRL以及傳遞參數(shù)等。其中接口函數(shù)名以及路徑等必須和XRL接口聲明的相同,否則將引起rtrmgr找不到對(duì)應(yīng)的XRL命令而無(wú)法啟動(dòng)。XORP在啟動(dòng)時(shí)會(huì)自動(dòng)對(duì)上述模板進(jìn)行解析,動(dòng)態(tài)生成相關(guān)的配置樹。當(dāng)在用戶命令行中輸入相關(guān)命令時(shí),RTRMGR會(huì)按照相應(yīng)的XRL調(diào)用SNMP模塊命令。
2)cmd文件示例
上述程序聲明了清除SNMP統(tǒng)計(jì)信息的命令,commands后面聲明的是需要調(diào)用的程序和參數(shù)等。XORP也會(huì)把cmds文件聲明的命令加入到用戶命令行的命令樹中,與tp文件聲明的命令不同的是,此處調(diào)用命令不再使用XRL。
SNMP協(xié)議現(xiàn)在有3個(gè)版本,v1現(xiàn)在基本已經(jīng)淘汰,主要使用v2和v3,v2在RFC 2578中進(jìn)行了描述,v3在RFC 3411-RFC 3418中定義。在v1中指定5種核心PDU:GET REQUEST,GET NEXT REQUEST,GET RESPONSE,SET REQUEST,TRAP。其他PDU在SNMP的v2中加入,包含GETBULK REQUEST和INFORM。v3中主要增加SNMP在安全性和遠(yuǎn)端配置方面的強(qiáng)化。
SNMP和Agent有基于GPL發(fā)表的源代碼可供使用,最新的代碼可以從http://agentpp.com/上下載。其移植主要是修改其中的宏定義等配置[3-4]。
1)在移植過程中必須修改SNMP和Agent中對(duì)于布爾的變量定義,因?yàn)閄ORP中已經(jīng)對(duì)boolean進(jìn)行了定義。因此更改agent++.h,去掉boolean的定義,添加如下定義:
2)對(duì)SNMP和Agent中所有關(guān)于布爾變量的聲明進(jìn)行更正,把boolean改成agentpp_boolean。
3)根據(jù)系統(tǒng)要求更改SNMP以及Agent的配置文件,例如使用的SNMP版本號(hào)v2/v3等。
MIB(Management Information Base)即管理信息庫(kù),其主要由網(wǎng)絡(luò)管理協(xié)議訪問的管理對(duì)象的數(shù)據(jù)庫(kù)構(gòu)成[5-6]。MIB庫(kù)中每個(gè)葉子節(jié)點(diǎn)以及Entry等都具有獨(dú)一無(wú)二的OID號(hào),RFC以及IEEE提供了大部分協(xié)議的標(biāo)準(zhǔn)MIB庫(kù)定義文件。此外,用戶還可以自己添加私有的MIB庫(kù),此類MIB庫(kù)需添加到private節(jié)點(diǎn)下。
上述SNMP和Agent中并未包含任何MIB庫(kù),通用的標(biāo)準(zhǔn)MIB庫(kù)可以從IEEE等官方網(wǎng)站下載對(duì)應(yīng)的MIB的文本文件,在此之后用第三方的Java工具Agentgen工具將定義的MIB庫(kù)轉(zhuǎn)換成對(duì)應(yīng)的.hh和.cc文件。以RFC1213-MIB為例,其步驟如下:
1)添加該MIB文件到倉(cāng)庫(kù)。命令為
其中 mibrepository是 MIB的二進(jìn)制的倉(cāng)庫(kù),pica8mibs是MIB的文本文件倉(cāng)庫(kù)。如果看到“Loading MIB file[./RFC1213 -MIB - rfc1213.txt]...parsed,done”這樣的打印,說明RFC1213-MIB-rfc1213.txt成功加入mibrepository。
2)生成相應(yīng)的頭文件
#./agentgen.sh ./mibrepository generate RFC1213 - MIB h 3.4 > /tmp/rfc1213_mib.h
3)生成相應(yīng)的C++文件
#./agentgen.sh ./mibrepository generate RFC1213 - MIB c 3.4 > /tmp/rfc1213_mib.cpp
按照上述方法,將其他協(xié)議的MIB庫(kù)全部生成C++文件,并將上述文件添加到Makefile或者M(jìn)akefile.am中。
Agent++主程序主要功能是添加MIB庫(kù),完成初始化,添加eventloop事件,注冊(cè)SNMP模塊。由于SNMP初始啟動(dòng)時(shí)并無(wú)MIB庫(kù)葉子節(jié)點(diǎn)的數(shù)據(jù),因此其會(huì)通過XRL向其他模塊請(qǐng)求數(shù)據(jù),來(lái)構(gòu)建初始的數(shù)據(jù)庫(kù)。在此之后基本不再主動(dòng)請(qǐng)求數(shù)據(jù),而是在網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)變化等條件下由其他模塊自動(dòng)向SNMP傳輸更正的數(shù)據(jù),以此來(lái)減少XRL調(diào)用的次數(shù),提高系統(tǒng)效率。其流程圖如圖2所示。
2.3.1 添加MIB庫(kù)代碼
SNMP啟動(dòng)時(shí)需要首先添加相應(yīng)的MIB庫(kù),例如
圖2 SNMP程序流程圖
SNMP的自帶基礎(chǔ)庫(kù)Vacm和OSFP庫(kù)等。添加系統(tǒng)描述庫(kù)以及OSFP庫(kù)的程序示例如下:
2.3.2 初始化
初始化主要是初始化系統(tǒng)使用的時(shí)間處理EventLoop,系統(tǒng)描述節(jié)點(diǎn)的初始化,以及UsmUserTable等的初始化,初始化UsmUserTable的程序示例如下:
2.3.3 啟動(dòng)模塊
SNMP模塊初始化完成后即可啟動(dòng),SNMP會(huì)通過XRL向rtrmgr注冊(cè)SNMP模塊,rtrmgr在收到SNMP的啟動(dòng)信息后,會(huì)向其他模塊下發(fā)該通知,其他模塊收到通知后會(huì)自動(dòng)向SNMP模塊發(fā)送其負(fù)責(zé)的MIB節(jié)點(diǎn)的數(shù)據(jù),來(lái)構(gòu)建初始數(shù)據(jù)。構(gòu)建完成之后,其他模塊只有在需要更新MIB庫(kù)數(shù)據(jù)時(shí)才會(huì)向SNMP模塊發(fā)送數(shù)據(jù)。例如構(gòu)建SNMP結(jié)點(diǎn)的xrl_snmp_node初始化示例如下:
XrlSnmpNode xrl_snmp_node(eventloop,snmp_target_name,finder_target_name,finder_hostname,finder_port)eventloop.add_ioevent_cb(snmp.get_iv_snmp_session(),IOT_READ,callback(process_snmp),XorpTask::PRIORITY_DEFAULT);
自定義MIB庫(kù)需添加到MIB的private節(jié)點(diǎn)之下,必須按照標(biāo)準(zhǔn)對(duì)于節(jié)點(diǎn)進(jìn)行聲明,例如如下代碼聲明了一個(gè)關(guān)于CPU利用率的節(jié)點(diǎn)[7-9],其中 SYSTAX 聲明該結(jié)點(diǎn)顯示使用的是字符串格式,MAX-ACCES聲明客戶端的操作權(quán)限,此處為只讀,STATUS聲明狀態(tài)信息,DESCRIPTION是關(guān)于該節(jié)點(diǎn)的描述信息。最后一行聲明該結(jié)點(diǎn)是hostStatusGroup組的第一個(gè)結(jié)點(diǎn)。
自定義MIB庫(kù)的編譯方法和標(biāo)準(zhǔn)MIB庫(kù)相同,但必須將其在客戶端重新編譯添加到客戶端MIB庫(kù)中才可以獲取到數(shù)據(jù)[10]。
圖3 客戶端顯示結(jié)果(截圖)
經(jīng)測(cè)試,本設(shè)計(jì)的SNMP協(xié)議在XORP上可以正常啟動(dòng),并在客戶端可以正常獲取和配置數(shù)據(jù)(見圖3)。
:
[1]李文杰.EPON網(wǎng)管代理中SNMP與OAM的設(shè)計(jì)實(shí)現(xiàn)[J].光通信技術(shù),2011,35(5):78-81.
[2]肖鋼.基于SNMP、WBEM和WSDM的系統(tǒng)管理技術(shù)比較[J].北京郵電大學(xué)學(xué)報(bào),2009,32(S1):134-139.
[3]劉振海.核心交換機(jī)嵌入式重啟裝置研究與設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2010,36(11):141-145.
[4]吳迪.基于嵌入式操作系統(tǒng)的網(wǎng)管代理實(shí)現(xiàn)方法[J].計(jì)算機(jī)及網(wǎng)絡(luò)技術(shù)應(yīng)用,2010,8(5):41-43.
[5]張登銀.基于SNMP的MIB庫(kù)轉(zhuǎn)化成C文件的實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(9):6-9.
[6]王海穎.基于LINUX嵌入式系統(tǒng)的NMP及其代理(Agent)的設(shè)計(jì)與實(shí)現(xiàn)[D].遼寧:遼寧科技大學(xué),2008.
[7]陳波.基于SNMP的多元網(wǎng)絡(luò)統(tǒng)一管理模型研究[J].電視技術(shù),2011,35(10):68-71.
[8]陶寧.基于SNMP的光纖放大器遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)[J].激光技術(shù),2011,35(3):365-371.
[9]張亮.基于SNMP的網(wǎng)絡(luò)設(shè)備管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].河北:河北科技大學(xué),2010.
[10]魏煜欣.一種基于SNMP網(wǎng)絡(luò)性能管理數(shù)據(jù)的采集方法[J].計(jì)算機(jī)工程與應(yīng)用,2011,21(9):6-9.