APP下载

基于.NET技术实现的SNMP通信

2011-03-14赵英王小维

电子设计工程 2011年10期
关键词:重传管理站网络管理

赵英,王小维

(北京化工大学信息科学与技术学院,北京100029)

随着计算机网络技术的飞速发展,通信网络结构越来越复杂,通信网络使用的设备也越来越复杂,由于网络的大型化和复杂化,如何有效地进行网络管理日益成为们普遍关注的问题。网络管理的目标是最大限度地增加网络的可用时间,提高网络设备的利用率、网络性能、服务质量和安全性,简化多厂商混合网络环境下的管理和控制网络运行成本,提供网络的长期规划。

SNMP[1](Simple Network Management Protocol,简单网络管理协议)易于实现和广泛的TCP/IP应用基础,可以在多厂商混合网络环境下,通过提供单一的网络操作控制环境来管理所有子网和被管理设备,以集中的、统一的方式远程控制网络,以排除故障和重新配置网络设备而获得厂商的支持。

然而,实现SNMP编程常见方法是使用网络管理应用SNMP的API,大多数API都提供了一个很大的函数库,比如WinSNMP[2]。由于.NET有丰富的、可复用的标准类库,采用.NET开发越来越受到开发人员的青睐。为了简化SNMP网络管理系统的开发复杂度、开发出高效易扩展的代码,采用把复杂的WinSNMP[3]的API函数封装成一个个相关的.NET[4]类,从而简化了SNMP网络管理软件开发的复杂性。用于它把SNMP编程中的核心部分都面向对象化封装起来,因此开发人员不必了解SNMP底层机制,只要了解.NET的编程知识和SNMP编程的流程,就可以快速开发出高效的SNMP程序。

1 SNMP概述

SNMP(Simple Network Management Protocol,简单网络管理协议)首先是有IETF的研究小组为了解决Internet上的路由器的管理问题而提出的。1989年SNMP v1发行时,虽然能显示出管理大部分Internet设备的强大能力,但是也暴露出明显不足:给网络带来沉重负担、网络中数据的安全性差。1993年IETF发布了新的SNMP v2,然后再增加了安全机制的同时,也增加了实施的复杂性。随着网络安全重要性的发展,SNMPv3诞生了,其体系结构不仅体现了模块化的设计思想,还能简单地实现功能模块的增加和修改。从总体上说,SNMP的设计原则是简单性和可扩展性。简单性是通过信息类型限制、请求响应或协议而实现的;可扩展性是通过将管理信息模型与协议、被管理对象的详细规定(MIB[6])分离而实现的。

1.1 SNMP通信模型

SNMP通信管理模型采用的是管理站/管理代理模型,共有4个组成部分:管理站、管理代理、管理信息库和网络管理协议,如图1所示。

图1 SNMP网络管理模型Fig.1Network management model

它们之间的关系是:管理站通过与管理代理发送/接受/响应SNMP请求来完成对管理代理的监控管理工作、所有管理设备的信息都被储存在管理代理实体的管理信息库中、管理站和管理代理之间交互的数据格式和规则都由SNMP来规范。每个部分的具体介绍如下:

1)管理站一个单独的设备或者是共享网络中的一员,为管理站和网络管理系统提供接口。

2)管理代理一般的网络终端如路由器、交换机等在设备出厂时都已经配置好相关的SNMP管理代理,对于不支持SNMP协议的设备,如果网络终端是主机的话,可以在“控制面板”的“添加/删除程序”的“添加/删除windows组件”,安装“简单网络管理协议”。

3)管理信息库(MIB)存放了网络设备上被管对象资源的所有信息,每个被管对象有一个惟一对象的对象标识符(OID)。管理信息库本身就是一个定义如何把对象标识符组合成逻辑相关的集合。

4)网络管理协议(SNMP)主要有以下3个功能:取值(Get)使网管站能读取代理处对象的值;设置值(Set)使网管站能设置管理代理处对象的值;告警信息(Trap)使管理代理能够向管理站通报重要事件。

1.2 SNMP协议数据单元

在SNMP中,信息按照SNMP报文格式在管理站和管理代理之间进行交换,一共有Get-Request操作、Get-Next-Request操作、Set-Request操作、Get-Response操作、Trap操作一共5种报文类型。如图2所示。

图2 SNMP报文的工作机制Fig.2SNMP message work mechanism

