SNMP Agent快速开发
 
网友:SmileWolf 发布于: 2007.08.02 16:06 (共有条评论) 查看评论 | 我要评论
 
                摘自  http://blog.csdn.net/vcbear/

网管SNMP Agent的快速开发
前言
概述:根据以前的项目经验,介绍一个SNMP网管代理的开发方案。重点是如何利用相关开发包/测试工具,屏蔽大部分低层细节,快速的实现网管代理。
范围:本文不全面讨论网管系统的业务实现,不着重介绍编程细节。重点在介绍Agent在网管系统里的作用和局限,以及使用相关开发包实现Agent时的一些技术难点。

关键字: 
u       SNMP
u       Agent
u       MIB
u       SMI
u       UCD-SNMP
u       LIBSMI

一:简单网管概念概述

所谓网管,一般是指对网络系统中的各种设备进行监测、分析与控制,从而保障整个网络系统可靠、有效地运行.网络管理员通过管理者与管理代理之间的交互通信而达到对网络进行管理的目的.
为了保证管理者与管理代理之间能正确地交换管理信息,需对管理信息作出定义和在两者之间达成一致协议.前者即是管理对象,有时简称为对象,管理对象的集合称为管理信息库MIB(Management Information Base),后者就是网管协议.目前,世界上使用最广泛的网管协议是基于TCP/IP的简单网络管理协议SNMP(Simple Network Management Protocol),该协议简单、易于实现且具有良好的可扩充性,是工业界事实上的网管协议标准.

SNMP协议现在有3个版本。
SNMPv1有5个基本原语
l         get-request 
l         set-request 
l         get-next-request 
l         get-reponse 
l         trap 
SNMPv2增加了两个原语
l         get-bulk- request 
l         inform-request
     SNMPv3主要是在安全上进行了加强。

二 网管系统软件结构概述
一个典型网管系统软件是由以下部分组成的

1:Manager: 
管理员使用的工作站,通过网管软件查看和分析网管数据。
2:Agent
   网管代理。网管代理一般分为两个功能模块和一个公用模块MIB库
2.1查询/设置模块
   此模块接受来自Manager的查询和设置指令,并根据指令处理相关数据,如将被查询的数据返回给Manager,或使设置的数据对相关Device生效。
   对于SNMP Agent,此模块至少需要实现以下协议接口:
l         get-request 
l         set-request 
l         get-next-request 
l         get-reponse 
2.2告警模块
告警模块将设备产生的告警发送给Manager。对于SNMP Agent.此模块至少需要实现Trap协议接口。
2.3 MIB
MIB(管理信息库)保存被管理设备的相关管理信息。在SNMP Agent里, MIB通常用文本文件格式保存。

一个MIB描述了包含在数据库中的对象或表项。每一个对象或表项都有以下四个属性:
l         对象类型(Object Type) 
l         语法(Syntax) 
l         存取(Access) 
l         状态(Status) 
    在SNMP规范之一的管理信息结构与标识(SMI;RFC 1155/1065)规范中定义了这些属性。SMI对于MIB来说就相当于模式对于数据库。
  
3 Device
  被管理设备,可以是一台一个进程,计算机,或者分布式的系统。这些设备负责产生和收集诸如配置,性能和业务数据以及告警,是网管数据的来源,同时负责原始数据的整理和统计。Device和Agent之间的交互协议可以不受SNMP协议限制,可以采用任何一种协议交换数据。
  
4: Agent设计
  可见Agent在网管系统结构的位置相当于管理器和被管设备之间的网关和协议转换器。对Agent的功能需求的范围应该为:
l         协议转换。将SNMP协议和被管设备之间的协议互相转换
l         转发请求。包括向被管设备转发查询,设置请求。向Manager转发设备产生的告警
l         通过MIB库维护被管设备的信息结构
l         对Manager提供一个统一的网管接口,无论被管设备有多复杂,对Manager来说只需要和Agent交互就可以获得所有被管设备的网管信息
l         不需要牵涉诸如轮巡,告警策略等网管业务逻辑。也不参与被管设备本身对网管数据的处理流程。这些由被管设备的网管业务逻辑层自行处理。
l         不需要对数据进行统计分析
l         不需要保存历史或实时网管数据
可见对于网管系统来说,Agent功能明确,结构相对简单,虽然必不可少但并非核心部件,并且SNMP Agent已经是事实上的工业标准,有大量的开发包帮助开发人员快速的实现Agent,可以让开发人员将精力投入到网管业务逻辑上。

