SNMP(Simple Network Management Protocol)的学习

本文深入介绍了SNMP(简单网络管理协议)的基础知识,包括SNMP的版本、主要操作(Get、GetNext、Set等)、消息格式及MIB(管理信息库)的概念。同时,文章还详细解析了SNMPv1的消息格式,并通过实例展示了如何分析SNMP的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SNMP概要

SNMP(Simple Network Management Protocol)CCITT制订的网络管理协议,总共有三个版本:SNMPv1,SNMPv2,SNMPv3).目前, SNMPv1已经被广泛使用了,几乎所有的网络产品都提供对SNMPv1的支持, SNMPv2完全兼容SNMPv1,具有远程管理能力,它使管理人员可以将整个子网进行管理,而不是对整个子网内的设备进行管理,此外安全性方面也有重大提高。下面基于SNMPv1,介绍一下SNMP的基本知识.

首先,郑重声明:下面的介绍都是基于我的理解,如有错误和不妥之处请指正.

  一些基本概念

SNMPSimple Network Management Protocol:简单网络管理协议

它是一个标准的用于管理IP网络上结点的协议。此协议包括了监视和控制变量集以及用于监视设备的两个数据格式:SMIMIB

MIBManagement Information Base:管理信息库

由网络管理协议访问的管理对象数据库,它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。

SMIStructure of Management Information:管理信息结构

用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。

ASN.1Abstract Syntax Notation One:抽象语法定义

用于定义语法的正式语言,在SNMP中它用于定义SNMP协议数据单元和对象的格式。

PDUProtocol Data Unit:协议数据单元

在网络中传送的数据包。

BERbasic encoding rules:基本编码规则

CCITT (X.209)ISO (ISO 8825)指定的编码规则,它描述了如何ASN.1类型表示为字符串。

1.1    MIB介绍

简单的说.MIB就是一个按照SMI定义的一个树型结构.如下所示:

 

SMI就是告诉你这颗树怎么定义的一个规范.大家都用adventNet Web NMS,在代理端和管理站端可以加载很多MIB文件.那么这么多MIB文件和这个树结构是如何对应的呢?这些MIB文件之间主要有两种关系:一种是扩展关系;一种是添加子树.比如说,RFC 1213-MIBRFC 1158-MIB的扩展,也就是说RFC 1213-MIB定义的树包含了RFC 1158-MIB.一般来讲,你加载了RFC 1213-MIB,就不用加载RFC 1158-MIB.可以认为RFC XXXX-MIB定义了一棵基本树.而其他的MIB就是在基本树的某个节点下定义的一颗子树,比如在adventNet Web NMS加载Print-MIB就是在节点mib-2下添加了一棵子树.

 

 

1.2 SNMPv1的格式.

SNMP有五种操作:Get,GetNext,Set,GetResoponse,Trap. SNMP是一个简单的请求-响应协议。管理站发出请求,网元返回应答。其中:Get,GetNext,Set是管理站发给代理的请求, GetResoponse是代理发给管理站的. Get操作用于NMS从一个代理检索一个或多个MIB变量。GetNext操作用于管理站在一个代理中检索表中下一个变量的值。Set操作用于管理站在一个代理中设置MIB变量的值。如果代理可以提供一个GetGetNext操作中所有变量的值,或者可以设置Set操作中所有变量的值,它就返回一个GetResonse,通报管理站所有请求变量的值;否则, GetResonse返回请求变量的值为NULL,也就是说不返回值。此外代理可以通过Trap操作向管理站异步地通知发生的重要事件。

SNMPv1 PDU格式如下:

(a)    SNMP消息

 

(b)Get PDU,GetNext PDU,Set PDU,Response PDU

 

 

(c)Get PDU

 

 

(d) GetNext PDU

 

 

(e)Get Response PDU

 

 

(f)Set PDU

 

 

(g)Trap PDU

(h)variable-bindings

:以上的SNMP PDU格式为SNMPv1 PDU格式.

    