前面3个操作是由管理站向管理代理发出的,后面2个操作是管理代理发给管理站的。这里值得注意的一点是,在管理代理一端使用熟知端口161来接受get或set报文,而在管理站一端是用熟知端口162来接受trap报文。

2 SNMP通信的关键

2.1 数据类型的规范定义

在基于SNMP通信的监控系统中,每个被管理设备都维护一个包含统计信息及其他数据的数据库,被称作管理信息库(Management Information Base,MIB)。每个MIB的每项都包含一个信息:对象类型、语法、访问及状态等。MIB中的各项内容由管理信息结构(Structure of Management Information,SMI)来定义,SMI为MIB提供了一个通用框架,同时规定了在MIB中使用时的数据类型,即如何表示和命名MIB对象。一个对象类型的命名明确代表一个对象,成为对象标识符。它是一个由圆点分隔的整数序列,这些对象标识符按照类似DNS域名系统的树状结构来排列的,一个对象标识符(OID)唯一标识一个MIB对象。另外,MIB还要严格遵守ASN.1(Abstract Syntax Notation One,抽象语法标记)的语法格式,ASN.1提供了一套正规格式用来描述对象结构,而且不管对象数据的具体指代。

本文中最常用到的几个数据的规范如表1所示。

表1 ASN.1规范下的数据定义Tab.1Data definition under the criterion of ASN.1

2.2 SNMP通信的关键函数

SNMP规定使用用户数据报协议(UDP[7])作为第4层传输协议,在数据传输过程中,网络一步步把UDP数据封装成SNMP报文的形式来保障管理站和管理代理之间的数据顺利交互,而UDP使用的是无连接服务,所以SNMP无需在管理站和管理代理之间保持连接,但可能发生数据报丢失的情况,因此一定要有超时和重传机制。主要实现的几个函数如下:

internal bool RequestAsync(IPAddress peer,int port,byte[]buffer,intbufferLength,inttimeout,intretries,SnmpAsyncCallback asyncCallback);//建立一个异步的SNMP请求;

internal void SendToBegin();//调用同步的SendTo函数;

internal void ReceiveBegin();//从Socket类接收数据;

internal void RetryAsyncRequest();//异步重传请求函数;

public byte[]Request(IPAddress peer,int port,byte[]buffer,int bufferLength,int timeout,int retries);//使用同步请求借助请求超时和重传的IP/UDP协议;

.NET使用以上几个函数完成基本的SNMP通信,首先,用RequestAsync函数建立SNMP请求,然后用SendToBegin函数发送此SNMP请求,同时管理代理端有监听函数,收到SNMP请求后会做出响应并给管理站返回需要的信息,此时,管理站用ReceiveBegin函数接受返回来的信息。在此通信过程中有可能发生数据丢失,RetryAsyncRequest和Request函数就是为此而设计的重传请求函数和重传协议函数。

3 .NET技术实现

把UDP的Socket通信[8]封装好之后,运用.NET技术[9]进行具体的SNMP控制,下面以Get-Request操作和Set-Request操作为例子来演示.NET技术编程[10]的快速、便捷。

Get-Request操作具体应用:

class Program{

static void Main(string[]args){

String snmpAgent=“127.0.0.1”;//指定管理代

理的IP地址;

Int snmpPort=1611;//指定管理代理的端口号;

String snmpCommunity=“public”;//指定共同体;

Int timeout=300;//设定超时,默认超时时间是0.01 s,现为3 s;

Int retry=2;//设定重传次数;

//调用SimpleSnmp的构造函数初始化,一个有5个构造函数,此构造函数带有4个参数值;

SimpleSnmp snmp=new SimpleSnmp(snmpAgent,snmpPort,snmpCommunity,timeout,retry);

Pdu pdu=new Pdu();//产生一个pdu请求;

pdu.Type=PduType.Get;//调用Get方法;

pdu.VbList.Add("1.3.6.1.2.1.1.5.0");//指定OID节点;

//调用GetNext方法把结果保存在Dictionary数据类型的result中;

Dictionary<Oid,AsnType>result=snmp.GetNext(SnmpVersion.Ver1,pdu);

if(result==null){

Console.WriteLine("Request failed.");

//如果返回结果为空,请求失败;

}

else{//如果有返回值,依次顺序,解析返回结果;

foreach(KeyValuePair<Oid,AsnType>entry in result)

{

Console.WriteLine("{0}={1}:{2}",entry.Key.ToString(),

SnmpConstants.GetTypeName(entry.Value.Type),

entry.Value.ToString());

}

}

}

}

