TCP/IP详解 卷一 SNMP:简单网络管理协议
发表于:2025-10-25 | 分类: 学习
SNMP:简单网络管理协议

概述

基于TCP/IP的网络管理包含两个部分:网络管理站(也叫管理进程,manager)和被管的网络单元(也叫被管设备)。被管设备种类繁多,例如:路由器、X终端、终端服务器和打印机等。这些被管设备的共同点就是都运行TCP/IP协议。被管设备端和管理相关的软件叫做代理程序 (agent )或代理进程。管理站一般都是带有彩色监视器的工作站,可以显示所有被管设备的状态(例如连接是否掉线、各种连接上的流量状况等 )。

管理进程和代理进程之间的通信可以有两种方式。一种是管理进程向代理进程发出请求,询问一个具体的参数值。另外一种方式是代理进程主动向管理进程报告有某些重要的事件发生。当然,管理进程除了可以向代理进程询问某些参数值以外,它还可以按要求改变代理进程的参数值。

基于TCP/IP的网络管理包含3个组成部分:

  1. 一个管理信息库MIB(Management Information Base)。管理信息库包含所有代理进程的所有可被查询和修改的参数。
  2. 关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMI(Structure of Management Information)。
  3. 管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。

上面提到的SNMP叫做SNMP v1,或者就叫做SNMP。

协议

SNMP定义了5种报文:

  1. get-request操作:从代理进程处提取一个或多个参数值。
  2. get-next-request操作:从代理进程处提取一个或多个参数的下一个参数值。
  3. set-request操作:设置代理进程的一个或多个参数值。
  4. get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的。它是前面3中操作的响应操作。
  5. trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。

前面的3个操作是由管理进程向代理进程发出的。后面两个是代理进程发给管理进程的。下图描述了这5种操作:

既然这些操作中的前4种操作是简单的请求 -应答方式(也就是管理进程发出请求,代理进程应答响应),而且在SNMP中往往使用UDP协议,所以可能发生管理进程和代理进程之间数据报丢失的情况。因此一定要有超时和重传机制。

管理进程发出的前面3种操作采用UDP的161端口。代理进程发出的 Trap操作采用UDP的162端口。由于收发采用了不同的端口号,所以一个系统可以同时为管理进程和代理进程。

下图是封装成UDP数据报的5种操作的SNMP报文格式:

SNMP报文的编码采用了ASN.1和BER,这使得报文的长度取决于变量的类型和值。

版本字段是0。该字段的值是通过SNMP版本号减去1得到的。显然0代表SNMP v1。

下图显示各种PDU对应的值(PDU即协议数据单元,也就是分组):

对于get、get-next和set操作,请求标识由管理进程设置,然后由代理进程在get-response中返回。这个字段的作用是使客户进程(在目前情况下是管理进程)能够将服务器进程(即代理进程)发出的响应和客户进程发出的查询进行匹配。这个字段允许管理进程对一个或多个代理进程发出多个请求,并且从返回的众多 应答中进行分类。

差错状态字段是一个整数,它是由代理进程标注的,指明有差错发生。下图是参数值、名称和描述之间的对应关系:

差错索引字段是一个整数偏移量,指明当有差错发生时,差错发生在哪个参数。它是由代理进程标注的,并且只有在发生noSuchName、readOnly和badValue差错时才进行标注。

在get、get-next和set的请求数据报中,包含变量名称和变量值的一张表。对于get和get-next操作,变量值部分被忽略,也就是不需要填写。

对于trap操作符(PDU类型是4),SNMP报文格式有所变化

管理信息结构

