一些基本概念
SNMP 协议
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于SNMP的简单性,在Internet时代得到了蓬勃的发展,1992年发布了SNMPv2版本,以增强SNMPv1的安全性和功能。现在,已经有了SNMPv3版本。
一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。MIB(管理信息库)
任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每个SNMP设备(Agent)都有自己的MIB。MIB也可以看作是NMS(网管系统)和Agent之间的沟通桥梁。它们之间的关系如图1所示:
SNMP 报文
SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。
- get-request(简称:GET):从代理进程处提取一个或多个参数值。 - get-next-request(简称 GET-NEXT):从代理进程处提取紧跟当前参数值的下一个参数值。 - set-request(简称:SET):设置代理进程的一个或多个参数值。 - get-response:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。 - trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
MIB 中的数据类型
-- the "base types" defined here are:
-- 3 built-in ASN.1 types: INTEGER, OCTET STRING, OBJECT IDENTIFIER
-- 8 application-defined types: Integer32, IpAddress, Counter32,
-- Gauge32, Unsigned32, TimeTicks, Opaque, and Counter64
详细介绍:Following OID DataTypes
- Integer: Signed 32bit Integer (values between -2147483648 and 2147483647).
- OctetString:Arbitrary binary or textual data, typically limited to 255 characters in length.
- ObjectIdentifier:An OID.
- IPAddress:An IP address.
- Counter32:Represents a non-negative integer which monotonically increases until it reaches a maximum value of 32bits-1 (4294967295 dec), when it wraps around and starts increasing again from zero.
- Counter64:Same as Counter32 but has a maximum value of 64bits-1.
- Gauge32:Represents an unsigned integer, which may increase or decrease, but shall never exceed a maximum value.
- TimeTicks:Represents an unsigned integer which represents the time, modulo 232 (4294967296 dec), in hundredths of a second between two epochs.
- Opaque:Provided solely for backward-compatibility, its no longer used.
Float 类型的处理
可以从上面发现 SNMP 其实不知道 Float 类型,所以如果需要提供 Float 类型的数据,有一下三种 Workaround:
- 将 Float 转换成 INT 类型,然后约定固定几位为小数位(其实就是将
int(float * 10000))
这类转换; - 将 Float 转换成 Counter32/Counter64,然后以 IEEE 的 float32/64 编码进行解析,这两种方法都需要客户端自行转换,且不直接的转换(需要根据文档指导);
- 将 Float 转换成 OctetString 类型,这种方式比较直观,当然也需要客户端进行转换,但是可以很明显知道怎么转换,无需文档说明。