徐國(guó)輝
(廣州工程技術(shù)職業(yè)學(xué)院,廣東 廣州 510075)
Linux是一種開(kāi)放源代碼、協(xié)作開(kāi)發(fā)的類UNIX,但同其他的UNIX操作系統(tǒng)相比又非常小。它是一種真正多用戶、多任務(wù)的操作系統(tǒng)。該系統(tǒng)功能完善,可以運(yùn)行在多數(shù)硬件平臺(tái)上,其緊湊高效的內(nèi)核能夠充分發(fā)揮硬件的作用,同時(shí)對(duì)網(wǎng)絡(luò)功能提供了廣泛的支持[1-2]。 網(wǎng)絡(luò)管理的主流技術(shù)主要是SNMP和公共管理信息協(xié)議(CMIP),SNMP的特點(diǎn)是簡(jiǎn)單,應(yīng)用廣泛;CMIP的特點(diǎn)是規(guī)范,全面和復(fù)雜。
Linux系統(tǒng)集成了強(qiáng)大的網(wǎng)絡(luò)UCD SNMP管理技術(shù)。首先詳細(xì)論述SNMP網(wǎng)絡(luò)管理理論基礎(chǔ),并以Linux操作系統(tǒng)為例,深入剖析基于Linux內(nèi)核,用C語(yǔ)言實(shí)現(xiàn)SNMP網(wǎng)絡(luò)管理協(xié)議的原理。
SNMP為網(wǎng)絡(luò)管理系統(tǒng)提供了底層網(wǎng)絡(luò)管理的框架。SNMP協(xié)議的應(yīng)用范圍非常廣泛,諸多種類的網(wǎng)絡(luò)設(shè)備、軟件和系統(tǒng)中都有所采用,主要是因?yàn)镾NMP協(xié)議有如下幾個(gè)特點(diǎn):
① 相對(duì)于其它種類的網(wǎng)絡(luò)管理體系或管理協(xié)議而言,SNMP易于實(shí)現(xiàn)。SNMP的管理協(xié)議、MIB及其它相關(guān)的體系框架能夠在各種不同類型的設(shè)備上運(yùn)行,包括低檔的個(gè)人電腦到高檔的大型主機(jī)、服務(wù)器、及路由器、交換器等網(wǎng)絡(luò)設(shè)備;
② SNMP協(xié)議有很多詳細(xì)的文檔資料,網(wǎng)絡(luò)業(yè)界對(duì)這個(gè)協(xié)議也有著較深入的理解,這些都是 SNMP協(xié)議近一步發(fā)展和改進(jìn)的基礎(chǔ);
③ SNMP協(xié)議可用于控制各種設(shè)備。比如說(shuō)電話系統(tǒng)、環(huán)境控制設(shè)備,以及其它可接入網(wǎng)絡(luò)且需要控制的設(shè)備等,這些非傳統(tǒng)裝備都可以使用SNMP協(xié)議。
SNMP采用了Client/Server模型的特殊形式:代理/管理站模型[3]。對(duì)網(wǎng)絡(luò)的管理與維護(hù)是通過(guò)管理工作站與SNMP代理間的交互工作完成的。每個(gè)SNMP從代理負(fù)責(zé)回答SNMP管理工作站(主代理)關(guān)于MIB定義信息的各種查詢。
SNMP代理和管理站通過(guò)SNMP協(xié)議中的標(biāo)準(zhǔn)消息進(jìn)行通信,每個(gè)消息都是一個(gè)單獨(dú)的數(shù)據(jù)報(bào)。SNMP使用UDP(用戶數(shù)據(jù)報(bào)協(xié)議)作為第四層協(xié)議(傳輸協(xié)議),進(jìn)行無(wú)連接操作。SNMP消息報(bào)文包含兩個(gè)部分:SNMP報(bào)頭和協(xié)議數(shù)據(jù)單元PDU。數(shù)據(jù)報(bào)結(jié)構(gòu)如下圖1。