SNMP中,有以下数据类型:

  • INTEGER:一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的1或者不允许转发时的2这两种),有些整型变量定义为一个特定的范围(例如,UDP和TCP的端口号就从0到65535)。
  • OCTER STRING:0或多个8bit字节,每个字节值在0~255之间。对于这种数据类型和下一种数据类型的BER编码,字符串的字节个数要超过字符串本身的长度。这些字符串不是以NULL结尾的字符串。
  • DisplayString:0或多个8bit字节,但是每个字节必须是ASCII码。在MIB-II中,所有该类型的变量不能超过255个字符(0个字符是可以的)。
  • OBJECT IDENTIFIER:后续说明
  • NULL:代表相关的变量没有值。在get或get-next操作中,变量的值就是NULL,这些值还有待到代理进程处去取。
  • IpAddress:4字节长度的OCTER STRING,以网络序表示的 IP地址。每个字节代表IP地址的一个字段。
  • PhysAddress:OCTER STRING类型,代表物理地址(例如以太网物理地址为6个字节长度)。
  • Counter:非负的整数,可从0递增到232-1(4 294 976 295)。达到最大值后归0。
  • Gauge:非负的整数,取值范围为从0到4 294 976 295(或增或减)。达到最大值后锁定 ,直到复位。MIB中的tcpCurrEstab就是这种类型的变量的一个例子,它代表目前在ESTABLISHED或CLOSE_WAIT状态的TCP连接数。
  • TimeTicks:时间计数器, 以0.01秒为单位递增,但是不同的变量可以有不同的递增幅度。所以在定义这种类型的变量的时候,必须指定递增幅度。MIB中的sysUpTime变量就是这种类型的变量,代表代理进程从启动开始的时间长度,以多少个百分之一秒的数目来表示。
  • SEQUENCE:这一数据类型与 C程序设计语言中的“structure”类似。一个SEQUENCE包括 0个或多个元素,每一个元素又是另一个ASN.1数据类型。MIB中的UdpEntry就是这种类型的变量。它代表在代理进程侧目前“激活”的UDP数量(“激活”表示目前被应用程序所用)。在这个变量中包含两个元素:
    1. IpAddress类型中的udpLocalAddress,表示IP地址。
    2. INTEGER类型中的udpLocalPort,从0到65535,表示端口号。
  • SEQUENDE OF:这是一个向量的定义,其所有元素具有相同的类型。如果每一个元素都具有简单的数据类型,例如是整数类型,那么我们就得到一个简单的向量(一个一维向量)。但是我们将看到,SNMP在使用这个数据类型时,其向量中的每一个元素是一个SEQUENCE(结构)。因而可以将它看成为一个二维数组或表。

对象标识符

对象标识是一种数据类型,它指明一种“授权”命名的对象。“授权”的意思就是这些标识不是随便分配的,它是由一些权威机构进行管理和分配的。

对象标识是一个整数序列,以点(“.”)分隔。这些整数构成一个树型结构,类似于DNS或Unix的文件系统。对象标识从树的顶部开始,顶部没有标识,以root表示(这和Unix中文件系统的树遍历方向非常类似)。

下图展示了在S N M P中用到的这种树型结构:

所有的MIB变量都从1.3.6.1.2.1这个标识开始。

管理信息库介绍

所谓管理信息库,或者MIB,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合。

下图展示了UDP组的结构:

在该组中,包含4个简单变量和1个由两个简单变量组成的表格。下图描述了这4个简单变量:

“R/W”列如果为空,则代表该变量是只读的;如果变量是可读可写的,则以“·”符号来表示。哪怕整个组中的变量都是只读的,我们也将列出“R/W”列,以提示读者管理进程只能对这些变量进行查询操作(上图UDP组我们就是这样做的)。同样,如果变量类型是INTEGET类型并且有范围约束,我们也将标明它的下限和上限,下图展示了在udpTable中的两个简单变量:

每次当我们以SNMP表格形式来描述MIB变量时,表格的第1行都表示索引的值,它是表格中的每一列的参考。

Case图

Case图真实地描述了一个给出的MIB组中变量之间的相互关系:

这张图表明,发送到应用层的UDP数据报的数量(udpInDatagrams)就是从IP层送到UDP层的UDP数据报的数量,当然udpInError和udpNoPorts也类似。同样,发送到IP层的UDP数据报的数量(udpoutDatagrams)就是从应用层发出的UDP数据报的数量。这表明udpInDatagrams不包括udpInError和udpNoPorts。

