snmp从入门到开发详解

网络/协议

43人已加入

描述

  基于TCP/IP的网络管理包含3个组成部分:

  1) 一个管理信息库MIB(Management Information Base)。管理信息库包含所有代理进程的所有可被查询和修改的参数。RFC 1213[McCloghrie and Rose 1991]定义了第二版的MIB,叫做MIB-II。

  2) 关于MIB的一套公用的结构和表示符号。叫做管理信息结构SMI(Structure of Management Information)。这个在RFC 1155 [Rose and McCloghrie 1990] 中定义。例如:SMI定义计数器是一个非负整数,它的计数范围是 0~4294967295,当达到最大值时,又从0开始计数。

  3) 管理进程和代理进程之间的通信协议,叫做简单网络管理协议SNMP(Simple Network Management Protocol)。在RFC 1157 [Case et al. 1990]中定义。SNMP包括数据报交换的格式等。尽管可以在传输层采用各种各样的协议,但是在SNMP中,用得最多的协议还是UDP。

  S

  一、SNMP协议概述

  简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。 虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。

  二、SNMP的发展史

  SNMP经过了一个相对较长的发展过程,到目前为止一共经历了三个版本。当下使用最广泛是SNMPv2。

  1989年发布了第一个版本的SNMP,称为SNMPv1。

  1991年发布SNMP的一个补充---RMON(Remote Network Monitoring,远程网络监视)。RMON扩充了SNMP的功能,包括对LAN的管理以及对依附于这些网络设备的管理。注:RMON没有修改和增加SNMP协议本身以及SMI,只是增加了SNMP监视子网的能力,把整个子网当成一个个体来监视,提供了新的MIB库及相关的MIB行为。

  1993年SNMPv1的升级版被提出,SNMPv2。

  1995年SNMPv2正式发布,v2增加了SNMPv1的功能,并规定了如何在基于OSI的网络中使用SNMP。同时RMON于本年度扩展为RMONv2

     1998年SNMPv3发布,一系列文档定义了SNMP的安全性,并定义了将来改进的总体结构。SNMPv3可以和v2、v1一起使用。

  三、SNMP的工作原理

  SNMP采用特殊的客户机/服务器模式,即代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。

  SNMP的应用场景如图1所示:

  S

  管理站和代理端使用MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理请求MIB中定义的数据,代理端识别后,将管理设备提供的相关状态或参数等数据转换成MIB定义的格式,最后将该信息返回给管理站,完成一次管理操作。

  四、SNMP的报文类型

  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封装。SNMP工作流程如图2:

  S

  五、SNMP的报文格式

  SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。

  S

  在实际网络传输环境下,SNMP报文的长度取决于其所采用的编码方式。SNMP统一采用BER(Basic Encoding Rule)的编码规则,同时在正式SNMP规范中使用的是ASN.1语法,Abastract Syntax Notation v1,即抽象语法描述语言。这两个概念在后面实践环节再做进一步介绍,这里只要稍微了解一下即可,不妨碍我们对协议本身的分析。这里我们简单解释一下BER编码规则:

  BER作为ANS.1的基本编码规则,描述具体的ANS.1对象如何编码为比特流在网络上进行传输。BER编码规则由三部分组成:

  S

  SNMP中定义了几种基本的数据类型,其中v1和v2版有些改动,具体参见相应的RFC文档。这里我们只介绍几种最常见的类型:

  l INTEGER:一个整数

  l OCTER STRING: 0或多个8bit字节,每个字节在0~255之间取值

  l DisplayString:0或多个8bit字节,每个字节必须是ASCII码。在MIB-II中,所有该类型变量不能超过255个字符(0个字符可以)

  l NULL:代表相关的变量没有值

  l IpAddress:4字节长的OCTER STRING,以网络字节序表示IP地址

  l PhyAddress:6字节长的OCTER STRING,代表物理地址

  l Counter:非负整数,可以从0递增到232-1()。达到最大值后归0

  l TimeTicks:时间计数器,以0.01秒为单位递增,不同的变量可以有不同的递增幅度。所以在定义这种类型的变量时需要制定递增幅度

  l SEQUENCE:与C语言中的结构体类似

  l SEQUENCE OF:一个向量,参见后面ANS.1语法详细介绍章节

  SNMP报文在传输层是封装在UDP报文中的,而UDP又是基于IP网络的,因此,我们可以得到完整的报文描述结构,如下图所示:

  S

  PDU类型其实包含两个字节,第一个字节表示真实的PDU的类型;第二个字节表示后面报文所占的字节总数。针对SNMPv1,这个字段取值如下:

  表1 PDU类型

  PDU类型 名称代理进程对自己初始化

  1warmStart一个接口已从工作状态变为故障状态(报文中的第一个变量标识此接口)

  3linkUp从SNMP管理进程收到无效共同体的报文

  5egpNeighborLoss地址)

  6enterpriseSpecific《span times=“” new=“” roman“;=”“ mso-hansi-font-family:”times=“” roman“;mso-bidi-font-family:”times=“” mso-font-kerning:0pt“=”“ style=”word-wrap: break-word; font-size: 9pt; font-family: 宋体;“》在这个特定的代码段中查找trap信息

  通过wireshark抓包工具,捕获一条如下的SNMP报文,接下来对其进行仔细分析。

  S

  其余部分都为SNMP报文,接下来我们对照前面的报文结构体来逐个分析一下。

  S

  SNMPv2 Trap报文

  SNMPv2的Trap报文格式如图8所示:

  S

  同样的,这里除了trap类型和报文长度是标准网络字节序之外,其余协议字段也均为BER编码方式。可以看到v2版的trap报文正在向统一的报文格式发展,已经非常类似普通的SNMP请求、响应报文了。

  SNMPv2原始报文内容:

  S

  余下部分全为SNMP报文内容,这里我们做一下简单的约定:

  xx 标注类型;xx 标注长度;xx 标注真正的数据。

  这样一来上面这串原始数据就好分析多了J

  S

  管理信息库:MIB

  我们要扩展mib首先必须清楚mib是如何定义的,用的什么语言,有哪些约定,遵循哪些规则等等。这些基本东西掌握过后,我们就可以很轻松的来写自己的mib文件了。

  所谓管理信息库,或者MIB,就是所有代理进程包含的、并且能够被管理进程进行查询和设置的信息的集合,或者叫管理对象的集合,在RFC 1213 [McColghrie 和Rose 1991]中定义了MIB-II,即第二版的MIB库。MIB是采用SMI(RFC 1155)来定义的。SMI全称为Structure Management Information,管理信息结构。SMI规范定义了一个基本框架,使用框架内的规范可以定义MIB,而SMI同时又是ASN.1的一个子集,它主要约定了使用到的语法、类型、宏、数据格式等。

  本节知识相对来说有些枯燥,但是没办法,如果你要看懂mib的定义文件,并且能很灵活自如的对其进行扩展,那么这些基础是必须夯实的。俗话说“磨刀不误砍柴工”。

  S

  ASN.1语法

  ASN.1(Abstract Syntax Notification 1),抽象语法描述语言,是一种独立于机器的描述语言,用于描述在网络上传递的消息。在SNMP中ANS.1主要用于MIB的定义,另一方面也用于协议的定义。所以理解ASN.1是理解协议、读懂SNMP国际规范RFC、进行SNMP开发的前提。在SNMP开发中,不但要用ASN.1编写MIB文件,还要使用ASN.1中的BER进行编解码。

  ASN.1 可分为两个部分:

  1)语法规则:从数据类型、内容顺序或结构等方面来描述消息的内容

  2)编码规则:如何编码、解码实际消息中的数据

  语法部分用于对数据结构、类型、顺序进行描述。编码则将语法部分描述的数据进行编码,变为二进制比特流,以便在网络上传输,或反方向地将接收到的数据流进行解码。这使得编码流可以跨平台、跨设备进行传输。

  ASN.1的记法规则,ASN.1的结构、类型和取值的表示方法和编程语言的表示法相似:

  1)多个空格和空行都看作是一个空格。

  2) 注释用成对的连字符(--)在注释的每行开始处表示,或者将一对连字符用在注释的开始处和注释行结束的结尾处。

  3)标识符(取值和字段的名称)、类型引用(类型的名称)和模块名称由大写字母、小写字母、数字和连字符组成。

  4)标识符、类型引用或模块名以由大写字母开始。

  5) 内建类型都由大写字母组成。内建类型一般用作标准表示法提供的类型。

  6)Octet(字节)表示一个8bit的无符号整数。bit8表示最高位,bit1标识最低位。下列元语用于定义ASN.1符号:

  BIT 类型和值用等宽字体表示。它通畅表示一个十六进制的字节值。

  n1 粗斜体表示变量

  [] 粗的方括号标示该值为可选项

  {} 粗的大括号表示一组相关项。

  | 粗体竖杠表示一组之中的内容可任选其一。

  … 粗体省略号表示重复出现

  = 粗体等号,用一个子项表示该项

  一、ASN.1术语

  1、抽象语法(Abstract Syntax)

  2)描述通用数据结构

  允许定义数据类型和值

  2、数据类型(Data Type)

  值的集合,可以是简单类型或结构类型可以对数据类型命名

  3)编码(Encoding)

  用于表示数据值的字节序列

  4、编码规则(Encoding Rules)

  给出从一种语法到另一种的映射方法

  5、传输语法(Transfer Syntax)

  位模式(Bits pattern):描述数据是在传输时是如何表示的

  二、ASN.1模块定义

  模块(module)是ASN.1规范中的基本构造块,定义一个名为modulereference的模块,其格式如下:

  S

  其中:EXPORTS 这个模块中的定义可能被其他模块引入,用的比较少;IMPORTS 定义将要由其他模块引入的对象或子模块;AssignmentList 这个模块中将定义类型分配、值分配及宏定义。

  三、ASN.1数据类型

  1、基本类型:

  ASN.1语法中有六种基本类型,分别如下,基本已经做到见名知意了:

  BOOLEAN,INTEGER,ENUMERATED,REAL,BIT STRING,OCTET STRING

  2、字符串类型(ISO10646-1的子集):

  S

  3、对象类型:

  OBJECT IDENTIFIER

  ObjectDescriptor:一个任意长的非负整数序列,用于标记对象(如算法等)

  4、其它类型:

  NULL 空值

  UTCTime: yymmdd hhmm[ss]

  GeneralizedTime:yyyymmdd hhmm[ss] ,强制始于2050年

  四、ASN.1类型定义

  ASN.1灵活之处在于,除了它内置的一些数据类型外,用户还可以自定义自己想要的任何类型,一般都是通过现有类型来组合来实现。

  S

  上面的定义过程中,INTEGER太常见了,就用Counter来作为它的一种别名,注意是一种,以后就可以用Counter来定义新变量了。同理,IpAddress就是OCTE STRING类型一种别名。

  五、ASN.1子类型定义

  子类型是在类型的定义基础上增加更明确限制条件,如设定新类型的取值范围,缺省值等等。

  S

  这样定义过后,以后用Counter定义的任何变量都被限定大于0小于65536。IpAddress定义变量长度都是4字节,等等。

  六、ASN.1赋值

  赋值在MIB库文件中的定义是最常见的一部分。

  S

  七、ASN.1的结构体类型

  S

  S

  S

  八、ANS.1标签类型

  标签用于区分不同的类型,并且在结构类型SEQUENCE和SET中,组件类型可能引起混淆,可以为它们的组件(分量)指定Context-specific标签,清晰指示组件的类型。除了CHOICE和ANY外,每种ASN.1类型都有一个标签,由一个类和一个非负的标签数组成。标签值可以唯一区分ASN.1类型。也就是说,ASN.1类型的名字并不影响它的抽象含义,只有标签才有这个作用。

  标签用在编码中,可以唯一地标示类型,便于编码。ASN.1提供了4中标签:

  1)Universal:标识ISO和ITU定义的类型,ASN.1定义的类型均有Universal值,该值在所有的程序里都一致。

  2)Application:应用程序自定义类型。本标识可以唯一地标识自定义类型。类型名在ASN.1中可以相同,所以Application就成为唯一标识自定义类型的方法。类型的含义由制定者自己定义。例如:

  S

  Private:该类型的含义根据具体的企业而不同。Private标识不会被用在国际规范中。企业提供的程序一般经常使用application和context-specific标识。在特殊场合下,一个企业的技术规范想要扩展成为一个国际规范时,使用private标识在企业规范成为国际规范的过程中可以较好地保护该企业的规范。例如:

  CompanyNumber ::=[PRIVATE 2] INTEGER

  companyNumber CompanyNumber ::=5651

  Context-specific:专用于结构类型中。该类型的含义根据给定的结构类型而不同。对于SET和SEQUENCE,为了避免里面的组件混淆,一般情况下给予不同的Context-specific标签。如:

  S

  九、宏定义

  ASN.1提供一种用户可以将符号扩展为自己使用的或别人使用的符号的机制,这就允许设计者去扩展语言定义一个“对象”,比如定义一个调制解调器或定义一个交换机。这些对象有普通的ASN.1属性和条件属性,比如父母和物理位置等。例如一个一部的调制解调器可以以普通调制解调器作为父类,从父类处继承属性。使用ASN.1可以定义为:

  S

  PS:宏在1994年从ASN.1中移除,取而代之的是Information Object Class。2002年X.680和X.690系列标准中已经使用Information Object Class代替。SNMPv1在1990年发布,所以SNMPv1中使用ASN.1宏。而SNMPv2 SMI的RFC中明确指出,SNMPv2中使用1998版ASN.1,所以SNMPv2还是使用ASN.1中的宏定义管理对象和通告。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • S

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分