一些基本概念

  • 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 类型,这种方式比较直观,当然也需要客户端进行转换,但是可以很明显知道怎么转换,无需文档说明。

交流的社区

Reference