[网络技术] SNMP简单网络管理协议

2024-04-22 00:32

本文主要是介绍[网络技术] SNMP简单网络管理协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

简单网络管理协议(SNMP)首先是由Internet工程任务组织(Internet Engineering Task Force)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。许多人认为 SNMP在IP上运行的原因是Internet运行的是TCP/IP协议,然而事实并不是这样。

SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。

SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。

名字说明
MIB管理信息库
SMI管理信息的结构和标识
SNMP简单网络管理协议

从被管理设备中收集数据有两种方法:一种是只轮询(polling-only)的方法,另一种是基于中断(interrupt-based)的方法。

如果你只使用只轮询的方法,那么网络管理工作站总是在控制之下。而这种方法的缺陷在于信息的实时性,尤其是错误的实时性。你多久轮询一次,并且在轮询时按照什么样的设备顺序呢?如果轮询间隔太小,那么将产生太多不必要的通信量。如果轮询间隔太大,并且在轮询时顺序不对,那么关于一些大的灾难性的事件的通知又会太馒。这就违背了积极主动的网络管理目的。

当有异常事件发生时,基于中断的方法可以立即通知网络管理工作站(在这里假设该设备还没有崩溃,并且在被管理设备和管理工作站之间仍有一条可用的通信途径)。然而,这种方法也不是没有他的缺陷的,首先,产生错误或自陷需要系统资源。如果自陷必须转发大量的信息,那么被管理设备可能不得不消耗更多的时间和系统资源来产生自陷,从而影响了它执行主要的功能(违背了网络管理的原则2)。

而且,如果几个同类型的自陷事件接连发生,那么大量网络带宽可能将被相同的信息所占用(违背了网络管理的原则1)。尤其是如果自陷是关于网络拥挤问题的时候,事情就会变得特别糟糕。克服这一缺陷的一种方法就是对于被管理设备来说,应当设置关于什么时候报告问题的阈值(threshold)。但不幸的是这种方法可能再一次违背了网络管理的原则2,因为设备必须消耗更多的时间和系统资源,来决定一个自陷是否应该被产生。

结果,以上两种方法的结合:面向自陷的轮询方法(trap-directed polling)可能是执行网络管理最为有效的方法了。一般来说,网络管理工作站轮询在被管理设备中的代理来收集数据,并且在控制台上用数字或图形的表示方式来显示这些数据。这就允许网络管理员分析和管理设备以及网络通信量了。

被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。这些错误情况就是众所周知的SNMP自陷(trap)。

在这种结合的方法中,当一个设备产生了一个自陷时,你可以使用网络管理工作站来查询该设备(假设它仍然是可到达的),以获得更多的信息。

 

3.什么是被管理设备?

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>

你可能听说过许多关于“SNMP可管理设备”、“与SNMP兼容的设备”或者“被SNMP管理的设备”的说法。但是它们到底什么?它们与“智能设备”又是怎么区别的呢?

