协议简单讲解
SNMP 是 TCP/IP 协议簇的一个应用层协议。在 1988 年被制定,并被 Internet 体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案;由于 SNMP 的简单性,在 Internet 时代得到了蓬勃的发展,1992 年发布了 SNMPv2 版本,以增强 SNMPv1 的安全性和功能。现在,已经有了 SNMPv3 版本。 一套完整的 SNMP 系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。 1). 管理信息库 MIB:任何一个被管理的资源都表示成一个对象,称为被管理的对象。MIB 是被管理对象的集合。它定义了被管理对象的一系列属性:对象的名称、对象的访问权限和对象的数据类型等。每个SNMP设备(Agent)都有自己的 MIB。MIB 也可以看作是 NMS(网管系统)和 Agent 之间的沟通桥梁。
2). MIB 文件中的变量使用的名字取自 ISO 和 ITU 管理的对象标识符(object identifier)名字空间。它是一种分级树的结构。第一级有三个节点:ccitt、iso、iso-ccitt。低级的对象 ID 分别由相关组织分配。一个特定对象的标识符可通过由根到该对象的路径获得。一般网络设备取 iso 节点下的对象内容。如名字空间 ip 结点下一个名字为ipInReceives的MIB变量被指派数字值 3,因而该变量的名字为:
1.3.6.1.2.1.4.3
如下图所示
当网络管理协议在报文中使用 MIB 变量时,每个变量名后还要加一个后缀,以作为该变量的一个实例。如ipInReceives的实例数字表示为:1.3.6.1.2.1.4.3.0.
需要注意的是,MIB 中的管理对象的OID有些需要动态确定,如 IP 路由表,为了指明地址 202.120.86.71 的下一站路由(next hop),我们可以引用这样的实例:
iso.org.dod.internet.mgmt.mib.ip. ipRouteTable.ipRouteEntry.ipRouteNextHop.202.120.86.71, 相应的数字表示为:1.3.6.1.2.1.4.21.1.7.202.120.86.71
对于这种动态对象标识的实例,由于无法转换为预先指定的 Readkey 名称,与飞邻的产品架构冲突(需要动态生成可变 Readkey),暂不考虑支持。 3). 管理信息结构 SMI 定义了 SNMP 框架所用信息的组织、组成和标识,它还为描述 MIB 对象和描述协议怎样交换信息奠定了基础。 SMI 定义的数据类型:
- 简单类型(simple) Integer:整型是-2,147,483,648~2,147,483,647 的有符号整数 octet string: 字符串是 0~65535 个字节的有序序列 OBJECT IDENTIFIER: 来自按照 ASN.1 规则分配的对象标识符集
- 简单结构类型(simple-constructed) - - SEQUENCE 用于列表。这一数据类型与大多数程序设计语言中的“structure”类似。一个 SEQUENCE 包括 0 个或更多元素,每一个元素又是另一个 ASN.1 数据类型 - - SEQUENCE OF type 用于表格。这一数据类型与大多数程序设计语言中的“array”类似。一个表格包括 0 个或更多元素,每一个元素又是另一个 ASN.1 数据类型。 - 应用类型(application-wide) IpAddress: 以网络序表示的 IP 地址。因为它是一个 32 位的值,所以定义为 4 个字节; counter:计数器是一个非负的整数,它递增至最大值,而后回零。在SNMPv1中定义的计数器是 32 位的,即最大值为 4,294,967,295; Gauge :也是一个非负整数,它可以递增或递减,但达到最大值时保持在最大值,最大值为 232-1; time ticks:是一个时间单位,表示以 0.01 秒为单位计算的时间;
SNMP 报文结构
- 编码之前结构如下
SNMP 共有 5 种报文,所以其 PDU 也有 5 中,第七点会详细介绍 SNMP 的 5 种协议数据单元。 2. SNMP的 5 种协议数据单元 SNMP 规定了 5 种协议数据单元 PDU(也就是SNMP 报文),用来在管理进程和代理之间的交换。 get-request 操作:从代理(agent)进程处提取一个或多个参数值。 get-next-request 操作:从代理(agent)进程处提取紧跟当前参数值的下一个参数值。 set-request 操作:设置代理进程的一个或多个参数值。 get-response 操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。trap 操作:代理进程主动发出的报文,通知管理进程有某些事情发生。 前面的 3 种操作是由管理进程向代理进程发出的,后面的 2 个操作是代理进程发给管理进程的,为了简化起见,前面 3 个操作今后叫做 get、get-next 和 set 操作。图 1 描述了 SNMP 的这 5 种报文操作。请注意,在代理进程端是用熟知端口 161 俩接收 get 或 set 报文,而在管理进程端是用熟知端口 162 来接收 trap 报文。
- 可见一个 SNMP 报文共有三个部分组成,即公共 SNMP 首部、 get/set 首部、trap 首部、变量绑定。 公共 SNMP 首部 共三个字段:
- 版本 写入版本字段的是版本号减 1,对于 SNMP(即 SNMPV1)则应写入 0。
- 共同体(community) 共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是 6 个字符“public”。
- PDU 类型 根据 PDU 的类型,填入 0~4 中的一个数字,其对应关系如下表所示意图。