基于Linux环境的简单网络管理协议的实现
2010-09-25徐国辉
徐国辉
(广州工程技术职业学院,广东 广州 510075)
0 引言
Linux是一种开放源代码、协作开发的类UNIX,但同其他的UNIX操作系统相比又非常小。它是一种真正多用户、多任务的操作系统。该系统功能完善,可以运行在多数硬件平台上,其紧凑高效的内核能够充分发挥硬件的作用,同时对网络功能提供了广泛的支持[1-2]。 网络管理的主流技术主要是SNMP和公共管理信息协议(CMIP),SNMP的特点是简单,应用广泛;CMIP的特点是规范,全面和复杂。
Linux系统集成了强大的网络UCD SNMP管理技术。首先详细论述SNMP网络管理理论基础,并以Linux操作系统为例,深入剖析基于Linux内核,用C语言实现SNMP网络管理协议的原理。
1 简单网络管理协议SNMP
1.1 概述
SNMP为网络管理系统提供了底层网络管理的框架。SNMP协议的应用范围非常广泛,诸多种类的网络设备、软件和系统中都有所采用,主要是因为SNMP协议有如下几个特点:
① 相对于其它种类的网络管理体系或管理协议而言,SNMP易于实现。SNMP的管理协议、MIB及其它相关的体系框架能够在各种不同类型的设备上运行,包括低档的个人电脑到高档的大型主机、服务器、及路由器、交换器等网络设备;
② SNMP协议有很多详细的文档资料,网络业界对这个协议也有着较深入的理解,这些都是 SNMP协议近一步发展和改进的基础;
③ SNMP协议可用于控制各种设备。比如说电话系统、环境控制设备,以及其它可接入网络且需要控制的设备等,这些非传统装备都可以使用SNMP协议。
1.2 SNMP基本原理
SNMP采用了Client/Server模型的特殊形式:代理/管理站模型[3]。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。
SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。数据报结构如下图1。
图1 数据报结构
(1)版本识别符
确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。
(2)团体名
用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息。
(3)协议数据单元
其中PDU指明了SNMP的消息类型及其相关参数。
1.3 管理信息库MIB
IETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。
1.4 SNMP的五种消息类型
SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request、Trap。
SNMP管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next-Request用于和Get-Request组合起来查询特定的表对象中的列元素。SNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生。
2 SNMP网络管理协议的实现
2.1 系统实现
Manager为 LINUX 操作系统平台(放置编写的简单的SNMP 应用软件),Agent为具有 SNMP 代理的设备。在Manager端利用C 语言和SNMP 协议编写一个简单的应用程序(可以发送 GET GET-NEXT SET 等命令),对放在网络各处的安装了 SNMP 代理的设备进行查询。在 SNMP 协议中,Manager端和Agent端的通信是通过SNMP协议数据单元实现的它们之间可以有三种类型的交互:
① Manager端执行GET 或GET-NEXT 操作从代理A获得信息;
② Manager端执行SET 操作对代理A的属性进行设置;
③ 代理 Agent端向Manager端发送陷阱异步通知信息告诉管理者关于自己的一些事件。
2.2 SNMP 网络管理协议的Get-Request 操作的实现[4-5]
程序的流程包括建立传输信息的对话结构,构造 PDU并给其赋值,发送 SNMP 协议包,检查响应信息,具体的主要代码如下:
#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];
/*命令和参数的读取和分析*/
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;
}
/*构造会话信息*/
/*打开会话*/
ss = snmp_open(&session);
if (ss == NULL){
printf("Couldn't open snmp ");
exit(-1);
}
/*构造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:
/*发送会话信息并等待响应信息*/
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 关闭对话*/
if (response)
snmp_free_pdu(response);
snmp_close(ss);
}
3 结语
Linux操作系统正逐渐为商业界、学术界、自由软件世界所关注,作为一个成熟的操作系统,它的特征、功能、性能日趋完善。随着Linux操作系统在中国的普及,需要了解和掌握它的强大的网络功能。在阐述Linux的网络管理理论基础上,着重Linux的SNMP网络管理技术原理的剖析,同时用C语言在Linux环境中实现SNMP的部分功能,以加深对Linux网络功能的认识和理解。
[1] 陈向阳,方汉.Linux实用大全[M].北京:科学出版社,1999.
[2] 博韦,西斯特.深入理解LINUX内核[M].北京:中国电力出版社,2007:9.
[3] 毛期俭,陈恒志,肖寒春.一种基于SNMP的中间网络管理系统解决方案[J].通信技术,2007,40(11):225-227.
[4] 王粉花.基于Linux字符设备驱动程序的设计与实现[J].计算机工程,2006(12):278-280.
[5] 郗延华,徐钊,杨莹.基于嵌入式Linux系统TDMoIP的实现[J].通信技术,2007,40(11):230-233.