如上所示,SNMPv1消息分为头部和PDU单元.

SNMP头部包括两个字段:版本号和团体名.

  Version:标识使用的SNMP版本(0表示SNMPv1,1表示SNMPv2,2表示SNMPv3),代理直接抛弃与自己版本不同的SNMP消息.

  Community:使用的团体名.

团体名用于代理认证管理站是否具有相应的操作权限.一个代理上保存有多个团体名,每个团体对应着不同的操作权限.比如, 可能团体althy只允许对该代理进行GetGetNext操作,不允许进行Set操作,而团体tangtiboy既允许进行GetGetNext操作, 也允许进行Set操作.此外,不同的团体的MIB视域也可能不同,团体的MIB视域是代理本地MIB视域的一个子集,每个团体只允许对该团体的MIB视域内的对象进行操作.代理存储每个团体对应的所有管理站的IP地址,代理收到管理站的请求,判断团体名是否合法,如果合法,接下来核对发送请求的管理站的IP地址是否属于该团体..不同的管理站可以属于不同的团体.

PDU只有两种格式. Get PDU, GetNext PDU, Set PDU, GetResponse PDU的格式相同,只是Get PDU, GetNext PDU, Set PDUerror-status字段和error-index字段固定为零,这样做也体现了SNMPsimple.又是另外一种格式.

PDU type:标识PDU类型,0代表Get PDU,1代表GetNext PDU,2代表Set PDU,3代表GetResponse PDU,4代表Trap PDU.

error-status: GetResponse消息中指示在处理一个请求时发生了一个意外情况.其值可取:noError(0),tooBig(1),noSuchNane(2),badValue(3),readonly(4),genErro(5). Get PDU, GetNext PDU, Set PDU中此字段固定为零.

error-index:GetResponse消息中, error-status非零时,error-index指出是variable-bindings列表的哪个变量引起的错误,error-status为零时, error-index也为零. Get PDU, GetNext PDU, Set PDU中此字段固定为零.

variable-bindings:一列变量名(即请求的对象实例)和相应的值.Get 消息和GetNext 消息中,变量值应该设为NULL(事实上代理收到Get 消息和GetNext 消息时,会忽略值). Set消息中,变量值填入管理站设定的值. GetResponse消息中,error-status为零的情况下,返回所有请求变量的值,如果error-status不为零,返回变量值为空.

这里要说明的是Get,GetNext,Set操作都是原子的.对于Get,GetNext操作,如果variable-bindings列表中的一个变量的值无法成功获取,则代理返回的GetResponse消息variable-bindings列表中所有的值返回为NULL. .对于Set操作,如果variable-bindings列表中的一个变量的值无法成功设置, 则代理中所有相应的值都不改变,并且代理回应的GetResponse消息variable-bindings列表中所有的值返回为NULL.也就是说代理要么返回variable-bindings列表中所有的值,要么一个值也不返回.我最开始对这里有个疑问,就是要是Get,GetNext,Set操作有多个变量值不能成功获取或设置怎么办,那么GetResponse消息中error-index返回哪个变量的索引呢?这种情况是不会出现的,因为Get,GetNext,Set操作在遇到变量值不能成功获取或设置时就会停止,根本不会再去读取或设置variable-bindings列表中在它之后的变量值.

这里说明Trap PDU.

Enterprise:一个与网管系统有关的一个对象实例的值,指出产生陷阱的子系统.(???)

Agent-addr:产生陷阱的代理的IP地址.

Generic-Trap:预定义的陷阱类型.可能取值有如下7:

coldStart(0):异常重启,代理的配置和协议实体的实现改变(恢复默认值?).

warmStart(1):正常重启, 代理的配置和协议实体的实现不改变.

LinkDown(2):告知代理的一个通信连接失败.variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.

Linkup(3): 告知代理的一个通信连接已经正常.variable-bindings列表中第一个元素是接口的ifIndex实例的名字和值.

