TCP/IP 详解(卷一) SNMP:简单网络管理协议

随着网络技术的飞速发展,网络的数量也越来越多。而网络中的设备来自各个不同的厂家,如何管理这些设备就变得十分重要。本章的内容就是介绍管理这些设备的标准。

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

管理进程和代理进程之间的通信可以有两种方式。一种是管理进程向代理进程发出请求,询问一个具体的参数值(例如:你产生了多少个不可达的ICMP端口?)。另外一种方式是代理进程主动向管理进程报告有某些重要的事件发生(例如:一个连接口掉线了)。当然,管理进程除了可以向代理进程询问某些参数值以外,它还可以按要求改变代理进程的参数值(例如:把默认的IP TTL值改为64)。

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

  1. 一个管理信息库MIB(Management Information Base)。管理信息库包含所有代理进程的所有可被查询和修改的参数。RFC 1213 [McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II。
  2. 关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMI(Structure of Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990]中定义。例如:SMI定义计数器是一个非负整数,它的计数范围是0~4294 967 295,当达到最大值时,又从0开始计数。
  3. 管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al.1990]中定义。SNMP包括数据报交换的格式等。尽管可以在运输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。

协议

关于管理进程和代理进程之间的交互信息,SNMP定义了5种报文:

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

前面的3个操作是由管理进程向代理进程发出的。后面两个是代理进程发给管理进程的(为简化起见,前面3个操作今后叫做get、get-next和set操作)。

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

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

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

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

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

PDU类型名称
0get-request
1get-next-request
2get-response
3set-request
4trap

共同体字段是一个字符串。这是管理进程和代理进程之间的口令,是明文格式。默认的值是public。

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

差错状态字段是一个整数,它是由代理进程标注的,PDU类型名称指明有差错发生。

差错状态名称描述
0noError没有错误
1tooBig代理进程无法把响应放在一个SNMP消息中发出
2noSuchName操作一个不存在的变量
3badValueset操作的值或语义有错误
4readOnly管理进程试图修改一个只读变量
5genErr其他错误

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

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

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

管理信息结构

SNMP中,数据类型并不多。

INTEGER,OCTERSTRING,DisplayString,OBJECTIDENTIFIER,NULL,IpAddress,PhysAddress,Counter,Gauge,TimeTicks,SEQUENCE,SEQUENDEOF。

对象标识符

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

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

树上的每个结点同时还有一个文字名。例如标识1.3.6.1.2.1和iso.org.dod.internet.memt.mib对应。这主要是为了人们阅读方便。在实际应用中,也就是说在管理进程和代理进程进行数据报交互时,MIB变量名是以对象标识来标识的,当然都是以1.3.6.1.2.1开头的。

Trap

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

现在已经定义了6种特定的trap类型,第7种trap类型是由供应商自己定义的特定类型。

trap类型名称描述
0coldStart代理进程对自己初始化
1warmStart代理进程对自己重新初始化
2linkDown一个接口已经从工作状态改变为故障状态
3linkUp一个接口已经从故障状态改变为工作状态
4authenticationFaulure从SNMP管理进程收到无效共同体的报文
5egpNeighborLoss一个EGP邻站已变为故障状态
6enterpriseSpecific在这个特定的代码字段中查找trap信息

ASN.1和BER

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

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

当有了这样的ASN.1定义,可以有多种编码方法把数据编码为传输的比特流。SNMP使用的编码方法是BER。例如,对于一个简单的整数如64,在BER中需要用3个字节来表示。第一个字节说明类型是一个整数,下个字节说明用了多少个字节来存储该整数(在这里是1),最后一个字节才是该整数的值。

0%