实例标识

对MIB变量进行操作,如查询和设置变量的值时,必须对MIB的每个变量进行标识。首先,只有叶子结点是可操作的。SNMP没法处理表格的一整行或一整列。

  1. 简单变量

    对于简单变量的处理方法是通过在其对象标识后面添加“ . 0”来处理的。

  2. 表格

    表格的实例标识就要复杂得多。每个MIB中的表格都指明一个以上的索引。对于UDP监听表来说,MIB定义了包含两个变量的联合索引,这两个变量是:udpLocalAddress,它是一个IP地址;udpLocalPort,它是一个整数。

  3. 字典式排序

    MIB中按照对象标识进行排序时有一个隐含的排序规则。MIB表格是根据其对象标识按照字典的顺序进行排序的。

管理信息库的其他组

  1. system组

    system组非常简单,它包含7个简单变量。下图列出了system组的名称、数据类型和描述:

  2. interface组

    在本组中只定义了一个简单变量,那就是系统的接口数量,如图所示:

    在该组中,还有一个表格变量,有22列。表格中的每行定义了接口的一些特征参数。如图所示:

    对于SLIP链路的接口类型,所报告的是一个点到点的专用串行链路,而不是SLIP链路。此外,SLIP链路的速率没有报告。

  3. at组

    地址转换组对于所有的系统都是必需的,但是在MIB-II中已经没有这个组。从MIB-II开始,每个网络协议组(如IP组)都包含它们各自的网络地址转换表。

    在该组中,仅有一个由3列组成的表格变量。如图所示:

  4. ip组

    ip组定义了很多简单变量和3个表格变量。下图显示了所有的简单变量:

    ip组中的第一个表格变量是IP地址表。系统的每个IP地址都对应该表格中的一行。每行中包含了5个变量,如图所示:

    ip组中的第二个表是IP路由表,如图所示:

    ip组的最后一个表是地址转换表,如图所示:

    正如我们前面所说的,at组已经被删除了,在这里已经用IP表来代替了。

  5. icmp组

    icmp组包含4个普通计数器变量(ICMP报文的输出和输入数量以及ICMP差错报文的输入和输出数量)和22个其他I C M P报文数量的计数器:11个是输出计数器,另外11个是输入计数器。如图所示:

    对于有附加代码的ICMP报文,SNMP没有为它们定义专门的计数器。

  6. tcp组

    下图显示的是tcp组中的简单变量:

    tcp组还包括一个表格变量,即TCP连接表,如图所示:

Trap

代理进程也可以主动发送trap到管理进程,以告诉管理进程在代理进程侧有某些管理进程所关心的事件发生。

下图给出了trap报文中trap类型字段的内容:

ASN.1和BER

在正式的SNMP规范中都是采用ASN.1(Abstract Syntax Notation 1)语法,并且在SNMP报文中比特的编码采用 BER(Basic Encoding Rule)。

ASN.1是一种描述数据和数据特征的正式语言。它和数据的存储及编码无关。MIB和SNMP报文中的所有的字段都是用ASN.1描述的。

SNMPv2

SNMPv1和SNMPv2之间的重要区别:

  1. 在SNMPv2中定义了一个新的分组类型get-bulk-request,它高效率地从代理进程读取大块数据。
  2. 另的一个新的分组类型是inform-request,它使一个管理进程可以向另一个管理进程发送信息。
  3. 定义了两个新的MIB,它们是:SNMPv2 MIB和SNMPv2-M2M MIB(管理进程到管理进程的MIB)。
  4. SNMPv2的安全性比SNMPv1大有提高。在SNMPv1中,从管理进程到代理进程的共同体名称是以明文方式传送的。而 SNMP v2可以提供鉴别和加密。

SNMPv3

上一篇:
TCP/IP详解 卷一 Telnet和Rlogin:远程登录
下一篇:
TCP/IP详解 卷一 TCP的未来和性能