AuthenticationFailure(4):告知管理站收到一个认证失败的请求.

EgpNeighborLoss(5):告知管理站一个EGP邻居被标志为down.

EnterpriseSpecific(6):告知管理站发生了厂商自定义的特定陷阱,指出陷阱类型.

Specific-trap:更具体的指出厂商自定义的特定陷阱性质的代码.

Time-stamp:sysUptime

下面的流程图说明了代理收到管理站发送的请求消息后采取的相关操作.

   下面用etheralGetNextRequest消息为例来分析SNMP PDU的格式(可以参考ASN.1):

1.3 SNMP消息的协议分析

:红色字体为SNMP 消息,黑体是etheral的分析结果,下面是我给出的进一步分析.

其中,30 Identifier octets,表示SNMP 消息是ASN.1SEQUENCE类型;

26Length octets,表示SNMP 消息的长度是0X26;

020100表示版本号为SNMPv1(0):

02Identifier octets,表示version字段是ASN.1INTEGER类型;

01 Length octets,表示version字段的长度是1octet;

00Content octets,表示version字段的内容是0.

04067075626c6963表示团体名为public:

04Identifier octets,表示community字段是ASN.1OCTET STRING类型;

06 Length octets,表示community字段的长度是6octet;

7075626c6963 Content octets,”public”.ASCII.

a119表示PDU typeGetNextRequest(1):

a1Identifier octets,表示SNMP PDU的标签类型是Contect-specific,标签值为1(这里用标签值代表PDU type);

19 Length octets,表示SNMP PDU的长度是0X19octet;

02020099表示Request id0x00000099:

    02Identifier octets,表示Request id字段是ASN.1INTEGER类型;

02 Length octets,表示Request id字段的长度是2octet;

0099Content octets,表示Request id字段的内容是0x00000099.

020100表示error-statue0:

02Identifier octets,表示error-statue字段是ASN.1INTEGER类型;

01 Length octets,表示error-statue字段的长度是1octet;

00Content octets,表示error-statue字段的内容是0.

020100表示error-index0:

02Identifier octets,表示error-index字段是ASN.1INTEGER类型;

01 Length octets,表示error-index字段的长度是1octet;

00Content octets,表示error-index字段的内容是0.

30 0d 30 0b 06 07 2b 06 01 02 01 01 01表示variable-bindings的第一个变量的object identifier 1:1.3.6.1.2.1.1.1:

30 Identifier octets,表示variable-bindings列表是ASN.1SEQUENCE类型;

0dLength octets,表示variable-bindings列表的长度是0X0d;

30 Identifier octets,表示variable-name1 |variable-value1对是ASN.1SEQUENCE类型;

0bLength octets,表示variable-name1 |variable-value1对的长度是0X0b;

06Identifier octets,表示variable-name1字段是ASN.1OBJECT IDENTIFIER类型;

07 Length octets,表示variable-name1字段的长度是7octet;

2b 06 01 02 01 01 01代表1.3.6.1.2.1.1.1:

   2b代表1+3:1*40+3=0X2b;

   06 01 02 01 01 01对应关系很明显.

0500 表示variable-value1的值为NULL:

    05Identifier octets,表示variable-value1ASN.1NULL类型;

 00 Length octets,表示v variable-value1字段的长度是0octet;

 

0000   50 78 4c 70 c3 e3 00 0d 87 cb d9 d8 08 00 45 00  PxLp..........E.

0010   00 44 a7 4a 00 00 80 11 5e 8d 0a 0a 10 0f 0a 0a  .D.J....^.......

0020   10 af 0a ed 00 a1 00 30 5c 8c 30 26 02 01 00 04  .......0/.0&....

0030   06 70 75 62 6c 69 63 a1 19 02 02 00 99 02 01 00  .public.........

0040   02 01 00 30 0d 30 0b 06 07 2b 06 01 02 01 01 01  ...0.0...+......

0050   05 00                                            ..

其他4种消息的协议分析类似,不再细述.

 

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值