SNMP简介介绍SNMP的定义、目的、版本演进以及受益。
定义简单网络管理协议SNMP(Simple Network Management Protocol)是广泛应用于TCP/IP网络的网络管理标准协议。SNMP提供了一种通过运行网络管理软件的中心计算机(即网络管理工作站)来管理设备的方法。SNMP的特点如下:
目的随着网络技术的飞速发展,在网络不断普及的同时也给网络管理带来了一些问题:
在这种背景下,SNMP应运而生。通过“利用网络管理网络”的方式,SNMP实现了对网络设备的高效和批量的管理;同时,SNMP协议也屏蔽了不同产品之间的差异,实现了不同种类和厂商的网络设备之间的统一管理。
版本演进1990年5月,RFC 1157定义了SNMP的第一个版本SNMPv1。RFC 1157提供了一种监控和管理计算机网络的系统方法。SNMPv1基于团体名认证,安全性较差,且返回报文的错误码也较少。
1996年,IETF颁布了RFC 1901,定义了SNMP的第二个版本SNMPv2c。SNMPv2c中引入了GetBulk和Inform操作,支持更多的标准错误码信息,支持更多的数据类型(Counter64、Counter32)。
鉴于SNMPv2c在安全性方面没有得到改善,IETF又颁布了SNMPv3的版本,提供了基于USM(User Security Module)的认证加密和基于VACM(View-based Access Control Model)的访问控制。
受益网络管理员可以利用SNMP平台在网络上的任意节点完成信息查询、信息修改和故障排查等工作,工作效率得以提高。
屏蔽了设备间的物理差异,SNMP仅提供最基本的功能集,使得管理任务与被管理设备的物理特性、网络类型相互独立,因而可以实现对不同设备的统一管理,管理成本低。
设计简单、运行代价低,SNMP采用“尽可能简单”的设计思想,其在设备上添加的软件/硬件、报文的种类和报文的格式都力求简单,因而运行SNMP给设备造成的影响和代价都被最小化。
SNMPv1/SNMPv2cSNMPv1/SNMPv2c报文结构如图1-3所示,SNMPv1/SNMPv2c报文主要由版本、团体名、SNMP PDU三部分构成。
图1-3 SNMPv1/SNMPv2c报文结构

报文中的主要字段定义如下:
版本:表示SNMP的版本,如果是SNMPv1报文则对应字段值为0,SNMPv2c则为1。
团体名:用于在Agent与NMS之间完成认证,字符串形式,用户可自行定义。团体名包括“可读”和“可写”两种,执行GetRequest、GetNextRequest操作时,采用“可读团体名”进行认证;执行Set操作时,则采用“可写团体名”认证。
SNMPv1/SNMPv2c PDU:包含PDU类型、请求标识符、变量绑定列表等信息。其中SNMPv1 PDU包括GetRequest PDU、GetNextRequest PDU、SetRequest PDU、Response PDU和Trap PDU几种类型,SNMPv2c PDU在SNMPv1的基础上新增了GetBulkRequest PDU。
为了简化起见,SNMP操作今后叫做Get、GetNext、Set、Response、Trap和GetBulk操作。
SNMPv1/SNMPv2c操作类型如表1-1所示,SNMPv1/SNMPv2c规定了6种操作类型,用来完成NMS和Agent之间的信息交换。
表1-1 SNMPv1/SNMPv2c中涉及的操作
Get
Get操作可以从Agent中提取一个或多个参数值。
GetNext
GetNext操作可以从Agent中按照字典序提取下一个参数值。
Set
Set操作可以设置Agent的一个或多个参数值。
Response
Response操作可以返回一个或多个参数值。这个操作是由Agent发出的,它是GetRequest、GetNextRequest、SetRequest和GetBulkRequest四种操作的响应操作。Agent接收到来自NMS的Get/Set指令后,通过MIB完成相应的查询/修改操作,然后利用Response操作将信息回应给NMS。
Trap
Trap信息是Agent主动向NMS发出的信息,告知管理进程设备端出现的情况。
GetBulk
GetBulk操作实现了NMS对被管理设备的信息群查询。
SNMPv1/SNMPv2c工作原理SNMPv1和SNMPv2c的工作原理基本一致。SNMPv1/SNMPv2c的工作原理如图1-4所示。图1-4 基本操作类型

