加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RFC1157学习方法小结

(2007-04-19 16:40:51)
 RFC1157是定义SNMP协议的最重要文档,有28页吧,在RFC文档中不算最长的人,但是看过一两遍后没有什么感觉,因为我们要从面到点,抓住一个要点,结合实际进行研究,就比

较好入门了。下面是我学习RFC1157的方法总结,分四步完成:1、RFC1157文档的获取、2、取其中一小部分GetRequest的定义作分析、3、利用SNIFFER PRO捕获一个get-request

包、4、用解码数据的方式对应定义。用这样的方法实现理论与实践的结合,下面是具体过程。
一、RFC1157文档的获取
我一般是到这个网站下载RFC文档:http://www.rfc-editor.org,RFC1157的下载地址如下:
http://www.rfc-editor.org/cgi-bin/rfcdoctype.pl?loc=RFC&letsgo=1157&type=ftp&file_format=txt,下载下来的是一个文本文件,我一般用UltraEdit打开。
二、我们取其中的一小部分,关于GetRequest的定义进行分析,通过阅读RFC1157文档,我们发现是逐级定义的,即先定义一个大的框架,然后再定义其中的具体细节,所以我们也

要从最上面的定义看起
    RFC1157-SNMP DEFINITIONS ::= BEGIN
     IMPORTS
          ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
                  FROM RFC1155-SMI;
     -- top-level message
             Message ::=
                     SEQUENCE {
                          version        -- version-1 for this RFC
                             INTEGER {
                                 version-1(0)
                             },
                         community      -- community name
                             OCTET STRING,
                         data           -- e.g., PDUs if trivial
                             ANY        -- authentication is being used
                     }
     -- protocol data units
             PDUs ::=
                     CHOICE {
                         get-request
                             GetRequest-PDU,
                         get-next-request
                             GetNextRequest-PDU,
                         get-response
                             GetResponse-PDU,
                         set-request
                             SetRequest-PDU,
                         trap
                             Trap-PDU
                          }
     -- the individual PDUs and commonly used
     -- data types will be defined later
                  GetRequest-PDU ::=
                      [0]
                          IMPLICIT SEQUENCE {
                              request-id
                                  RequestID,
                              error-status        -- always 0
                                  ErrorStatus,
                              error-index         -- always 0
                                  ErrorIndex,
                              variable-bindings
                                  VarBindList
                          }
                  VarBindList ::=
                          SEQUENCE OF
                              VarBind
                  VarBind ::=
                          SEQUENCE {
                              name
                                  ObjectName,
                              value
                                  ObjectSyntax
                          }
从中我们可以看到,一次GetRequest操作会得到SNMP的版本号,community(共内体的值),request-id,error-status,error-index,及后续的一些value值(比如OID值),具

体对应到对一台支持SNMP管理(如一台CISCO3550的交换机,IP地址为10.66.0.1)的设备进行一次GetRequest操作会得到哪些操作呢?我们可以试一下。
三、利用SNIFFER PRO捕获一个get-request包

 

其实我们就要对下面的这一堆数据进行解码
30 27 02 01 00 04 06 70 75 62 6c 69 63 a0 1a 02 02 04 12 02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 01 00 05 00
按照TLV(即Tag(标记)、Length(长度)、Value(值))的方法来看
30
27
30表示为结构类型,27为长度,16进制的27换算成十进制为39,用WORD的字数统计看一下,后面果然跟了39个数
02 01 00
02表示为整数类型
01表示后面跟的长度为1
00表示版本1(RFC1157)中有一段话
                          version        -- version-1 for this RFC
                             INTEGER {
                                 version-1(0)
就说明0表示版本1
04 06 70 75 62 6c 69 63
04表示为八进制字符串
06表示后面跟的长度为6
我们把后面跟的6个数转换为ASCII码,得到如下结果
16进制数
70 75 62 6c 69 63
ASCII码
p u b l i c
以上得到结果即为community的值,即public。
a0 1a
a0 表示为GetRequest
1a 长度 16进制的16转换为10进制为26,用WORD的字数统计看一下果然不错。
02 02 04 12
02表示为整数类型
02表示长度为2
0412是十六进制数,转化为十进制数是1042,跟显示的结果又吻合了。这就是request-id
下面应该跟error-status了
02 01 00
02 整数类型
01 长度为1
00 值为0
再下面是error-index
02 01 00
02 整数类型
01 长度为1
00 值为0
再往下又是一个结构类型
30 0e
30 结构类型
0e 十六进制的0e转换为十进制为14
30 0c
30 结构类型
0c  后面跟的长度为12
06 08 2b 06 01 02 01 01 01 00
06 对象标识符
08 后面跟的长度为8
2b 根据对象标识符的规则 十六进制数2b转换为十进制为43,第1位为1,第2位为3,加上后面的组合起来就是1.3..6.1.2.1.1.1.0,就是OID值。
最后05 00表示是NULL
以上我们通过一次解码过程了解RFC1157中GetRequest定义的实现方法,希望这个方法对大家了解RFC1157文档有所帮助。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有