snmp报文分析.docx

上传人:b****2 文档编号:24500788 上传时间:2023-05-28 格式:DOCX 页数:14 大小:29.29KB
下载 相关 举报
snmp报文分析.docx_第1页
第1页 / 共14页
snmp报文分析.docx_第2页
第2页 / 共14页
snmp报文分析.docx_第3页
第3页 / 共14页
snmp报文分析.docx_第4页
第4页 / 共14页
snmp报文分析.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

snmp报文分析.docx

《snmp报文分析.docx》由会员分享,可在线阅读,更多相关《snmp报文分析.docx(14页珍藏版)》请在冰豆网上搜索。

snmp报文分析.docx

snmp报文分析

SNMP报文格式分析

1.SNMP报文格式

1.1snmp简介

1.1.1snmp工作原理

SNMP采用特殊的客户机/服务器模式,即代理/管理站模型。

对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。

每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。

管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。

管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。

管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。

 

1.1.2snmp报文类型

SNMP中定义了五种消息类型:

Get-Request、Get-Response、Get-Next-Request、Set-Request和Trap。

 

1.Get-Request、Get-Next-Request与Get-Response 

SNMP管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。

Get-Next-Request用于和Get-Request组合起来查询特定的表对象中的列元素。

2.Set-Request 

SNMP管理站用Set-Request可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。

 

3.Trap 

SNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生,如接口UP/DOWN,IP地址更改等。

 

上面五种消息中Get-Request、Get-Next-Request和Set-Request是由管理站发送到代理侧的161端口的;后面两种Get-Response和Trap是由代理进程发给管理进程的,其中Trap消息被发送到管理进程的162端口,所有数据都是走UDP封装。

1.1.3snmp报文格式图

SNMP报文的形式大致如下图所示。

1.2snmp报文编码格式

SNMP(简单网络管理协议)是目前在计算机网络中用得最广泛的网络管理协议,它使用ASN.1(AbstractSyntaxNotationOne抽象语法表示法.1)来定义SNMP报文格式和MIB(ManagementInformationBase管理信息库)变量的名称。

1.2.1ASN.1

ASN.1是一种描述数据和数据特征的正式语言,它和数据的存储及编码无关。

根据ASN.1标准定义,数据类型分为:

a.简单数据类型:

 

boolean布尔值

null空

integer整型

real实数

octerstring八进制字符串

objectidentifier对象标识

ipaddressIP地址

timeticks时刻值等。

b.构造数据类型:

sequence序列

sequenceofset

setofchoice等。

构造数据类型提供一种或多种简单数据类型进行复合的方法。

1.2.2基本编码规则BER

在具体系统中,我们需要用具体的编码规则将ASN.1语法表示的抽象数据转换成具体的比特流。

SNMP使用的编码方法是BER(BasicEncodingRule)。

BER的数据都由三个域构成:

标识域(tag)+长度域(length)+值域(value)。

1.标识域Tag表示:

数据类型

编码十六进制表示

数据类型

编码十六进制表示

BOOL

0x01

INT

0x02

OCTSTR

0x04

NULL

0x05

OBJID

0x06

ENUM

0x0A

SEQ

0x30

SETOF

0x31

IPADDR

0x40

COUNTER

0x41

GAUGE

0x42

TIMETICKS

0x43

OPAQUE

0x44

GET

0xA0

GETNEXT

0xA1

GETResp

0xA2

SET

0xA3

TRAP

0xA4

 

2.长度域length表示

长度域用于指示后续的值域value的字节数。

但是这个长度域自身多长怎么确定呢?

SNMP使用的是变长表示法,这有点类似与UTF8的编码方式。

具体表示方法如下:

(1)如果值域的长度在0到127字节之间,那么就是一个字节来表示,即第一个最高位为0的时候,其值就代表了值域的长度。

(2)如果值域的长度在127字节以上,那么第一个字节的第一个bit位(为1)就用于指示值域的长度在127字节以上,后7个bit位(实际值)以及后续用于表示值域长度的字节数。

例如:

值域长度(十进制)

编码表示(十六进制)

解释

16

0x10

在0到127之间,直接表示

160

0x810xA0

0x81的二进制为10000001第一位表示其超过127,低7位表示后续还有一个字节来表示值域字节数。

0xA0表示值域的长度为160个字节。

1500

0x820x050xDC

第一个字节0x82表示后续还有两个字节表示值域长度,0x05DC的十进制值为1500

因为绝大部分情况下,值域的长度都在【0,127】区间内,所有这种表示方法最节约。

1.3snmp报文介绍

1.3.1SNMP首部

SNMP报文的首部指明了这个报文是SNMP协议报文,以及报文的字节数。

SNMP报文的第一个字节用于表示这是一个SNMP报文,就是0x30。

