网络管理:SNMPv1
SNMP 演变
TCP/IP 网络管理最初使用的是 1987 年 11 月提出的简单网关监控协议(SGMP),在此基础上改进成简单网络管理协议第一版(SNMPvl)。当初提出 SNMP 的目的是作为弥补网络管理协议发展阶段之间空缺的一种临时性措施,由于其简单性和易于实现性,SNMPv1 得到了许多制造商的支持和广泛的应用。
SNMP 虽然被广泛应用,但是 SNMP 没有实质性的安全设施,用户面临的只能是在很不完善的管理工具和遥遥无期的管理标准之间作出选择的两难处境。为了修补 SNMP 的安全缺陷,1992 年 7 月出现了一个新标准——安全 SNMP(S-SNMP),这个协议增强了安全方面的功能。但是 S-SNMP 没有改进 SNMP 在功能和效率方面的其他缺点,有人又提出了另外一个协议 SMP 对 SNMP 进行扩充。在对 S-SNMP 和 SMP 讨论的过程中,Internet 研究人员之间确定必须扩展 SNMP 的功能,并增强其安全性,于是决定以 SMP 为基础开发 SNMPv2。
由于 SNMPv2 没有达到“商业级别”的安全要求(提供数据源标识、报文完整性认证、防止重放、报文机密性、授权和访问控制、远程配置和高层管理能力等),所以 SNMPv3 工作组一直在从事新标准的研制工作,终于在 1999 年 4 月发布了 SNMPv3 新标准。
SNMPv1 协议数据单元
SNMPv1 支持的操作
SNMP 仅支持对管理对象值的检索和修改等简单操作,SNMP 实体可以对 MIB-2 中的对象执行下列操作:
操作 | 功能 |
---|---|
Get | 用于检索管理信息库中标量对象的值 |
Set | 用于设置管理信息库中标量对象的值 |
Trap | 代理用陷入报文向管理站报告管理对象的状态变化 |
SNMP 不支持管理站改变管理信息库的结构,即不能增加和删除管理信息库中的管理对象实例,例如不能增加、删除管理信息库中的对象实例。管理站只能逐个访问管理信息库中的叶子节点,不能一次性访问一个子树,例如不能访问整个表的内容。 |
SNMP PDU 格式
RFC1157 用 ASN.1 给出了 SNMPv1 协议的定义,在 SNMP 管理中管理站和代理之间交换的管理信息构成了 SNMP 报文。报文由 3 部分组成:版本号、团体名、协议数据单元(PDU),报文头中的版本号是指 SNMP 的版本,团体名用于身份认证。
管理站发出的 3 种请求报文GetRequest、GetNextRequest和 SetRequest 采用的格式是一样的。
代理的应答报文格式只有一种 GetResponsePDU。
字段 | 说明 |
---|---|
PDU 类型 | 标识 5 种类型的 PDU |
请求标识 | 赋予每个请求报文唯一的整数,用于区分不同的请求 |
错误状态 | 表示代理在处理管理站的请求时可能出现的各种错误,共有 6 种 |
错误索引 | 当错误状态非0时指向出错的变量 |
变量绑定表 | 变量名和对应值的表,说明要检索或设置的所有变量及其值 |
其中 6 种错误状态分别是: | |
标签 | 错误状态 |
--- | --- |
0 | noError |
1 | tooBig |
2 | noSuchName |
3 | badValue |
4 | readOnly |
5 | genErr |
Trap 报文的格式与其他报文不同,它有下列字段: | |
制造商 | 设备制造商的标识 |
--- | --- |
代理地址 | 产生陷入的代理的IP地址 |
一般陷入 | SNMP定义的陷入类型,共分 7 类 |
特殊陷入 | 与设备有关的特殊陷入代码 |
时间戳 | 代理发出陷入的时间 |
报文应答序列
SNMP 报文在管理站和代理之间传送,包含 GetRequest、GetNextRequest 和 SetRequest 的报文由管理站发出,代理以 GetResponse 响应。
Trap 操作相当于代理系统发送事件报告,因此 Trap 报文由代理发给管理站,不需要应答。
SNMP 操作访问对象实例,而且只能访问对象标识树的叶子节点。然而为了减少通信负载,一般希望一次检索多个管理对象,把多个变量的值装入一个 PDU。这时要用到变量绑定表。
报文发送和接收
当 SNMP 协议实体发送报文时,首先按照 ASN.1 的格式构造 PDU 交给认证进程。接着认证进程检查源和目标之间是否可以通信,如果检查通过则把有关信息(版本号、团体名、PDU)组装成报文。最后经过 BER 编码,交传输实体发送出去。
当一个 SNMP 协议实体接收到报文时,需要执行封装报文的逆过程。首先按照 BER 编码恢复 ASN.1 报文,然后对报文进行语法分析、验证版本号和认证信息等。如果通过分析和验证,则离出协议数据单元,并进行语法分析。在认证检验失败时可以生成一个陷入报文,向发送站报告通信异常情况并丢弃报文。
SNMPv1 操作
检索简单对象
检索简单的标量对象可以用 Get 操作,如果变量绑定表中包含多个变量,一次还可以检索多个标量对象的值。接收 GetRequest 的 SNMP 实体以请求标识相同的 GetResponse 响应。特别要注意的是 GetResponse 操作的原子性:如果所有请求的对象值都可以得到则给予应答,反之只要有一个对象的值得不到则返回错误。
例如代理系统的 UDP 组的部分对象实例如下:
使用 GetRequest 请求对象实例的标识符及其相应如下,注意此时请求的是实例,后面要加上 “.0”。
GetRequest(udpInDatagrams.0, udpNoPorts.0, udpInErrors.0, udpOutDatagrams.0)
GetResponse(udpInDatagrams.0 = 100, udpNoPorts.0 = 1, udpInErrors.0 = 2, udpOutDatagrams.0 = 200)
使用 GetNextRequest 请求对象实例的标识符及其相应如下,由于 GetNextRequest 按照词典顺序请求下一个实例,因此这里不需要加上 “.0”。
GetNextRequest(udpInDatagrams, udpNoPorts, udpInErrors, udpOutDatagrams)
GetResponse(udpInDatagrams.0 = 100, udpNoPorts.0 = 1, udpInErrors.0 = 2, udpOutDatagrams.0 = 200)
若代理不支持管理站对 udpNoPorts 的访问,则使用 GetNextRequest 得到的相应如下。由于 udpNoPorts 不允许访问,因此 GetNextRequest 会按照词典顺序检索下一个实例。
GetNextRequest(udpInDatagrams, udpNoPorts, udpInErrors, udpOutDatagrams)
GetResponse(udpInDatagrams.0 = 100, udpInErrors.0 = 2, udpInErrors.0 = 2, udpOutDatagrams.0 = 200)
检索未知对象
GetNext 命令检索变量名指示的下一个对象实例,并不要求变量名是对象标识符或者是实例标识符,该命令会按照词典顺序访问下一个实例。
例如例如管理站不知道 UDP 组有哪些变量,先试着发出 GetNextRequest 命令。该命令会根据词典顺序访问下一个实例,重复访问就可以获取其他实例。
GetNextRequest(udp)
GetResponse(udpindatagrams.0 = 100)
检索表对象
由于 GetNext 可以按照词典顺序访问下一个实例,因此可以有效地检索表对象。
例如代理系统的 UDP 组的部分对象实例如下:
如果用 getRques 检索 ifNumber 的值得到响应,就可以知道代理系统有两个接口。
GetRquest(1.3.6.1.2.1.1.0)
GetResponse(2)
如果想知道每个接口的数据速率,则可以用下面的命令检索接口表的第五个元素。最后的 1 是索引项ifIndex的值,得到的响应说明第一个接口的数据速率是 10Mb/s。
GetRquest(1.3.6.1.2.1.2.1.5.1)
GetResponse(100000000)
如果发出的命令是 getNextRequest,则得到的是第二个接口的数据速率。
GetNextRequest(1.3.6.1.2.1.2.2.1.5.1)
GetResponse(56000)
假定管理站不知道该表的行数而想检索整个表,则可以连使用 GetNext 命令。检索到第一行对象后,对该对象使用 GetNextRequest 就可以获取下一行。
GetNextRequest(ipRouteDest, ipRouteMetricl, ipRouteNextHop)
GetResponse(ipRouteDest.9.1.2.3 = 9.1.2.3, ipRouteMetric.1.9.1.2.3 = 3, ipRouteNextHop.9.1.2.3 = 99.0.0.3)
GetNextRequest(ipRouteDest.9.1.2.3, ipRouteMetric1.9.1.2.3, ipRouteNextHop.9.1.2.3)
GetResponse(ipRouteDest.10.0.0.51 = 10.0.0.51, ipRouteMetric.1.10.0.0.51 = 5, ipRouteNextHop.10.0.0.51 = 89.1.1.42)
表的更新和删除
Set 命令用于设置或更新变量的值,它的 PDU 格式与 Get 相同,但是在变量绑定表中必须包含要设置的变量名和变量值。对于 Set 命令的应答也是 GetResponse,如果所有的变量都可以设置则更新所有变量的值,并在应答的 GetResponse 中确认变量的新值。如果至少有一个变量的值不能设置,则所有变量的值都保持不变,并在错误状态中指明出错的原因。
例如代理系统的 UDP 组的部分对象实例如下:
如果想改变列对象 ipRouteMetricl 的第一个值,则可以发出 SetRequest,得到的应答就是修改后的值。
SetRequest(ipRouteMetric.1.9.1.2.3 = 9)
GetResponse(ipRouteMetric.1.9.1.2.3 = 9)
假定想增加一行,则发出 SetRequest 得到的应答可能为以下 3 种情况:
- 代理拒绝这个命令,返回错误状态 noSuchName;
- 代理接受这个命令,并企图生成一个新的对象实例,但是发现被赋予的值不适当,而返回错误状态 badValue;
- 代理接受这个命令,生成一个新的行,并应答添加的值。
SetRequest(ipRouteDest.11.3.3.12 = 11.3.3.12, ipRouteMetric.11.3.3.12 = 9, ipRouteNextHop.11.3.3.12 = 91.0.0.5)
GetResponse(ipRouteDest.11.3.3.12 = 11.3.3.12, ipRouteMetric.11.3.3.12 = 9, ipRouteNextHop.11.3.3.12 = 91.0.0.5)
假定发出下面的命令,代理系统对于这个命令也有两种处理方法:
- 变量 ipRouteDest 是索引项,代理增加一个表行,对于没有指定值的变量赋予默认值;
- 代理拒绝这个操作,如果要生成新行,必须提供一行中所有变量的值。
SetRequest(ipRouteDest.11.3.3.12 = 11.3.3.12)
如果要删除表中的行,则可以把一个对象的值置为 invalid,得到的响应说明表中的行确已删除。
SetRequest(ipRoute Type.7.3.5.3 = invalid)
GetResponse(ipRoute Type.7.3.5.3 = invalid)
SNMPv1 实现
市场上的 SNMP 产品实现的 MIB-2 数据库和 SNMP 协议与标准不是完全一致的。客观的原因是 SNMP 强调简单性,而忽视了功能性,同时商家对 SNMP 标准的理解也可能不一致。
网络管理站的功能
在选择站管理产品时要关心它与标准的一致程度、与代理的互操作性、是否有友好的用户界面。一些选择的标准如下:
- 支持扩展的 MIB;
- 图形用户接口;
- 自动发现机制;
- 可编程的事件;
- 高级网络控制功能;
- 面向对象的管理模型;
- 用户定义的图标。
轮询频率
轮询频率计算公式
如果管理站仅在启动时轮询一次所有代理,此后只等待代理发来的陷入,则很难掌握网络最新动态。使用轮询进行管理时需要选用合适的轮询频率,管理一定量的网络设备。假定管理站一次只能与一个代理作用,轮询只采用 Get 请求/响应,而且管理站全部时间都用来轮询,则:
N 为被轮询的代理数,T 为轮询间隔,Δ 为单个轮询需要的时间。 可以根据网络配置和代理数量确定最小轮询间隔,或者根据网络配置和轮询间隔计算出管理站可支持的代理设备数,还要考虑轮询给网络增加的负载。
单次轮询时间
单个轮询需要的时间被如下因素影响:
- 管理站生成一个请求报文的时间;
- 从管理站到代理的网络延迟;
- 代理处理一个请求报文的时间;
- 代理产生一个响应报文的时间;
- 从代理到管理站的网络延迟;
- 管理站处理一个响应报文的时间;
- 为了得到需要的管理信息,交换请求/响应报文的数量。
计算样例
样例一
假设有一个 LAN,每 15 分钟轮询所有被管理设备一次,管理报文的处理时间是 50ms,网络延迟为 1ms (每个分组 1000 字节),没有产生明显的网络拥挤,Δ 大约是 0.202s,则管理站最多可支持 4500 个设备。
样例二
在由多个子网组成的广域网中,网络延迟更大,数据速率更小,通信距离更远,而且还有路由器和网桥引入的延迟,总的网络延迟可能达到半秒钟,Δ 大约是 1.2s,则管理站可支持的设备最多为 750 个。
SNMPv1 的局限性
SNMPv1 进行网络管理时有一些局限性,这些局限性有很多在 SNMPv2 都有所改进:
- 由于轮询的性能限制,SNMP 不适合管理很大的网络;
- SNMP 不适合检索大量数据;
- SNMP 的陷入报文是没有应答的;
- SNMP 的安全措施不够;
- SNMP 不直接支持向被管理设备发送命令;
- SNMP 的 MIB-2 支持的管理对象有限;
- SNMP 不支持管理站之间的通信。
参考资料
《计算机网络管理(第三版)》雷震甲 编著,西安电子科技大学出版社