SNMP

【 以下文字转载自 Network 讨论区 】【 原文由mouse所发表 】
 

随着网络的迅速发展,根据实际需要人们已经并制定了很多网络管理手段和协议。
在计算机网络管理中SNMP(Simple Network Management Protocol 简单网络管理协议)
得到了广泛的应用。SNMP提供了一种监控和管理计算机网络的系统方法。SNMP的最大特
点就是其简单和易于实现,因而得到广泛应用。

§1 SNMP协议介绍
§1.1 SNMP协议
    SNMP是由一系列协议组和规范组成的,它们提供了一种从网络备上收集网络管理信
息的方法。利用SNMP可以远程收集设备管理数据和远程配置设备。自从1990年推出以来
,SNMP的应用迅猛增长,大多数的网络都支持它。SNMP的流行和快速增长主要是由于其
简单性。
    SNMP模型主要包括以下四个组成部分:管理节点,管理站,管理信息和管理协议。

    管理节点就是被管理的网络设备,可以是主机、路由器、网桥、打印机以及任何可
以与外界进行信息交流的设备,这些节点上都必须运行SNMP管理进程,也就是SNMP代理
(SNMP Agent)。每个代理都维护一个本地数据库来存放它的状态、历史并影响它的运
行。
    网络管理由管理站(SNMP Manager)完成。管理站就是运行管理软件对SNMP代理进
行网络管理的计算机,它与SNMP代理进行通信,发送命令并接受回答。所有的处理工作
都是在管理站上进行的,尽可能的减少了被管理设备(管理节点)受到的影响。从设计
角度考虑,SNMP的目的就是将被管设备中的代理设计得尽可能简单。
    为了使管理节点的管理信息规范化,SNMP极其详细地规定了每种代理应维护的确切
信息以及提供信息的确切格式。每个设备都有一个或多个变量来描述其状态,网络中的
所有变量及状态都存放在一个管理信息库MIB(Management Information Base)中。SN
MP就是管理站与代理之间通信使用的协议。大多数SNMP都是以查询-应答方式进行通信的

    SNMP的核心就是由代理管理并由管理站读写的对象集合。为了各厂家的设备之间能
够进行通信,需要使用一种标准的对象定义语言和编码规则。SNMP采用了抽象语法符号
ANS1(Abstract Syntax Notation One)。
    SNMP使用的一般方法是管理站向代理发一个请求,要求获取数据或者控制它改变它
的某个状态。理想状态下,代理只需要回答所要求的数据或者命令执行确认应答,数据
是用ANS1语法结构传送的,如果出错就返回出错信息。SNMP定了七种可以发送的请求信
息,比较常用的是Get-Request,Get-Next-Request,Set-Request和SnmpV2-Trap等。
§1.2 ASN1介绍
    SNMP模型的核心部分—MIB库对象集合—是使用抽象语法符号ASN1(Abstract Synt
ax Notation One)加以描述的。它具体地描述了管理节点(即Agent代理)上的SNMP对
象集合如何被管理站(Manager)进行读写操作和管理。为了使之能够具有通用性,ASN
1的语法是标准的、与提供方无关的。
    根据ASN1语法,MIB中的每个对象类型都被赋予一个对象标识符(Object Identifi
er),以此来命名对象。另外,由于对象标识符的值是层次结构的,因此命名方法本身
也能用于确认对象类型的结构。对象标识符是能够唯一标识某个对象类的符号。它的值
由一个整数序列构成。被定义的对象的集合具有树型结构,树根是引用ASN1标准的对象
。从对象标识符树的树根开始,每个对象标识符成分的值指定树中的一个分枝。如图1:

图1、ASN1结构树
    管理信息库(MIB)也是一个和ASN1树类似的树状结构,MIB中的每个管理对象都可
以用一个固定的标识(OID:Object Identifier)来代表,例如标识{.iso.identified
-organization.dod.internet.mgmt.mib-2……},或者用其对应的数字来表示就是{.1.
3.6.1.2.1……},比如表示系统内存大小的标识OID就是{.1.3.6.1.2.1.25.2.2.0}。具
体的ASN.1的表示请参见参考[1]。

§2 SNMP功能的实现
§2.1 相关概念
    SNMP变量名和编码在系统中是唯一的,在不同的系统中可以用相同的名字来表示不
通的变量。SNMP是在无连接服务的基础上工作,这种服务是由UDP和IP提供的。
    SNMP的管理站(Manager)到代理(Agent)之间的联系是建立在会话(Session)的
基础上的。每个会话代表着一个从管理站到代理的连接,一个管理站可以同时存在多个
会话与多个代理相连,并通过不同的会话来区分来自不通代理的信息数据。
    被监控的设备上都必须运行SNMP代理。SNMP代理是一个软件进程,侦听UDP端口161
上的SNMP消息。如果需要通过SNMP获取MIB本身不提供的其他信息,可以自行编写扩展S
NMP Agent程序并定义相关变量。
§2.2 功能实现
    SNMP定了七种可以发送的请求信息,在此介绍常用的几种。
    ·Get-Request:SNMP管理站向代理发出Get-Request请求UDP包,其中包含所要提取