简单地说,以上所有说法的意思都是“一个包含网络管理代理实现的网络设备”。这些话也意味着这种代理支持SNMP协议来进行信息交换。正如前面所提到的,一个智能设备可能并不需要使用或支持SNMP协议。那么什么是一个代理呢?

  1. 代理

    管理代理(agent)是一种特殊的软件(或固件),它包含了关于一个特殊设备和/或该设备所处环境的信息。当一个代理被安装到一个设备上时,上述的设备就被列为“被管理的”。换句话说,代理就是一个数据库。

    数据库中所包含的数据随被安装设备的不同而不同。举例来说,在一个路由器上,代理将包含关于路由选择表、接收和发送包的总数等信息。而对于一个网桥来说,数据库可能包含关于转发包数目和过滤表等信息。

    代理是与网络管理控制台通信的软件或固件。在这个控制台的“链路”上可以执行以下任务:

  • 网络管理工作站可以从代理中获得关于设备的信息。
  • 网络管理工作站可以修改、增加或者删除代理中的表项,例如在由代理所维护的数据库中的路由选择表表项。
  • 网络管理工作站可以为一个特定的自陷设置阈值。
  • 代理可以向网络管理工作站发送自陷。

    请记住,在被管理设备中的代理并不是自愿提供信息的,除非当有一个阈值被超过的事件发生时。

    在一些偶然的情况下,在一个特定的设备上可能因为系统资源的缺乏,或者因为该设备不支持SNMP代理所需要的传输协议,而不能实现一个SNMP代理。这是否就意味着你不能监视这个设备呢?答案并不是这样的,在这种情况下并不是完全没有办法的。你可以使用受托代理(proxy agent),它相当于外部设备(foreign device)。

    受托代理并非在被管理的外部设备上运行,而是在另一个设备上运行。网络管理工作站首先与受托代理联系,并且指出(通过某种方法)受托代理与外部设备的一致性。然后受托代理把它接收到的协议命令翻译成任何一种外部设备所支持的管理协议。在这种情况下,受托代理就被称为应用程序网关(application gateway)。

    如果外部设备不支持任何管理协议,那么受托代理必须使用一些被动的方法来监视这个设备。举例来说,一个令牌环网桥的受托代理可以监视它的性能,并且如果它检测到任何由网桥所报告的拥挤错误时,它就会产生自陷。幸运的是,目前大多数网际互联设备类型都是支持SNMP可管理设备的,所以你可以很容易地使用一个SNMP可管理设备,例如集线器、网桥和路由器。有一些厂商甚至还在他们的网卡上提供SNMP代理。

  1. MIB

    我们通常很少把在一个被管理设备中的数据库称为一个数据库。在SNMP术语中它通常被称为管理信息库(MIB)。

    一个MIB描述了包含在数据库中的对象或表项。每一个对象或表项都有以下四个属性:

  • 对象类型(Object Type)
  • 语法(Syntax)
  • 存取(Access)
  • 状态(Status)

    在SNMP规范之一的管理信息结构与标识(SMI;RFC 1155/1065)规范中定义了这些属性。SMI对于MIB来说就相当于模式对于数据库。SMI定义了每一个对象“看上去象什么”。

  1. 对象类型

    这个属性定义了一个特定对象的名字,例如sysUpTime。它只不过是一个标记。在表示数据时,SMI使用了ASN.1(Abstract Syntax Notation One)。对象必须被“标识”。对于互联网络管理MIB来说,用ASN.1记法来表示的标识符开头如下:

        internet OBJECT IDENTIFIER : : = { iso org(3) dod(6) 1 }

或者用一种简单的格式:

        1.3.6.1

    这是从ASN.1文档中抽取的。它为标识符定义了一个树形的格式。该树是由一个根及与之相连接的许多被标记的节点组成。每一个节点由一个非负整数值和尽可能简明的文字说明所标识。每一个节点可能也拥有同样被标记的子节点。

    当描述一个对象标识符(OBJECT INDENTIFIER)时,你可以使用几种格式,最简单的格式是列出由根开始到所讨论的对象遍历该树所找到的整数值。     从根一级开始,这里有三个节点(如图):

  • ccitt(0)
  • iso(1)
  • joint-iso-ccitt(2)

    其中每一个“分支”都被标记中所示的管理组织所管理。

  1. 语法

    这个属性指定了数据类型,例如整数、8位组串数字(字符串;范围为0至255)、对象标识符(预先定义的数据类型别名)或NULL。NULL是留待的后使用的空位。

  1. 存取

    存取表明了这个特定对象的存取级别。合法的值有:只读、读写、只写和不可存取。

  1. 状态

    状态定义了这个对象的实现需要:必备的(被管理节点必须实现该对象);可选的(被管理对象可能实现该对象);或者已废弃的(被管理设备不需要再实现该对象)。

 

  1. 简单网络管理协议

    简单网络管理协议允许网络管理工作站软件与被管理设备中的代理进行通信。这种通信可以包括来自管理工作站的询问消息、来自代理的应答消息或者来自代理给管理工作站的自陷消息。

    为了保证因网络管理而带来的通信量是最小的(网络管理原则1),SNMP使用了一种异步客户机/服务器方法。这意味着一个SNMP实体(管理工作站或被管理设备)在发出一条消息后不需要等待一个应答;然而,除了自陷的情况以外应答都是要被产生的。如果需要的话该实体可以发送另一条消息,或者也可以继续它预先被定义的功能。SNMPv1实现起来很简单并且对资源占用不多,它只有5个请求/响应原语:

  • get-request
  • set-request
  • get-next-request
  • get-reponse
  • trap

    网络管理工作站可以把感兴趣的变量值提取到其应用程序中,只要发出get-request或get-next-request报文即可。前者是指定对象的读操作,后者则提供了一个树遍历操作符,便于确定一个代理进程支持哪些对象。网络管理工作站可以修改代理进程中的变量值,只要发出set-request报文即可。

    如果没有发生错误,代理进程可以用get-reponse原语回答这些请求。另外,利用trap原语,代理进程可以异步地发送告警给网络管理工作站,告诉它发生了某个满足预设条件的事件。

    实现中的经验和设计过程中的不断完善给SNMPv2带来了协议改进意见,即给网络管理工作站增加一个成块读操作get-bulk-request报文。当需要用一个请求原语提取大量数据(如读取某个表的内容)时就可以调用它以提高效率。SNMPv2也引进管理进程和管理进程之间的通信进行状况报告,为此增加了一条原语inform-request,并把get-response简化成更加合理的名称reponse。trap报文则已改为snmpv2-trap,并与所有的协议报文具有同样的格式。