圖1 數(shù)據(jù)報(bào)結(jié)構(gòu)
(1)版本識(shí)別符
確保SNMP代理使用相同的協(xié)議,每個(gè)SNMP代理都直接拋棄與自己協(xié)議版本不同的數(shù)據(jù)報(bào)。
(2)團(tuán)體名
用于SNMP從代理對(duì)SNMP管理站進(jìn)行認(rèn)證;如果網(wǎng)絡(luò)配置成要求驗(yàn)證時(shí),SNMP從代理將對(duì)團(tuán)體名和管理站的IP地址進(jìn)行認(rèn)證,如果失敗,SNMP從代理將向管理站發(fā)送一個(gè)認(rèn)證失敗的Trap消息。
(3)協(xié)議數(shù)據(jù)單元
其中PDU指明了SNMP的消息類型及其相關(guān)參數(shù)。
IETF規(guī)定的管理信息庫(kù)MIB(由中定義了可訪問(wèn)的網(wǎng)絡(luò)設(shè)備及其屬性,由對(duì)象識(shí)別符(OID)唯一指定。MIB是一個(gè)樹(shù)形結(jié)構(gòu),SNMP協(xié)議消息通過(guò)遍歷MIB樹(shù)形目錄中的節(jié)點(diǎn)來(lái)訪問(wèn)網(wǎng)絡(luò)中的設(shè)備。
SNMP中定義了五種消息類型:Get-Request、Get-Response、Get-Next-Request、Set-Request、Trap。
SNMP管理站用Get-Request消息從擁有SNMP代理的網(wǎng)絡(luò)設(shè)備中檢索信息,而SNMP代理則用Get-Response消息響應(yīng)。Get-Next-Request用于和Get-Request組合起來(lái)查詢特定的表對(duì)象中的列元素。SNMP管理站用Set-Request 可以對(duì)網(wǎng)絡(luò)設(shè)備進(jìn)行遠(yuǎn)程配置(包括設(shè)備名、設(shè)備屬性、刪除設(shè)備或使某一個(gè)設(shè)備屬性有效/無(wú)效等)。SNMP代理使用Trap向SNMP管理站發(fā)送非請(qǐng)求消息,一般用于描述某一事件的發(fā)生。
Manager為 LINUX 操作系統(tǒng)平臺(tái)(放置編寫的簡(jiǎn)單的SNMP 應(yīng)用軟件),Agent為具有 SNMP 代理的設(shè)備。在Manager端利用C 語(yǔ)言和SNMP 協(xié)議編寫一個(gè)簡(jiǎn)單的應(yīng)用程序(可以發(fā)送 GET GET-NEXT SET 等命令),對(duì)放在網(wǎng)絡(luò)各處的安裝了 SNMP 代理的設(shè)備進(jìn)行查詢。在 SNMP 協(xié)議中,Manager端和Agent端的通信是通過(guò)SNMP協(xié)議數(shù)據(jù)單元實(shí)現(xiàn)的它們之間可以有三種類型的交互:
① Manager端執(zhí)行GET 或GET-NEXT 操作從代理A獲得信息;
② Manager端執(zhí)行SET 操作對(duì)代理A的屬性進(jìn)行設(shè)置;
③ 代理 Agent端向Manager端發(fā)送陷阱異步通知信息告訴管理者關(guān)于自己的一些事件。
程序的流程包括建立傳輸信息的對(duì)話結(jié)構(gòu),構(gòu)造 PDU并給其賦值,發(fā)送 SNMP 協(xié)議包,檢查響應(yīng)信息,具體的主要代碼如下:
#include "snmp.h"
int snmp_dump_packet = 0;
main(argc, argv)
int argc;
char *argv[];
{
struct snmp_session session, *ss;
struct snmp_pdu *pdu, *response;
struct variable_list *vars;
int arg;
char *gateway = NULL;
char *community = NULL;
int count, current_name = 0;
char *names[128];
/*命令和參數(shù)的讀取和分析*/
for(arg = 1; arg < argc; arg++){
if (argv[arg][0] == '-'){
switch(argv[arg][1]){
case 'd':
snmp_dump_packet++;
break;
default:
printf("invalid option: -%c ", argv[arg][1]);
break;
}
/*構(gòu)造會(huì)話信息*/
/*打開(kāi)會(huì)話*/
ss = snmp_open(&session);
if (ss == NULL){
printf("Couldn't open snmp ");
exit(-1);
}
/*構(gòu)造PDU*/
pdu = snmp_pdu_create(GET_REQ_MSG);
for(count = 0; count < current_name; count++){name_length = MAX_NAME_LEN;
if (!read_objid(names[count], name, &name_length)){
printf("Invalid object identifier: %s ",names[count]);
}
snmp_add_null_var(pdu, name, name_length);
}
retry:
/*發(fā)送會(huì)話信息并等待響應(yīng)信息*/
status = snmp_synch_response(ss, pdu, &response);
if (status == STAT_SUCCESS){
if (response->errstat == SNMP_ERR_NOERROR){for(vars = response->variables; vars; vars =vars->next_variable)
print_variable(vars->name, vars->name_length, vars);
} else {
printf("Error in packet. Reason: %s ",snmp_errstring(response->er rstat));
if (response->errstat == SNMP_ERR_NOSUCHNAME){printf("This name doesn't exist: ");
for(count = 1, vars = response->variables; vars &&count != resp
onse->errindex;
vars = vars->next_variable, count++)
}
/*清除PDU 關(guān)閉對(duì)話*/
if (response)
snmp_free_pdu(response);
snmp_close(ss);
}
Linux操作系統(tǒng)正逐漸為商業(yè)界、學(xué)術(shù)界、自由軟件世界所關(guān)注,作為一個(gè)成熟的操作系統(tǒng),它的特征、功能、性能日趨完善。隨著Linux操作系統(tǒng)在中國(guó)的普及,需要了解和掌握它的強(qiáng)大的網(wǎng)絡(luò)功能。在闡述Linux的網(wǎng)絡(luò)管理理論基礎(chǔ)上,著重Linux的SNMP網(wǎng)絡(luò)管理技術(shù)原理的剖析,同時(shí)用C語(yǔ)言在Linux環(huán)境中實(shí)現(xiàn)SNMP的部分功能,以加深對(duì)Linux網(wǎng)絡(luò)功能的認(rèn)識(shí)和理解。
[1] 陳向陽(yáng),方漢.Linux實(shí)用大全[M].北京:科學(xué)出版社,1999.
[2] 博韋,西斯特.深入理解LINUX內(nèi)核[M].北京:中國(guó)電力出版社,2007:9.
[3] 毛期儉,陳恒志,肖寒春.一種基于SNMP的中間網(wǎng)絡(luò)管理系統(tǒng)解決方案[J].通信技術(shù),2007,40(11):225-227.
[4] 王粉花.基于Linux字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2006(12):278-280.
[5] 郗延華,徐釗,楊瑩.基于嵌入式Linux系統(tǒng)TDMoIP的實(shí)現(xiàn)[J].通信技術(shù),2007,40(11):230-233.