一、 SNMP AGENT在SNMP框架中的位置
SNMP是被广泛接受并投入使用的工业标准,它采用轮询机制,便于网络管
理员检索任何节点的信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成。
SNMP的结构分为NMS和AGENT两部分(如图1.1.1),NMS(Network Management Station,目前常用的网管平台有SunNetManager和IBM NetView)向Agent发请求,Agent是驻留在被管设备上的一个进程或任务,接受到NMS的请求报文后,进行解码,分析,然后从相关模块中得到管理变量的值,生成Response报文,编码返送回NMS。SNMP就是用来规定NMS和Agent之间是如何传递管理信息的应用层协议。
NMS UDP Port162ResponseTrapUDP Port161AGENT 图1 SNMP结构
为了简化Agent一侧的开发,SNMP规定只有两种操作Get, Set,前者用于从
被管设备获取管理信息。后者通过设置变量值来起到配置被管设备的作用。
NMS和Agent之间通过发送报文来传递管理信息,SNMPv1规定只有五种报
文:
Get Request报文:用于获取指定管理变量的值。 GetNext Request报文:用于连续获取一组管理变量的值。
GetResponse报文:用于响应请求,返回请求值或错误类型等。 Set Request报文:用于设置指定的管理变量。
Trap报文:用于在紧急情况下由被管设备向NMS主动发信息 二、SNMP AGENT的作用和流程
SNMP AGENT在网管站和设备上相关应用模块之间起到了一个翻译传递的作用。具体说包含两个部分:一是接收来自网管站的请求,对报文进行解码,验证团体名合法后,搜索MIB树并调用相应访问函数通知相关模块进行相应操作,并根据相关模块发回的操作结果构造响应报文,编码并发回网管站。二是提供向网管站主动报警的功能,由相关模块发起,在AGENT构造TRAP报文,并编码发送。
SNMP AGENT流程如下(以基于PSOS SNMP协议栈的AGENT为例进行介绍):
开始If Agent_init成功yes Agent_bodyno关闭socket进程自杀结束
图2:SNMP_AGENT主函数流程图
Snmp_init()Setup_mibCreate socket在other init 对其他接口模块(tcp_mib,ip_mib,ipx_mibetc.)进行初始化.主要是为存放相对应的表的索引分配内存Bind port 161Snmpvar_initOther init Return 0以上流程中任何一函数失败,此函数返回-1
图3:agent_init流程
Send cold start trapAgent进程阻塞,直到从161端口收到来自NMS的请求初始化 ebuffRecvfrom(….)处理收到的包,从相关模块得到管理变量值,打包,编码Process_received _SNMP_packet(…..)sendto向NMS PORT 161发送response报文Clear ebuff
图4:agent_body流程
在agent_body流程中,函数Process_received_SNMP_packet()是核
心。该函数由PSOS协议栈提供。其流程如图五所示,首先对报文进行解码,解码成功后将进行团体名验证。验证通过后,搜索MIB树(MIB树生成方法不再介绍)查找对应的访问函数进行调用,在访问函数中将通知相应模块进行处理。根据返回结果,Process_received_SNMP_packet()将构造报文并进行编码。访问函数包括四种:test(), get(), next(), set(),由开发者自己编写,其实SNMP AGENT开发的很大一块工作就是编写这些访问函数。test()的作用是检查将要GET或SET的对象实例是否存在。如果test()检查失败,将直接构造响应报文指明错误类型和位置并编码。否则将调用get()或set()。 next()的作用是检查将要GETNEXT的对象实例的下一实例是否存在,如果next()检查失败,将直接构造响应报文指明错误类型和位置并编码。否则将调用get()或set()。 get()的作用是获取指定对象实例的值。 set()的作用是设置指定对象实例的值。
开始解码N成功Y团体名验证N成功Y分析包中内容,在MIB树中 搜索到变量名对应的节点不作进一步处理返回等待下一个请求报文不作进一步处理返回等待下一个请求报文Switch PDU类型Ycase Gettest_proc成功NGet_proc填入error index errorstatuscaseGetNextNext_proc成功N填入error index errorstatuscase settest_proc成功N填入error index errorstatusYSet_procYGet_proc将得到的值填入Vorr Bind生成Response PDU编码返回 图5 Process_received_SNMP_packet()流程
三、 SNMP AGENT与相关应用模块的接口。
网管管理设备的各个模块,实际数据都存储在相关的应用模块中。因此访问函数需要与其他模块接口,通知其他模块进行相应操作,并能得到操作的结果。AGENT与其他应用模块的接口可以有多种方式。以下是我们通常采用的一种方式: XXXX_ioctl( int cmd, char* arg ) ,其中cmd是命令字,表明了操作的类型是GET还是SET,对表对象它还表明了是表的哪一列。 arg是一个指向结构的指针。该结构分为两部分,第一部分是由表中的若干列所组成的索引,可以唯一确定操作表的哪一行。第二部分是一个C语言的联合体(union),用于存放待设定或取回的值。
因篇幅问题不能全部显示,请点此查看更多更全内容