4.巧妙而有效地管理你的网络

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>


网络管理的两种方法是积极主动(pro-active)的方法和被动反应(re-active)得分方法。在大多数的时间里,我们总是要对一个事件作出反应,但这并不是有效的网络管理。

 

在积极主动的方式中,你所有现存的资源都得到了充分使用。如果你有智能集线器,那么请你把它找出来。几乎所有现存的路由器都至少在MIB-I级别上支持SNMP协议。如果你不能确定的话,请你和厂商联系。

当管理网络时,你需要明确的第一件事情就是要知道什么时候网络出问题。但是,你怎样辨别网络出问题了呢?对于人类来说,你会寻找以下症状,你会检查体温和脉搏。你网络上的症状也可以被监视,例如带宽利用率随时间的变化、服务器和路由器上的CPU利用率及通常在网线上的错误量(你总有以下错误)。请你使用网络管理工作站来跟踪这些统计数据一段时间,不如说两个星期,并且统计出一天中不同时候的平均值。这将成为你的基准线(baseline)。

一个基准线就是一系列数字,这些数字反映出了一个“健康”的网络。对于人类来说,一个“正常而且健康”的体温是37度。这就是你区分一个人是否发烧的基准线。你也需要一个基准线来决定你的网络是否出了问题。通过监视被管理设备中的网络阈值设置,并且寻找故障的征兆,你就可以拥有一个提前报警的系统了。

5.相关网站

<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>

SNMP FAQ

        ftp://rtfm.mit.edu/pub/usenet/news.answers/snmp-faq/part1

        ftp://rtfm.mit.edu/pub/usenet/news.answers/snmp-faq/part2

SNMP WEB

        http://netman.cit.buffalo.edu/index.html

        http://snmp.cs.utwente.nl

        http://www.onramp.net/~cwk/net-manage.cgi

SNMP MAIL LIST

        snmp-request@psi.com

        snmpv2-request@tis.com

        snmpv3-request@tis.com

SNMP NEWS GROUP

        comp.protocols.snmp

        info.snmp

        comp.dcom.net-management

开源项目: SNMP4J

   

SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。
<script type="text/javascript"> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
 主页 http://www.snmp4j.org/

WMibBrowser_0_9_b.zip

 以snmp4j开发的mib浏览器

 http://download.csdn.net/sort/tag/snmp4j

好书推荐:

Visual C++开发基于SNMP的网络管理软件 

这篇关于[网络技术] SNMP简单网络管理协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924411

相关文章

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直