在第一个字节之后是一个长度域,用于告知后面的SNMP报文的总字节数(不包括前面的0x30和这个长度域所占的字节数)。

如下所示:

0x30

length

后面的内容,字节数为length....

标识域

长度域

值域

1.3.2SNMP版本表示

前三个字节是SNMP版本的内容。

0x02,0x01,0x01.

0x02是标识域,表示的是值域类型为Integer

0x01是长度域,表示后续值域的长度为1个字节

0x01是值域,表示版本为SNMPv2c。

SNMP版本

编码(十六进制)

V1

0x00

V2C

0x01

V3

0x02

1.3.3Community共同体表示

共同体部分这里一共占了8个字节。

如:

x04,0x06,0x70,0x75,0x62,0x6c,0x69,0x63

0x04是标识域,表示值域类型为(OCTSTR)

0x06是长度域,表示值域的长度为6个字节 

7075626c6963是值域的内容,是群体名public的assic码值

1.3.4PUD表示

这个部分内容比较多,但都是基于BER形式编码出来的。

内容举例如下:

a223020422708bd402010002010030153013060e2b060104018ca65e01010101010002012b

1.PDU类型

上面的第一个字节0xa2就是表示这个PDU的类型。

见下表

PDU类型编码

名称

0xA0

get-request

0xA1

get-next-request

0xA2

get-response

0xA3

set-request

0xA4

trap(notification)

0xA5

GetBulk(SNMPv2增加)

0xA6

Inform(SNMPv2增加)

2.PUD长度域

0xa2后一个字节是这个PUD的长度域,0x23表示后面的值域是35个字节。

3.get/set表示

SNMP应该说是有三种操作,get/set/trap,又可细分为上面表格中的5中PDU类型。

其中get和set有共同之处,这里先以get的来做说明。

(1)请求标识符RequestID

这是由管理进程设置的一个整数值。

代理进程在发送get-response报文时也要返回此请求标识符。

管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。

设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文。

举例:

020422708bd4

0x02是标识域,表示值域为整型数据

0x04是长度域,表示值域长度为4个字节

0x22708bd4是值域,就是一个整数而已。

(577801172)

(2)错误状态error-state

错误状态是用于告知管理进程,代理进程对其发出的请求的处理结果的状态的。

举例:

020100

0x02是标识域,表示值域为整型数据

0x01是长度域,表示值域长度为1个字节

0x00是值域,表示没有出错

错误状态的编码如下表所示:

编码

名字

说明

0

noError

一切正常

1

tooBig

代理无法将回答装入到一个SNMP报文之中

2

noSuchName

操作指明了一个不存在的变量

3

badValue

一个set操作指明了一个无效值或无效语法

4

readOnly

管理进程试图修改一个只读变量

5

genErr

某些其他的差错

(3)错误索引error-index

当出现noSuchName、badValue或readOnly的差错时(见上表),由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。

举例:

020100

0x02是标识域,表示值域为整型数据

0x01是长度域,表示值域长度为1个字节

0x00是值域,因为没有出错,所以这里为0

1.3.5变量绑定

变量绑定就是跟在错误索引后面的一系列变量。

这些变量同样也采取BER形式的编码规则。

在get或get-next报文中,变量的值应忽略。

1.3.6trap(notification)

PUD的类型如果不是上面的所述的get/set那就应该是trap(notification)类型了。

trap部分的编码字节流大致如下分布形式:

OID

trap类型

特定代码

时间戳

变量绑定…

1.OID:

第一个部分是指trap报文对应的网络设备的对象标识符。

此对象标识符肯定是在enterprise结点{1.3.6.1.4.1}下面的一棵子树上。

2.trap类型

此字段正式的名称是generic-trap,共分为下表中的7种。

trap类型

名字

说明

0

coldStart

代理进行了初始化

1

warmStart

代理进行了重新初始化

2

linkDown

一个接口从工作状态变为故障状态

3

linkUp

一个接口从故障状态变为工作状态

4

authenticationFailure

从SNMP管理进程接收到具有一个无效共同体的报文

5

egpNeighborLoss

一个EGP相邻路由器变为故障状态

6

enterpriseSpecific

代理自定义的事件,需要用后面的“特定代码”来指明

3.当使用上述类型2、3、5时,在报文后面变量绑定部分的第一个变量应标识响应的接口。

4.特定代码(specific-code)

指明代理自定义的时间(若trap类型为6),否则为0。

时间戳(timestamp)

指明自代理进程初始化到产生trap报告的事件发生所经历的时间,例如时间戳为1230表明在代理初始化后1230ms发生了该时间。

6.变量绑定(variable-bindings)

指明一个或多个变量的名和对应的值。

也是采用的BER编码规则。