对象的OID。代理收到这个UDP包后,根据对象OID读取相应对象的值,然后对管理站发G
et-Response应答。SNMP只允许提取MIB树中的叶子对象的值,不能只提供一个分枝的标
识来获取整个表或者行的对象值。但是可以将表中每行的各个对象OID放在Get-Request
中,一次获取一行对象的值。如果提取成功则所有值都返回,否则不返回任何值。
    ·Get-Next-Request:Get-Next-Request最重要的功能是表的遍历。Get-Next-Req
uest请求包和Get-Request包基本类似,它们具有相同的交换模式和格式。不同之处在于
,SNMP管理站向代理发出的Get-Request请求UDP包,其中的OID就是要取值的对象,而G
et-Next-Request请求UDP包中要取值的是其OID对应对象的下一个对象。因此要求代理必
须能够确定下一个管理对象的OID,保证被取值的对象能够被读取到而且只能取到一次。

    ·Set-Request:SNMP管理站向代理发出的Set-Request请求和Get-Request也具有相
同的交换模式和格式,但是Set-Request请求是用于设置对象的值而不是读取。因此在这
个请求中既有被管理对象的OID,也有将被赋予的值。代理使用Get-Response应答,如果
设置成功则请求中的所有变量都被设置,否则不设任何值。
    ·Snmp-Trap:SNMP管理站应代理的请求发出Snmp-Trap,它用于代理向管理站异步
地通报某个重要事件。
    由于UDP协议是非可靠的传输协议,如果SNMP消息丢失,只能由SNMP用户自己解决。

§3 代理(Agent)上的MIB库扩展
§3.1 Agent模块的实现:
    代理内核通过系统功能调用实现对一个SNMP对象进行读写操作,而具体的实现一个
功能模块基本上有三个条件:明确的MIB定义(可选),必须有一个头文件(.H文件)和
一个实现功能的源文件(.C文件)。
    MIB定义指的是与这个功能模块定义相对应的OID定义,即描绘出该功能模块的具体
含义,例如:
       MyAgent OBJECT IDENTIFIER::={enterprise 2345}
       MySystem OBJECT IDENTIFIER::={MyAgent 3456}
       MyString OBJECT-TYPE
         SYNTAX   Display String
         MAX-ACCESS  read-only
         STATUS   current
         DISCRIPTION  “String”
         ::={MySystem 1}
       MyInteger OBJECT-TYPE
         SYNTAX   Integer32
         MAX-ACCESS  read-only
         STATUS   current
         DISCRIPTION  “Integer32”
         ::={MySystem 2}
程序说明:
1、MyString的OID=.1.3.6.4.1.2345.3456.1,类型为DisplayString,描述为“String

   einteger的OID=.1..6.4.1.2345.3456.2,类型为Integer32,描述为“Integer32”

2、明确的MIB定义主要是对一个SNMP对象提供详细的解析说明,同时为OID值赋予一个方
便标识的标志,例如:下面的描述都为Agent的标识:
    .1.3.6.4.1.2345.3456.1
    iso.org.dod.internet.enterprise.MyAgent.MySystem.MyString
§3.2 Agent Server模块源文件:
    源文件对头文件的定义具体实现,它主要包括定义一个struct variablen类型变量
,一个注册点,将功能注册到MIB树中,具体实现SET/GET操作。主要完成三个任务:
    1、系统注册
    将扩展模块信息注册到SubTree(子树)的树型结构中。
    例如:example.c:
    struct variable2 example variables[]= {
      {EXAMPLESTRING,  ASN_OCTET_STR,  RONLY,  var_example,  1,  {1}},
      {EXAMPLESTRING,  ASN_OCTET_STR,  RWRITE,  var_example,  1,  {2}},
    }
    init_example(void) {
     register_mib(“example”,example_variables,variable2,example_variables_
oid);
    }
    通过OID号,将本模块的信息插入到SubTree的相应位置,管理系统通过查找本模块
在树中的位置,找到处理函数,执行处理函数来实现系统功能调用。
    struct vairableN结构的具体定义为:
    struct variableN{
     u_char   magic;   //passed to function as a hint
     u_char   typel    //type of variable
     u_short  acl;    //access control list for variable
     FindVarMethos *findVar   //function that finds variable
     u_char   namelen;   //length of name below
     oid   name[N];   //object identifier of variable
    }
    example_variables[]定义了magic的类型、访问属性、处理函数和它后段OID定义
    oid example_variables_oid定义处在MIB树中的位置,即前段的OID定义
    2、判断是否为一个存在的实例
    每一个MIB对象都有一个唯一的OID,但通过SNMP操作所访问的是每一个MIB对象的实