Set-Request操作具体应用:

class program{

static void Main(string[]args){

String snmpAgent="localhost";//指定管理代理的IP地址;

String snmpCommunity="private";//指定管理代理的端口号;

//调用SimpleSnmp的构造函数初始化,一个有5个构造函数,此构造函数带有两个参数值;

SimpleSnmp snmp=new SimpleSnmp(snmpAgent,snmpCommunity);

List<Vb>vbList=new List<Vb>();//产生一个pdu请求;

Oid setOid=new Oid("1.3.6.1.2.1.1.1.0");//指定OID节点;

OctetString setValue=new OctetString("My personal toy");//添加OctetString字符串;

vbList.Add(new Vb(setOid,setValue));//把数据添加到UDP数据报中;

//调用Set方法把结果保存在Dictionary数据类型的result中;

Dictionary<Oid,AsnType>result=snmp.Set(SnmpVersion.Ver1,list.ToArray());

if(result==null){

Console.WriteLine("Request failed.");//如果返回结果为空,请求失败;

}else{

Console.WriteLine("Success!");//否则,Set操作成功;

}

}

}

在主程序中执行了这两段代码,都返回了开发者想要的结果。最重要的是,使用.NET技术封装了SNMP底层通信的编程,使整个程序看起来简单易懂。

4 结束语

随着网络规模和复杂性的发展,一个功能健全的安全监控管理软件自然成为网络管理者的最大愿望。.NET的开发语言之一C#的主要特点就是简单易用。由于C#把对编程中的很多部分都对象化,编程人员不需要了解函数的具体实现,在使用的时候,着重注意函数的参数类型和个数以及对象与函数之间的对应关系,就可以很方便地实现各种参数的传输、修改等等。如此一来,整个基于SNMP的网站监控管理系统的开发周期就大大缩短。

[1]RFC3410.Introduction and applicability statements for internetstandardnetworkmanagementframework,(RDC2570)[S].2002.

[2]Stalling William.SNMP网络管理[M].胡成松,汪凯,译.北京:中国电力出版社,2001.

[3]罗君舟.TCP/IP协议及网络编程技术[M].北京:清华大学出版社,2004:181-234.

[4]刘建荣,武桦,赵杨.基于.NET的水电厂远程监控系统的研究[J].西北水力发电,2006(1):4-10.LIU Jian-rong,WU Hua,ZHAO Yang.Remote monitoring system research of hydropower plants based on.NET[J].Northwest Hydropower,2006(1):4-10.

[5]胡士毅,魏丰,曹宇.一种基于.NET技术的Web远程监控系统方案[J].工业控制计算机,2003(2):39-40.HU Shi-yi,WEI Feng,CAO Yu.Web remote monitoring system plan based on.NET technology[J].Industry Control Computer,2003(2):39-40.

[6]杨蕾.基于SNMP的GPON网管系统的设计与实现[D].成都:电子科技大学,2006:78-81.

[7]苗苏娟,万振凯.简单网络管理协议SNMP的研究与应用[J].石油工业计算机应用,2004,12(4):40-42.MIAO Su-juan,WAN Zhen-kai.Research and application of simple network management protocol SNMP[J].Petroleum Industry Computer Application,2004,12(4):40-42.

[8]谢安明,邵美珍.使用Socket设计网络通讯程序[J].信息工程大学学报,2001,2(1):68-70.XIE An-ming,SHAO Mei-zhen.The design of the network communication program with socket[J].Journal of Information Engineering University,2001,2(1):68-70.

[9]中文C#技术站.C#调用Windows API的要点[EB/OL].[2011-02-03].http://www.chinacs.net.

[10]Zitun.SNMP library[EB/OL].[2010-02-12].http://www.codeproject.com/KB/cs/SNMPDLL.aspx

猜你喜欢

重传管理站网络管理
宿迁市救助管理站:小团队如何撬动大社会
大连市救助管理站:多个“第一”背后的秘密
基于OpenStack虚拟化网络管理平台的设计与实现
面向异构网络的多路径数据重传研究∗
电动汽车充电服务网络管理初探
基于EOC通道的SHDSL网络管理技术
托起救助之责 谱写青春赞歌——记河南省安阳市救助管理站站长许帅
数据链路层的选择重传协议的优化改进
卫星导航网络管理设计
MPTCP中一种减缓缓存阻塞的重传策略