三 开发工具介绍
3.1 UCD-SNMP
SNMP网管系统的开发包最出名的是开源项目UCD-SNMP(最新版本已经更名为NET-SNMP)。.
UCD-SNMP开发包提供了几乎所有SNMP网管开发所需要的资源
l         SNMP API。封装SNMP协议和网络接口细节。提供了方便调用的SNMP操作接口
l         MIB管理。提供了所有的典型MIB库。并可以将MIB库映射到进程内部,按MIB所定义的层次结构组织数据
l         扩展Agent的编程框架。屏蔽所有SNMP操作流程和细节,用户只需要接管格式化过的SNMP请求,编写网管业务代码。
l         相关工具,包括snmpget,snmpgetnext,snmpwalk,snmpbulkget,snmpbulkwalk,snmptable,snmpset,snmptrap,snmpinform,snmpdelta,snmptest,snmptranslate,snmpstatus,等等。
3.2       LIBSMI
LIBSMI同样也是开源的开发包,提供针对MIB库的一套功能函数 。可以很方便的解析和修改MIB。

关于如何使用UCD-SNMP开发包扩展Agent的资料见附件。这里就项目里出现的一些技术难点逐一介绍:
l         Q:为什么要使用LIBSMI?
A:首先介绍一下UCD-SNMP扩展Agent的编程框架:
一般资料介绍UCD-SNMP开发包时,都推荐使用mib2c脚本根据MIB库生成.C文件,此文件定义了一个静态的OID(Object ID,mib库里对每个元数据的索引方式)二维表,当接受到SNMP请求时根据所请求的OID从表里取出回调函数地址并调用。
在.c文件中,主要的元素就是一个这个变量结构指定实现对象的细节,采用类型结构variable2数组的形式,数组的每一行对应MIB树的一个对象,并以OID升序排列。例如,slanBasicSet的变量定义为:
struct variable2 slanBasicSet_variables[] = {
/*  magic number        , variable type , ro/rw , callback fn  , L, oidsuffix */
#define   SLANNAME              1
  { SLANNAME            , ASN_OCTET_STR , RWRITE, var_slanBasicSet, 1, { 1 } },
#define   SLANAGENTTYPE         2
  { SLANAGENTTYPE       , ASN_INTEGER   , RWRITE, var_slanBasicSet, 1, { 2 } },
#define   SLANAGENTSTATUS       3
  { SLANAGENTSTATUS     , ASN_INTEGER   , RONLY , var_slanBasicSet, 1, { 3 } },
};

这种做法有几个弊端:
  首先,实践中发现,mib2c脚本兼容性并不是很好,在不同的环境上可能无法运行。
  其次,用mib2c生成的.C文件里包含的是静态表,那么在更新mib库时,就需要重新生成.C文件以更新表结构。这样增加了开发的重复性,而且不利于部署和维护。
  最后,生成的静态表里,每个OID默认对应一个不同的回调函数,需要再每个回调函数里都写几乎相同的业务逻辑代码,这是不合理的。一般设计Agent,尤其被管设备并非简单的网络设备而是一个分布式业务系统时,Agent只起网络和协议Adapter请求dispatch的作用,所有的请求进来后,都是根据和设备的内部协议重新打包并分发并取得返回结果,发送给manager.这样所有的OID只需要对应同一个函数就可以了。

取代的方案是每次启动AGENT的时候,根据MIB库生成动态OID表,在生成
表的时候,按具体需求定义表数据,主要是回调函数。
   这时就需要用到LIBSMI(或其他MIB解析库,经实践,发现LIBSMI是最简单易用的)了。
l         Q: SNMP Agent的网络端口能否修改
A:SNMP Agent需要用到两个网络端口:查询/设置端口,默认是161。TRAP(告警)端口162。其中TRAP端口是由Manager决定的,Agent作为客户端向Manager的IP地址和端口发送TRAP。如修改成和Manager不符的端口将导致Manager收不到告警。
查询/设置端口是由Agent监听的。可以由Agent自行修改,但建议保持默认的161端口,因为这是工业标准的默认约定。如需修改此端口,必须告知Mananger端进行同步。

这两个端口上的数据协议都是无连接的UDP,如果网络结构比较复杂,必须考虑UDP包是否会被防火墙或网关丢弃。