Get操作
假定NMS想要获取被管理设备MIB节点sysContact的值,使用可读团体名为public,过程如下所示:NMS:向Agent发送Get请求报文。报文中各字段的设置如下:版本号为所使用的SNMP版本;团体名为public;PDU中PDU类型为Get类型,绑定变量填入MIB节点名sysContact。
Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,Agent根据请求查询MIB中的sysContact节点,得到sysContact的值并将其封装到Response报文中的PDU,向NMS发送响应;如果查询不成功,Agent会向NMS发送出错响应。
GetNext操作
假定NMS想要获取被管理设备MIB节点sysContact的下一个节点sysName值,使用可读团体名为public,过程如下所示:NMS:向Agent发送GetNext请求报文。报文中各字段的设置如下:版本号为所使用的SNMP版本;团体名为public;PDU中PDU类型为GetNext类型,绑定变量填入MIB节点名sysContact。
Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,Agent根据请求查询MIB中的sysContact的下一个节点sysName,得到sysName的值并将其封装到Response报文中的PDU,向NMS发送响应;如果查询不成功,Agent会向NMS发送出错响应。
Set操作
假定NMS想要设置被管理设备MIB节点sysName的值为HUAWEI,使用可写团体名为private,过程如下所示:NMS:向Agent发送Set请求报文。报文中各字段的设置如下:版本号为所使用的SNMP版本;团体名为private;PDU中PDU类型为Set类型,绑定变量填入MIB节点名sysContact和需要设置的值HUAWEI。
Agent:首先对报文中携带版本号和团体名进行认证,认证成功后,Agent根据请求设置管理变量在管理信息库MIB中对应的节点,设置成功后向NMS发送响应;如果设置不成功,Agent会向NMS发送出错响应。
Trap操作
Trap不属于NMS对被管理设备的基本操作,它是被管理设备的自发行为。当被管理设备达到告警的触发条件时,会通过Agent向NMS发送Trap消息,告知设备侧出现的异常情况,便于网络管理人员及时处理。例如被管理设备热启动后,Agent会向NMS发送warmStart的Trap。
这种Trap信息是受限制的。只有在设备端的模块达到模块预定义的告警触发条件时,Agent才会向管理进程报告。这种方法有其好处是仅在严重事件发生时才发送Trap信息,减少报文交互产生的流量。
SNMPv2c新增的操作如图1-5所示。图1-5 SNMPv2c新增操作

GetBulk操作
基于GetNext实现,相当于连续执行多次GetNext操作。在NMS上可以设置被管理设备在一次GetBulk报文交互时,执行GetNext操作的次数。
- SNMPv3SNMPv3报文结构
SNMPv3定义了新的报文格式,其报文结构如图1-6所示。
图1-6 SNMPv3报文结构

SNMP报文中的主要字段定义如下:
- 版本:表示SNMP的版本,SNMPv3报文则对应字段值为2。
- 报头数据:主要包含消息发送者所能支持的最大消息尺寸、消息采用的安全模式等描述内容。
- 安全参数:包含SNMP实体引擎的相关信息、用户名、认证参数、加密参数等安全信息。
- Context EngineID:SNMP唯一标识符,和PDU类型一起决定应该发往哪个应用程序。
- Context Name:用于确定Context EngineID对被管理设备的MIB视图。
- SNMPv3 PDU:包含PDU类型、请求标识符、变量绑定列表等信息。其中SNMPv3 PDU包括GetRequest PDU、GetNextRequest PDU、SetRequest PDU、Response PDU、Trap PDU和GetBulkRequest PDU。
SNMPv3的体系结构SNMPv3提出了一个新的SNMP体系结构,这个体系结构为各种基于SNMP的NMS提供了一个通用的实现模型,即SNMPv3实体。SNMPv3实体可以分为SNMPv3引擎(SNMPv3 Engine)和SNMPv3应用程序(SNMPv3 Application),引擎与应用程序均由多个小模块组成。
SNMPv3实体这种模块化的结构有以下优点:- 适应性强:适用于多种操作环境,既可以管理最简单的网络,又能够满足复杂网络的管理需求。
- 方便管理:SNMP框架体系由多个功能相对独立的子系统或应用程序集合而成,因而可以很方便地对其进行管理。例如,若系统发生了故障,可以根据发生故障的功能类型,定位到相应的子系统。
- 扩展性好:通过SNMP实体,可以很方便地进行系统扩展。比如,为了应用新的安全协议,就可以在安全子系统中为其定义单独的模块,从而在SNMP中支持该协议。
SNMPv3由于采用了用户安全模块USM(User Security Model)和基于视图的访问控制模块VACM(View-based Access Control Model),在安全性上得到了提升。
SNMPv3的工作原理SNMPv3的实现原理和SNMPv1/SNMPv2c基本一致,唯一的区别是SNMPv3增加了身份验证和加密处理。下面以Get操作为例介绍下SNMPv3的工作原理。
假定NMS想要获取被管理设备MIB节点sysContact的值,使用认证加密方式,过程如图1-7所示:图1-7 SNMPv3的Get操作

NMS:向Agent发送不带安全参数的Get请求报文,向Agent获取Context EngineID、Context Name和安全参数(SNMP实体引擎的相关信息)。
Agent:响应NMS的请求,并向NMS反馈请求的参数。
- NMS:再次向Agent发送Get请求报文,报文中各字段的设置如下:
- 版本:SNMPv3版本。
- 报头数据:指明采用认证、加密方式。
- 安全参数:NMS通过配置的算法计算出认证参数和加密参数。将这些参数和获取的安全参数填入相应字段。
- PDU:将获取的Context EngineID和Context Name填入相应字段,PDU类型设置为Get,绑定变量填入MIB节点名sysContact,并使用已配置的加密算法对PDU进行加密。
Agent:首先对消息进行认证,认证通过后对PDU进行解密。解密成功后,Agent根据请求查询MIB中的sysContact节点,得到sysContact的值并将其封装到Response报文中的PDU,并对PDU进行加密,向NMS发送响应。如果查询不成功或认证、解密失败,Agent会向NMS发送出错响应。