计算机网络管理论文:简单网络管理协议的研究与应用摘要:通过对简单网络管理协议(SNMP)的通讯原理、消息结构及抽象语法表示(ASN.1)、BER编码的分析,并对RFC1213管理信息库(MIB-II)和用户数据报协议(UDP)的分析研究,利用WindowsSNMP提供的服务,使用C++Builder面向对象开发工具进行编程,实现SNMP协议包的构造和协议包的解析,提供网络设备管理的简便方式,从而保证网络设备稳定运行。关键词:网络管理;简单网络管理协议(SNMP);ASN.1;BER编码;RFC1213;用户数据报协议(UDP)1引言简单网络管理协议SNMP(SimpleNetworkManagementProtocol)[1]是由Internet工程任务组织IETF(InternetEngineer-ingTaskForce)[2]研究小组为解决Internet上的路由器管理问题而提出的。SNMP是一系列协议组和规范,可提供一种从网络设备中收集网络管理信息的方法。SNMP也为设备向网络管理工作站报告问题和错误提供方法。2SNMP体系结构简介2.1SNMP消息类型SNMP消息类型提供请求与响应的交互形式[3],其中:(1)GetRequest:管理站用来检索代理管理信息库中的标量对象值;(2)GetNextRequest:管理站用来检索代理管理信息库中的当前标量对象的下一个对象值;(3)SetRequest:管理站用来设置代理管理信息库中的标量对象值;(4)Response:代理用于发送管理站对代理的请求;(5)Trap:代理用于向管理站报告管理对象的状态变化。2.2SNMPPDU协议数据单元结构图3为SNMP报文格式。SNMPPDU协议数据单元结构描述如下:RFC1157-SNMPDEFINATIONS::=BEGINIMPORTObjectName,objectSynax,NetworkAddress,IpAddress,TimeT-icksFROMRFC1155-SMI;Message::=SEQUECE{versionINTEGER{version-1(0)};//版本号communityOCTETSTRING;//团体字dataANY;/SNMPPDU}ANY::=CHOICE//SNMPPDU{get-requestGetRequest-PDU;get-next-requestGetNextRequest-PDU;get-responseGetResponse-PDU;set-requestSetRequest-PDU;trapTrap-PDU;}GetRequest-PDU::=[0]IMPLICITPDU;//A0GetNextRequest-PDU::=[1]IMPLICITPDU;//A1GetResponse-PDU::=[2]IMPLICITPDU;//A2SetRequest-PDU::=[3]IMPLICITPDU;//A3PDU::=SEQUENCE{request-idINTEGER;//请求标识0201xxerror-statusINTEGER;//错误状态0201xx{noError(0),tooBig(1),noSuchName(2),badValue(3),readOnly(4),genError(5)};error-IndexINTEGER;//错误索引0201xxvariable-bindingVarBinList;}VarBinList::=SEQUENCEOFVarBin;VarBin::=SEQUENCE{nameObjectName,valueObjectSyn-tax;}2.3ANS.1和BER抽象语法表示(ANS.1)是一种形式语言,可提供统一的网络数据表示,用于定义应用数据的抽象语法和应用层协议数据单元结构。在OSI和SNMP的管理信息库都是用其定义的。基本编码规则(BER)用ANS.1定义的应用数据在传输过程中要按照一定的规则转换成比特串。给出了SNMP消息的BER编码实例(对代理202.117.49.61的Get请求)。对SNMP消息的BER编码描述://-----SNMP消息-----3026Sequence类型,长度38Byte210版本号:0467075626c6963团体字:OCTString类型,publica019请求标识:GetRequest,长度25Byte210错误标识210错误状态210错误索引30eSequence类型,长度14Byte30cSequence类型,长度12Byte682b6121140请求对象OID:OCTString类型,1.3.6.1.2.1.1.4.050空值2.4RFC1213管理信息库MIBRFC1213定义MIB-2管理对象的核心集合[4],这些对象在任何SNMP系统必须实现。管理信息结构说明了定义和构造MIB的总体框架,以及数据类型的表示和命名方法。SMI只允许存储标量对象和矢量对象(表对象),不支持复杂的数据结构。其提供标准化技术表示管理信息如下:(1)SNMP所有的管理对象组织成分层结构;(2)提供结构化的信息组织技术;(3)提供命名机制。树中的叶子结点都有一个分层的编号。叶子结点代表实际的管理对象,从树根到树叶的编号串联起来,用圆点隔开,形成管理对象标识符。2.5UDP协议用户数据报协议UDP(UserDataProtocol)[5]是一个面向无连接的协议,其传输效率较高。协议格式如表1所示。在SNMP代理中,常用161作为SNMP消息接收;162为AgentSNMP消息响应。UDP协议格式3SNMP编程与测试环境SNMP要求的编程环境有:Java;C/C++;BorlandC++Builder6。该程序选用BorlandC++Builder6编程环境。而SNMP的测试环境要求:(1)WindowsSNMP服务:WindowsNT/Win-dows2000/WindowsXP的网络监视服务提供SNMP代理,端口:161;(2)AdventNetSNMP服务:AdventNet公司的SNMP代理,端口可自己设定;(3)AdventNetSNMPMIBBrowse:AdventNet公司的SNMP动作测试工具;(4)Sniff软件是一个很好的网上抓包程序,用来分析发送和接收的SNMP消息。4SNMP编程实现4.1SNMP消息分析通过对SNMP协议的理解在C++Builder中将其定义为以下结构体类型;分别完成对消息的构造和解析[6]。(1)消息结构的结构体structMessage//消息结构图4SNMP消息的BER编码举例源端口目标端口段长检验和SNMP报文格式-99-{intlen;//消息长度VerVersion;//版本号OctlOctString;//团体字PDUspdu;//SNMP-PDU}SNMPMessage;structVer//版本号{intLen;//长度intVerValue;//版本值};structOctl//团体字{intLen;//长度charOctChar[100];//团体字值};structPDUs{intLen;//长度intPduType;//PDU类型ReqIDPduRID;//请求标识ReqStatusPduRStatus;//请求状态ReqIndexPduRIndex;//请求索引PDUVarBLVarBinList;//变量绑定表};structReqID//请求标识{intLen;intValue;};structReqStatus//请求状态{intLen;intValue;};(2)请求索引的结构体structReqIndex//请求索引{intLen;intValue;};structPDUVarBL//变量绑定表{intLen;//长度intBindArray;//得到PDU组数VarBindVarBind1[100];//绑定变量};structVarBind{intLen;//长度OIDTypeOID;//变量OID类型OIDValueValue1;//变量OID值};structOIDType//变量OID类型{intLen;intValue[100];};structOIDValue//变量OID值{intLen;intTypeIndex;Unionvalvalu{longValueInt;charValueChar[100];intValueIP[10];char*ValuePoint;OIDTypeValueOID;LongValueCount;};};4.2SNMP消息构造根据用户设置的Agent的IP、端口号、执行的请求和对象的OID;按BER编码来构造消息,设置SNMPMessage消息并存入Result[]数组中,以备发送。SNMP消息构造程序代码如下:/----计算SNMP消息长度----/-----设置常规项-----/++++编码VarBindLis++++/----编码SNMP消息----/++++输出Memo1++++++4.3SNMP消息发送与接收使用C++Builder提供的TNMUDP控件完成对SNMP消息的发送和接收,并存入Data1[]数组中,以备解析。以下为部分程序代码://-------消息的发送与接收(基于UDP)-----voidTForm1::sendrev()//------------------void__fastcallTForm1::NMUDP1DataReceived(TCompo-nent*Sender,intNumberBytes,AnsiStringFromIP,intPort){}4.4SNMP消息解析将UDP接收到的消息存入data1[]数组中,与消息的解析相反;将其每一部分添入所定义的SNMPMessage结构中,以备解析显示调用。以下为部分程序代码://------PDU的解析过程------voidTForm1::decodepdu(){//TODO:Addyoursourcecodehere//长度//请求标志等参数//----VarBindlist的解析-------//--------解析OID---------(展性、可复用性、可维护性,并给出一个具体应用实例实现DAO设计模式。参考文献:[1]ErichGamma.设计模式:可复用面向对象软件的基础[M].李英军,蔡敏,刘建中,译.北京:机械工业出版社,2007.[2]JeffreyRichter.框架设计[M].周靖,张杰良,译.北京:清华大学出版社,2006.[3]陆明,张广泉.面向复用软件开发方法的比较与分析[J].苏州大学学报(工科版),2006,26(2):11-15.[4]WilliamCrawford,JonathanKapla.J2EE设计模式[M].刘绍华,毛天露,译.北京:中国电力出版社,2005.[5]龙浩,黄明和.分布式对象在WebServices网络中的复用研究[J].计算机工程与设计,2006,27(15):2789-2792.[6]陶以政,吴志杰,唐定勇,等.基于J2EE的应用框架技术研究[J].计算机工程与设计,2007,28(4):826-828.[7]杨晓梅,于长云,等.基于EJB体系结构的层次模式架构的研究[J].天津工业大学学报,2006,25(1):51-54.[8]张广泉,戎玫,陆明.一种面向复用的增量软件开发过程框架[J].计算机科学,2006,33(10):252-255.