l         Q: 使用UCD-SNMP的框架扩展Agent,其进程模式是怎样的。
A: 默认是单进程。这样在回调函数里不需要考虑太多的进程内同步问题。但是必须意识到单进程处理请求是串行的,每个请求必须快速被处理,否则可能产生严重的效率问题,或在Manager 端频繁出现超时现象。一般来说,虽然网管系统的压力并不会非常大,但在告警频繁或轮巡性能参数等业务时,必须考虑效率问题。

l         Q:在扩展Agent中,除了自定义MIB信息之外,是否可以使用系统原来的MIB信息?
A:可以。UCD-SNMP自带了标准定义的所有通用MIB库,只需要在初始化Agent的时候调用init_mib_all而不是只初始化自定义Agent

网络管理 SNMP基础知识的更多相关文章

  1. SNMP基础知识

    注:本篇博客并非原创,仅是学习笔记 1. 概述1.1 诞生背景1.2 SNMP简介1.3 版本1.4 术语1.5 网络结构1.6 MIB简介2. Linux的SNMP安装 1. 概述 1.1 诞生背景 ...

  2. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

  3. TCP/IP协议(一)网络基础知识

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  4. 网络基础知识、ASP.NET 核心知识(1)*

    为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...

  5. OSI七层模型基础知识及各层常见应用

       OSI Open Source Initiative(简称OSI,有译作开放源代码促进会.开放原始码组织)是一个旨在推动开源软件发展的非盈利组织.OSI参考模型(OSI/RM)的全称是开放系统互 ...

  6. 【RL-TCPnet网络教程】第2章 嵌入式网络协议栈基础知识

    第2章        嵌入式网络协议栈基础知识 本章教程为大家介绍嵌入式网络协议栈基础知识,本章先让大家有一个全面的认识,后面章节中会为大家逐一讲解用到的协议. 基础知识整理自百度百科,wiki百科等 ...

  7. 转:TCP/IP协议(一)网络基础知识

    转载:http://www.cnblogs.com/imyalost/p/6086808.html 参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知 ...

  8. TCP/IP协议(一)网络基础知识 网络七层协议

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  9. 二、tcp/ip基础知识

    一.TCP/IP的标准化 1.TCP/IP的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属 ...

随机推荐

  1. 给自己的小练习19-[kuangbin带你飞]专题九连通图

    没有写题解.补一波 Network of Schools 问题1:求有向图中入度为0的点个数 问题2:使得整个图变成一个联通分量 问题1直接缩点统计 问题2=max(入度为0的点,出度为0的点),注意 ...

  2. NOIP2017 宝藏 题解报告【状压dp】

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是 ...

  3. 洛谷 P1858 多人背包 解题报告

    P1858 多人背包 题目描述 求01背包前k优解的价值和 输入输出格式 输入格式: 第一行三个数\(K\).\(V\).\(N\) 接下来每行两个数,表示体积和价值 输出格式: 前k优解的价值和 说 ...

  4. 解题:CTSC 2017 吉夫特

    题面 首先有个结论:$C_n^m$为奇数当且仅当$m$是$n$的一个子集 于是从后往前推,记录每个数出现的位置,然后对每个位置枚举子集统计在它后面的贡献即可 #include<cstdio> ...

  5. SpringMVC <mvc:view-controller path=""/>标签

    <mvc:view-controller path=""/>标签的作用 对应WEB-INF目录下面的JSP页面,我们知道是不能直接使用URL访问到.需要通过转发的方式, ...

  6. php 修改图片分辨率

    <?php function resize_image($file, $w, $h, $crop=FALSE) { list($width, $height) = getimagesize($f ...

  7. C++ ------ 互斥锁、原子操作的性能测试

    atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等 测试程序 #include & ...

  8. phpstrom+xdebug+chrome+postman调试工具搭建

    php是解释性语言,大部分调试的时候使用var_dump+exit就可以搞定了,但是在大项目或遇到了负载的问题的时候你就需要断点调试.变量打印.性能分析了,php也有非常程序的解决方案,我们现在就动手 ...

  9. [DeeplearningAI笔记]序列模型1.1-1.2序列模型及其数学符号定义

    5.1循环序列模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.1什么是序列模型 在进行语音识别时,给定了一个输入音频片段X,并要求输出片段对应的文字记录Y,这个例子中的输入和输出都输 ...

  10. LeetCode-Insertion Sort List[AC源码]

    package com.lw.leet5; /** * @ClassName:Solution * @Description: * Insertion Sort List * Sort a linke ...