SNMP的体系结构及工作原理

什么是 SNMP?
SNMP是一系列协议组和规范,其提供了一种从网络中的设备中收集网络管理信息的方 法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。其网络管理主 要分为四部分被管理节点(设备)、代理、网络管理工作站、网络管理协议。

SNMP主要部分

 被管理节点(设备)网络管理协议 被监控设备
 代理 用来跟踪被管理设备状态的特殊软件或固件
 网络管理工作站 与在不同的被管理节点中的代理通信,并且显示这些代理状态的中心设备
 网络管理协议 被网络管理工作站和代理用来交换信息的协议

从被管理设备中收集数据所遵循的原则及采用的方式
设计和构造网络管理的基础结构时,需要遵守下列两条网络管理的原则:

  • 由于管理信息而带来的通信量不应明显的增加网络的通信量。
  • 被管理设备上的协议代理不应明显得增加系统处理的额外开销,以致于该设备 的主要功能都被削弱了。
    因此从被管理设备中收集数据重要有两种方法:一种是只轮询(polling-only)的方法, 另一种是基于中断(interrupt-based)的方法。

面向自陷的轮询方法(trap-directed polling)是网络管理采用较有效的方式。网络管理工作站轮询在被管理设备中的代理来收集所需的数据,并且在控制平台上使用数字或图形的方式来显示所收集的数据,同时被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,如预制定阈值越界程度等,即所谓的SNMP自陷(trap)。

代理的概念及所提供的服务
管理代理(agent)是一种特殊的软件(或固件),它包含了关于一个特殊设备及该设备所处环境的信息。
其提供的服务:

  • 网络管理工作站可以从代理中获得相关设备的信息。
  • 网络管理工作站可以修改、增加或者删除代理中的相关表项。
  • 网络管理工作站可以为一个特定的自陷设置阈值。
  • 代理可以向网络管理工作站发送自陷

MIB概念
MIB被称为管理信息库,一个MIB描述了包含在数据库中的对象或表项。

简单网络管理协议

SNMP请求/响应报文
简单网络管理协议允许网络管理工作站软件与被管理设备中的代理进行通信。这种通信可以包括来自管理工作站的询问消息、来自代理的应答消息或者来自代理给管理工作站的自陷消息。
SNMPv1实现起来很简单,其包含5个请求/响应原语:

  • get-request
  • set-request
  • get-next-request
  • get-response
  • trap

报文格式

IP首部UDP首部版本共同体 PDU类型(0-3)请求标识 差错状态(0-5)差错索引名称 值名称 值 ...

 PDU类型4 企业 代理地址 Trap类型(0-6) 特定代码 时间戳 名称 值 ...

 PDU类型 名称
 0 Get-request
 1 Get-next-request
 2 Get-response
 3 Set-request
 4 Trap

SNMP开发工具

开发工具的使用
AdventNet所提供的的开发工具包,支持多种平台。

  • Agent++
  • SNMP++

Microsoft Virtual Studio 6.0,Windows下c++语言的开发包。MS自身提供一组称为WinSNMP的API(在MSDN中提供详细文档),而且MS提供基于Agent Service的SNMP Extension Agent开发。

ucd-snm(net-snmp)p是Linux平台下著名的C语言SNMP开发包,公开源码,是最常用的开发Agent的软件包。

辅助工具的使用
AdventNet所提供的对mib开发一系列开发工具包,包括:

  • Mib Browser
  • Mib Editor
  • Mib Compiler

熟悉SNMP的开发过程
SNMP开发流程

Mib的创建和源码生成
首先第一步是Mib设计,开始Mib设计的时候要确定将被管理的对象纳入管理信息库,最终实现asn.1的文档,在此可以使用AdventNet所提供的Mib Editor来实现。通过Mib编译器将asn.1的文档编译成c文件和头文件,可以使用Mib Compiler编译。

Agent的开发
Agent++支持多种平台,主要有solaris, hp unix, windows等。使用方法稍有不同,但原理一致,即生成库文件,进行开发应用时使用头文件及库文件即可。
 unix下直接进行make,如果有问题对makefile中的一些宏/变量进行调整。在solaris下基本没有问题。
 windows下vc6编译请参考附录

Snmpapp的开发
snmp++支持多种平台,主要有solaris, hp unix, windows等。使用方法稍有不同,但原理一致,即生成库文件,进行开发应用时使用头文件及库文件即可。

  • unix下直接进行make,如果有问题对makefile中的一些宏/变量进行调整。在solaris下基本没有问题。新版本支持snmpv3,需要用到libdes或其他加解密库。
  • windows下vc6编译请参考附录

附录:windows下vc6编译
创建项目,加入所有的源文件和头文件后。
要在PROJECT的SETTING中设置如下项:
1 在C++页,/I 项加入AGENT++的INCLUDE和SNMP++的INCLUDE 目录
2、设置成MTd 多线程DEBUG模式。
3、 编译运行。

以上用来编译AGENT++库。
对于AGENT++的例子,要在PROJECT的SETTING中设置如下项:
1、创建WIN32的控制台程序;
2、加入程序代码;
3、加入SNMP++.LIB和AGENT++.LIB;
4、 在C++页,/I 项加入AGENT++的INCLUDE和SNMP++的INCLUDE 目录
5、设置成MTd 多线程DEBUG模式。
6、在LINK页,加入Ws2_32.lib
7、加入/nodefaultlib:"libcmtd.lib"
8、编译运行。