1.4数据类型的编码表示

下面介绍一些变量类型的编码表示方法。

1.4.1Integer整型编码表示

整型数据的标识域编码是0x02,长度域不定,一般是1/2/4字节等。

整型数据的值域是带符号类型,最高位是符号位,采取补码的表示形式。

要注意的是,其是大端表示法(高地址存低位)。

1.4.2OID对象标识符编码表示

SNMP服务器维护的所有管理信息库(MIB)对象采用ObjectID表示,如,1.3.6.1.2.1.1.1表示MIB库中的设备描述SysDesc变量,其编码规则如下:

标识域编码为0x06,长度域根据情况而定,值域的编码比较复杂,如下所示。

1.首两个ID被合并为一个字节X*40+Y。

例如:

1.3合并为1x40+3= 43 = 0x2B

2.后续的ID,如果在区间[1,127]内,直接编码表示,如果大于127,那么按照下面(3)所述方法编码。

3.如果ID大于127,那么使用多个字节来表示。

a.这多个字节中除最后一个字节外,前面的字节最高位为1

b.这多个字节的最后一个字节的最高位为0

c.这里每个字节剩下的7个比特位用来表示实际的数值

例如201566这个数,用十六进制表示是0x03135e,那么用二进制表示是0001100 0100110 1011110。

注意上面是以7个比特位为单位进行分划的,现在我们来填充最高位。

将前面的最高位填1,最后一个最高位填0即可得到

10001100 10100110 01011110

用十六进制表示为0x8ca65e

1.4.3sequence组合类型

sequence表示其由多个数据组合而成,每一个数据也都还是采用的BER编码方法。

例如我们这里分析的数据包中就要一个sequence类型的数据,其值域又是有一个OID类型的数据和一个Integer类型的数据组合而成的。

见2.1实例。

2.分析报文

2.1get-next-request报文示例分析(a.hex)

先使用hexdump来查看一下获取到的报文内容。

(hexdump是一个很好用的十六进制分析工具)

o@o-pc:

~/snmpPUD$hexdump-Ca.hex

00000000302c02010104067075626c6963a11f02|0,.....public...|

000000100422708bd40201000201003011300f06|."p........0.0..|

000000200b2b060104018ca65e0101010500|.+......^.....|

0000002e

十六进制数据

解释

30

表示SNMP协议报文(整个报文是一个SEQUENCE)

2c

消息长度44字节(表示后面还有44个字节的内容)

020101

协议版本(2c)(前两个字节02表示INTEGER类型01是指1个字节长度,最后的01是值01)

04

参数类型(OCTSTR)

06

群体(community)名长度

7075626c6963

群体名public的assic码值

a1

PUD类型get-next-request

1f

snmppdu的长度为31个OctStr(后面的内容31字节)

020422708bd4

请求标识符RequestID

020100

表示error-state为0

020100

表示error-index为0

3011

表示后面变量绑定是SEQUENCE类型17个字节长度

300f

表示(变量名1

06

表示该字段是OID类型

0b

OID长度11字节

2b06010401

1.3.6.1.4.1(标识1.3被合并为2B)

8ca65e

201566(这也是根据规则转换得到的)

010101

1.1.1

0500

表示NULL

2.2get-response报文示例分析(b.hex)

报文内容:

o@o-pc:

~/snmpPUD$hexdump-Cb.hex

00000000303002010104067075626c6963a22302|00.....public.#.|

000000100422708bd40201000201003015301306|."p........0.0..|

000000200e2b060104018ca65e01010101010002|.+......^.......|

00000030012b|.+|

00000032

十六进制数据

解释

30

表示SNMP协议报文(整个报文是一个SEQUENCE)

30

消息长度48字节(表示后面还有48个字节的内容)

020101

协议版本(2c)(前两个字节0201表示INTEGER类型)

04

参数类型(OCTSTR)

06

群体(community)名长度

7075626c6963

群体名public的assic码值

a2

PUD类型get-response

23

snmppdu的长度为35个OctStr(后面的内容31字节)

020422708bd4

请求标识符RequestID

020100

表示error-state为0

020100

表示error-index为0

3011

表示后面变量绑定是SEQUENCE类型17个字节长度

300f

表示(变量名1

06

表示该字段是OID类型

0b

OID长度11字节

2b06010401

1.3.6.1.4.1(标识1.3被合并为2B)

8ca65e

201566(这也是根据规则转换得到的)

010101

1.1.1

00

表示.0即第一个实例\

 

(下面的值实际是节点1.3.6.1.4.1.201566.1.1.1.0的)

02012b

0201表示INTEGER类型1个字节,2b表示值(43)

0500

表示NULL

 

WelcomeTo

Download!

!

!

 

欢迎您的下载,资料仅供参考!

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1