要开发网管应用,SNMP是必学的协议,这里首先对SNMP进行一下简单的介绍和想要开发SNMP协议的内容所需要用到的工具。
SNMP
SNMP 协议分为了多个版本,V1太简单,V2加入了一些验证,V3最严谨,下面都是以V2进行说明
概念:
ASN.1 高级数据描述语言,用于定义数据类型,语法规则等。
BER ASN.1的基本编码规则,发送消息之前经过其编码,接收后先解码
SMI 管理信息结构,ASN.1的子集加上一部分宏等内容。SNMP用它来描述MIB和PDU
MIB 管理信息库,一般是一个树形结构,使用SMI描述,用来定义一个或者多个网元
OID 网络节点的唯一ID,用在MIB中,是一个国际机构统一分配的,比如1.3.6.1.4.1代表enterprises企业网
PDU SNMP协议数据单元,是一个数据包的格式。每一种SNMP方法对应一种PDU,使用SMI描述,BER编码,传输层(UDP)协议进行传输
SNMP跟网管有关的开发可能会涉及如下的内容:
1. 获取网元信息
- 网元已经存在,其提供MIB文件,其中定义了该网元节点的结构以及想获取该结构内容所需要用到的OID
- 使用代码或者其他的方式构建PDU,比如用snmp4j构建一个get请求类型的PDU(这个PDU是SMI描述的,BER编码的,包含了要操作的OID)到网元,得到返回结果。
- 根据返回结果进行操作(可以通过getNext达到遍历的效果),或者是把单纯的数据信息持久化起来用于观察。
2. 设置网元参数
- 发送set请求的PDU到网元达到设置网元某个参数的作用
3. 开发trap服务器接收trap消息
- 开发trap接收服务端,并在在网元端配置服务器端地址,网元因为某个时间出发一个trap发送到该服务端。
- 服务端记录该trap消息,用于数据分析
4. 开发一个网元模拟器
- 开发一个模拟器,自己作为网元被人管理,通常用于测试。因为网管系统对应的真是网元都是昂贵的硬件,不容易找到合适的测试环境。
为了进行网元开发,首先我们需要准备一下所用到的工具
MIB Browser
下载地址:http://ireasoning.com/download.shtml
可以下载
iReasoning MIB Browser Free Personal Edition |
这个版本是个人版,没有时间限制,但是有导入的mib文件数量的限制,不过很适合开发使用。
我自己写了一个文件上传到附件中,这里对这个文件进行简单的说明。
文件主要内容:
CMS-MIB DEFINITIONS ::= BEGIN
// 文件描述开始
IMPORTS MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Integer32, enterprises,
// 导入基本的库,特别注意enterprises.他的oid是1.3.6.1.4.1
convediaCorp OBJECT IDENTIFIER ::= { enterprises 7569 }
// 定义了一个节点,表示他是enterprises+ 7569,所以他的Oid是1.3.6.1.4.1.7569
nodeInfo OBJECT IDENTIFIER ::= { msMIBObjects 1 }
// 按照上面的类推,这个节点的Oid为.1.3.6.1.4.1.7569.1.2.1.1
nodeLicensedPorts OBJECT-TYPE SYNTAX Integer32 (0.. 65535)MAX-ACCESS read-onlySTATUS currentDESCRIPTION"Future: The maximum number of ports licensed for this MS."DEFVAL { 18000 }::= { nodeInfo 1 }
// 表示从属于nodeInfo的一个节点。其Oid为.1.3.6.1.4.1.7569.1.2.1.1.1.0可以通过get OID这样的结构得到这个属性的值,后续会说具体的方式。
这里说一下SMI定义一个OBJECT-TYPE的结构。
- SYNTAX表示值的类型为Integer32,SMI本身定义了很少的基本类型和一个复合类型Sequences.
- MAX-ACCESS 访问权限,这个在MibBrowers中read-only表示为一个叶子,write表示为一个笔尖
alarmTable OBJECT IDENTIFIER ::= { msMIBObjects 23 }
alarmEventTable OBJECT-TYPESYNTAX SEQUENCE OF AlarmEventEntryMAX-ACCESS not-accessibleSTATUS currentDESCRIPTION"A list of alarm status history entries."::= { alarmTable 3 }