例,因此必须判断所访问的对象实例是否存在。
    系统提供两类通用函数判断:
   if (header_generic(vp, name, length, exact, var_len, write_method)==MATCH
_FAILED)
        return NULL;
   if (header_simple_table(vp, name, length, exact, var_len, write_method)==
MATCH_FAILED)
        return NULL;
    如果为了更迅速、准确的判断实例的存在必须自己编写函数。
    3、进行系统调用,执行相对操作,如下面的例程:
    var_example() {
     if (header_generic(vp, name, length, exact, var_len, write_method)==MAT
CH_FAILED)
        return NULL;  /*判断实例是否存在*/
     switch (vp->magic) {  /*根据要求进行系统调用*/
       case EXAMPLESTRING: return(“hello”);
       case EXAMPLEINTEGER: *write_methos=write_exampleint;
                          long_ret=42;
                          return(u_char *) &long_ret;
     }
    }
程序说明:
1、register_mib()将example_variables[]注册到MIB树中
2、header_generic()判断访问请求是否为本节点的有效实例
§3.3 Agent Server模块头文件
    头文件是对功能模块实现功能的具体说明,它应该是定义出功能模块的初始化函数
、GET实现函数、SET函数实现以及Magic number的定义。例如:example.h:
    extern void    init_example(void);
    extern FindVerMethod var_example;
    extern WriteMethod  write_exampleint;
    Magic number definitions;
    #define EXAMPLESTRING  1
    #define EXAMPLEINTEGER  2
程序说明:
1、init_example(void)
    初始化功能模块的设置,它主要实现把功能模块注册到MIB树中,同时指出Magic n
umber的处理方法和基本属性。
2、var_example
    实现GET操作,它主要实现对magic number的读操作,它的原型定义为:
    typedef u_char *(FindVarMethod) (struct variable *vp,
               oid   *name,
               size_t   *length,
               int   exact,
               size_t   *var_len,
               WriteMethod **write_method);
3、write_exampleint
    实现SET操作,它主要实现对magic number的写操作,它的原型定义为:
    typedef int (WriteMethod) (int action,
               u_char  *var_val,
               u_char  var_val_type,
               size_t   var_val_len,
               u_char  *statP,
               oid   *name,
               size_t   length);
4、EXAMPLESTRING为GET/SET操作的对象标志

§4 SNMP的发展
    SNMP最初是为了解决在Internet上的路由器管理问题提出的。其早期版本是SNMPv1
,最大特点是简单,容易实现且成本低。其它特点还有:可伸缩性,SNMP可管理绝大部
分符合Internet标准的设备;扩展性,通过定义新的“被管理对象”,可以非常方便地
扩展管理能力;“健壮性”(Robust),即使在被管理设备发生严重错误时,也不会影
响管理者的正常工作。但是当SNMP用于大型或者复杂网络时,它在安全和功能方面的不
足就变得明显了。为此IETF又提出了SNMPv2,在提高安全性和更有效地传递管理信息方
面加以改进,具体包括提供验证、加密和时间同步机制以及GETBULK操作提供一次取回大
量数据的能力等。
    现在已经出现了新的SNMPv3。它是一个扩展SNMP的框架,其主要扩展是在安全和管
理方面。SNMPv3使用与SNMPv1、SNMPv2相同的协议操作,例如Get、GetNext、Set、SNM
Pv2 Trap等。它使用了Reports(SNMPv2中定义了但没有使用),Reports提供了引擎到
引擎的通信并且是对程序透明的。SNMPv3定义了新的MIB以配置安全性、通知、代理服务
器转发以及基于试图的访问控制,它使用的信息格式有所不同,不过提供了对SNMPv1和
SNMPv2的支持。
    SNMPv3定义了一些新的术语,简要介绍如下:
    ·老版本中SNMP Manager和SNMP Agent在SNMPv3中称为SNMP实体。
    ·每个SNMP实体包含一个SNMP引擎,执行SNMP消息的处理以及安全性和访问控制。

    ·对于SNMPv3,当引用应用程序时,是引用SNMP实体中的应用程序。当前定义了五
种类型的应用程序:(1)命令生成器,生成SNMP命令以收集或设置管理数据;(2)命
令应答器,提供对管理数据的访问;(3)通知产生器,发出Trap或Inform消息;(4)
通知接受器,接受并处理Trap或Inform消息;(5)代理转发器,转发SNMP实体之间的消
息。其中,命令生成器和通知接受器就是SNMP Manager的组成部分,而命令应答器和通
知产生器则是SNMP Agent的组成部分。
    SNMPv3最重要的功能就是其安全性,它提供了强健的鉴别和数据加密方法,使得只
有被鉴别的各方才能通信,并保证消息的接受及时。
§5 结束语
    SNMP是基于IP的网管协议,是事实上的工业标准,广泛应用于计算机网设备的管理
。总的说来,SNMP简单、使用,已经成为事实上的管理规范。基于SNMP的网络具有很强
的生命力,新的管理信息库(如RDBMS MIB等)正在制订中。可以预见,SNMP将会在相当
长的时间内得到更充分的发展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值