snmp报文分析文档格式.docx
《snmp报文分析文档格式.docx》由会员分享,可在线阅读,更多相关《snmp报文分析文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
后面两种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与这个长度域所占的字节数)。
如下所示:
length
后面的内容,字节数为length、、、、
标识域
长度域
值域
1、3、2SNMP版本表示
前三个字节就是SNMP版本的内容。
0x02,0x01,0x01、
0x02就是标识域,表示的就是值域类型为Integer
0x01就是长度域,表示后续值域的长度为1个字节
0x01就是值域,表示版本为SNMPv2c。
SNMP版本
编码(十六进制)
V1
0x00
V2C
V3
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类型编码
名称
get-request
get-next-request
get-response
set-request
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
0x01就是长度域,表示值域长度为1个字节
0x00就是值域,表示没有出错
错误状态的编码如下表所示:
编码
名字
说明
noError
一切正常
1
tooBig
代理无法将回答装入到一个SNMP报文之中
2
noSuchName
操作指明了一个不存在的变量
3
badValue
一个set操作指明了一个无效值或无效语法
4
readOnly
管理进程试图修改一个只读变量
5
genErr
某些其她的差错
(3)错误索引error-index
当出现noSuchName、badValue或readOnly的差错时(见上表),由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。
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种。
coldStart
代理进行了初始化
warmStart
代理进行了重新初始化
linkDown
一个接口从工作状态变为故障状态
linkUp
一个接口从故障状态变为工作状态
authenticationFailure
从SNMP管理进程接收到具有一个无效共同体的报文
egpNeighborLoss
一个EGP相邻路由器变为故障状态
6
enterpriseSpecific
代理自定义的事件,需要用后面的“特定代码”来指明
3.当使用上述类型2、3、5时,在报文后面变量绑定部分的第一个变量应标识响应的接口。
4、特定代码(specific-code)
指明代理自定义的时间(若trap类型为6),否则为0。
时间戳(timestamp)
指明自代理进程初始化到产生trap报告的事件发生所经历的时间,例如时间戳为1230表明在代理初始化后1230ms发生了该时间。
6、变量绑定(vari