基于SNMP/MIB的网络数据获取系统设计与实现(二)

4),SNMP的基本原理

一个SNMP管理的网络包含三个主要部分: 被管理设备、代理和网络管理系统(NMSs.1-1 描述了这三个组成的关系。

 

1-1SNMP被管理网络包含被管理设备、代理和网络管理系统

一个被管理设备是一个包含一个SNMP代理并处于被管理的网络中的一个网络结点。被管理设备收集和存储管理信息,并使用SNMP使这些信息对网络管理系统有用。被管理设备有时被称为网络元素,可能是路由器和访问服务器,交换机和网桥,集线器,计算机主机或打印机。

网络管理系统执行应用程序监控被管理设备。网络管理系统为网络管理提供大量的处理和内存资源。在任何被管理的网络中至少存在一个网络管理系统。

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

  数据库中所包含的数据随被安装设备的不同而不同。举例来说,在一个路由器上,代理将包含关于路由选择表、接收和发送包的总数等信息。而对于一个网桥来说,数据库可能包含关于转发包数目和过滤表等信息。代理是与网络管理控制台通信的软件或固件。在这个控制台的“链路”上可以执行以下任务:网络管理工作站可以从代理中获得关于设备的信息。

网络管理工作站可以修改、增加或者删除代理中的表项,例如在由代理所维护的数据库中的路由选择表表项。网络管理工作站可以为一个特定的自陷设置阈值。 可以向网络管理工作站发送自陷。请记住,在被管理设备中的代理并不是自愿提供信息的,除非当有一个阈值被超过的事件发生时。 在一些偶然的情况下,在一个特定的设备上可能因为系统资源的缺乏,或者因为该设备不支持SNMP代理所需要的传输协议,而不能实现一个SNMP代理。这是否就意味着你不能监视这个设备呢?答案并不是这样的,在这种情况下并不是完全没有办法的。你可以使用受托代理(proxy agent),它相当于外部设备(foreign device)。  

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

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

2,管理信息库MIB

每个受管理的SNMP设备均维护包含统计信息及其他数据的数据库。我们称之为管理信息基或MIB MIB的每一项包含一种信息:对象类型、语法、访问字段及状态字段等。 MIB的项通常由协议规定,并且严格遵守抽象语法规则1(ASN.1)的格式。

对象类型为项的名称,通常为简单的名字。语法是一个值字段,通常为字符串或整型,并不是所有的MIB的项均包含值字段。访问字段用于定义项的访问权限,通常有以下四类:只读、可读/写、只可写或不可访问。状态字段包含指示值,标明MIB项是否为命令、可选或作废。命令表示受管理的设备必须执行该项。可选表示受管理的设备可以选择执行该项,作废表示不执行。

目前执行的MIB有两种,MIB-1MIB-2。两者结构不同,MIB-1创建于1988年,其表中包含114项,分为两组,支持MIB-1的受管理的设备必须支持所有的适用于该设备的组。例如:受管理的打印机不能执行处理外部网关协议的项,与外部网关协议 (EGP)相关的项用于路由器或类似的设备。打印机需要指明它可处理的项。

MIB-2MIB-1的扩展,于1990年提出。它包含171项共分为10组。除了扩展了原有的组外,又新增加了组。与MIB-1类似,支持MIB-2的设备必须执行所有适用于该类型的组。用户将会发现许多设备仅支持MIB-1而不支持MIB-2

除了MIB-1MIB-2外,还有许多正在测试的MIB,它们包含许多不同的组和项。但它们并未被广泛使用。某些公司开发 MIB以供自己使用,某些厂商也提供对这些 MIB的支持。

3画的是管理信息库的一部分,它又称为对象命名(object naming tree)。

1-2 管理信息库的对象命名举例

对象命名树的顶级对象有三个,即ISOITU-T和这两个组织的联合体。在ISO的下面有4个结点,其中的饿一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是Internet(标号是1)。在只讨论Internet中的对象时,可只画出Internet以下的子树(图中带阴影的虚线方框),并在Internet结点旁边标注上{1.3.6.1}即可。

Internet结点下面的第二个结点是mgmt(管理),标号是2。再下面是管理信息库,原先的结点名是mib1991年定义了新的版本MIB-II,故结点名现改为mib-2,其标识为{1.3.6.1.2.1},或{Internet(1) .2.1}。这种标识为对象标识符。

MIB-I中定义了114种管理对象,并分为8个组,分别为system,interface,at,ip,icmp,tcp,udp,egp组。MIB-IIMIB-I兼容,电脑但增加了三个新的管理对象。分别时cmot组,transmission组和snmp组,其中:

 

1)        system:有关系统的整体信息。

2)        interface: 关于每一个从系统到子网接口的信息。

3)        at: (地址转换,被替换):Internet到子网地址映射地址转化表的描述。

4)        icmp: 与系统种ICMP实现与执行经历有关的信息。

5)        tcp:与系统TCP实现和执行经历有关的信息。

6)        udp:与系统UDP实现和执行经历有关的信息。

7)        egp:与系统EGP实现和执行经历有关的信息。

8)        dot3(传输):有关每个系统接口的传输方案和访问协议的信息。

9)        snmp:与系统SNMP实现和执行经历有关的信息。

 下面介绍几个重要的几个组:

1-1system

对象

语法

访问

说明

sysDescr

DisplayString

RO

对硬件,操作系统等实体的说明

SysObjectID

OBJECT

IDENTIFIER

RO

实体包含的网络管理子系统的供应商授权身份

sysUpTime

TimeTicks

RO

自系统的网络管理部分最近一次重启的时间

sysContact

DisplayString

SIZE(0…255)

RW

被管理节点联系人的身份和联系信息

System

DisplayString

SIZE(0…255)

RW

在管理商赋予被管理节点的名称

SysServices

INTEGER(0…127)

RO

该节点的物理位置

SysLocation

DisplayString

SIZE(0…255)

RW

该节点的物理位置

 

1-2Interfaces

<td style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #f4f4f4; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #f4f4f4; width: 53.4pt; padding-top: 0cm; border-bottom: wi

对象

语法

访问

说明

ifNumber

INTEGER

RO

网络接口的数量

ifTable

SEQUENCE OF ifEntry

NA

接口条目的列表

ifIndex

INTEGER

NA

每一个接口的唯一取值

ifDescr

DisplayStringSIZE(0`255)

RO

关于接口的信息,包括制造商的名称,产品名称和硬件接口版本

ifType

INTEGER

RO

接口的类型,按照物理,链路协议进行区分

ifMtu

INTEGER

RO

最大协议数据单元的大小。按字节算

ifSpeed

Gauge

RO

接口的当前数据速率容量的估计

ifPhysAddress

PhysAdress

阅读更多

java 基于SNMPMIB网络数据获取系统设计实现

03-14

/**************************************************************rn*rn* MibExplorer.javarn*rn* This application allows you view the MIB tree you loaded,rn* get value from,or set value to some equipments in networksrn* that are running SNMP agent process.rn*rn* Author: HEJIErn* Parameter: Nonern* Returns: Nonern* Creation date: 1/3/2007rn* LastUpdate: Nonern*rn**************************************************************/rnrnimport com.adventnet.snmp.beans.*;rnimport com.adventnet.snmp.ui.*;rnimport com.adventnet.snmp.mibs.*;rnimport java.io.*;rnimport java.awt.*;rnimport java.awt.event.*;rnimport javax.swing.*;rnimport javax.swing.event.*;rnrnpublic class MibExplorer extends JFrame implements ActionListenerrnrn Container contentPane=getContentPane();rn JMenuBar menub=new JMenuBar();rn JMenu files=new JMenu("File");rn JMenu opera=new JMenu("Operation");rn JMenu help=new JMenu("Help");rn JMenuItem save=new JMenuItem("Save Result As...");rn JMenuItem exit=new JMenuItem("Exit");rn JMenuItem get=new JMenuItem("Get");rn JMenuItem getNext=new JMenuItem("GetNext");rn JMenuItem set=new JMenuItem("Set");rn JMenuItem about=new JMenuItem("About");rn rn JLabel hostL=new JLabel("Host:");rn JLabel portL=new JLabel("Port:");rn JLabel communityL=new JLabel("Community:");rn JLabel writeCommL=new JLabel("Write Community:");rn JLabel setValueL=new JLabel("Set Value:");rn JLabel oidL=new JLabel("ObjectID:");rn JLabel descrL=new JLabel("Descricption:");rn JTextField host=new JTextField("127.0.0.1");rn JTextField port=new JTextField("161");rn JPasswordField community=new JPasswordField("public");rn JPasswordField writeComm=new JPasswordField("public");rn JTextField setValue=new JTextField();rn JTextField oid=new JTextField(".1.3.6.1.2.1.1.1.0");rn JTextArea descr=new JTextArea();rn JButton getB=new JButton("Get");rn JButton getNextB=new JButton("GetNext");rn JButton setB=new JButton("set");rn JButton getTableB=new JButton("GetTable");rn JButton clear=new JButton("Clear");rn JTextArea mess=new JTextArea();rnrn rn MibExplorer()rn rn super("--Simple MibExplorer--");rn int x,y;rn Dimension size=Toolkit.getDefaultToolkit().getScreenSize();rn x=(size.width-750)/2;rn y=(size.height-500)/2;rn setSize(750,500);rn setLocation(x,y);rn setResizable(false);rn setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);rn //setVisible(true);rn rn rn void init()rn rn //主界面初始化rn files.setMnemonic('F');rn opera.setMnemonic('O');rn help.setMnemonic('H');rn save.setMnemonic('S');rn exit.setMnemonic('X');rn get.setMnemonic('G');rn getNext.setMnemonic('N');rn set.setMnemonic('E');rn about.setMnemonic('A');rn //为控件添加助记符rn save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));rn get.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,InputEvent.CTRL_MASK));rn getNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));rn set.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_MASK));rn //为控件添加快捷键rn files.add(save);rn files.addSeparator();rn files.add(exit);rn opera.add(get);rn opera.add(getNext);rn opera.addSeparator();rn opera.add(set);rn help.add(about);rn menub.add(files);rn menub.add(opera);rn menub.add(help);rn setJMenuBar(menub);rn rn save.addActionListener(this);rn exit.addActionListener(this);rn about.addActionListener(this);rn rn mess.setForeground(Color.blue);rn mess.setEditable(false);rn descr.setEditable(false);rn //mess.setLineWrap(true);rn //descr.setLineWrap(true);rn get.addActionListener(this);rn getB.addActionListener(this);rn getNext.addActionListener(this);rn getNextB.addActionListener(this);rn getTableB.addActionListener(this);rn set.addActionListener(this);rn setB.addActionListener(this);rn clear.addActionListener(this);rn //添加事件侦听器rn descr.setBackground(new Color(220,220,220));rn rn JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,mibTreePane(),componentPane());rn getContentPane().add(splitPane);rn rn update(getGraphics());rn rn rn JPanel mibTreePane()rn rn //此方法利用Adventnet SNMP API的MibTree等类,装载MIB模型,显示MIB树,rn //程序运行后可看到效果rn MibOperations mibOps = new MibOperations();rn MibTree mibTree;rn try rn rn mibOps.loadMibModules("RFC1213-MIB");rn rn catch (Exception ex) rn rn System.err.println("Error loading MIBs: " + ex);rn rn mibTree=new MibTree(mibOps);rn TreeSelectionListener listener = new TreeSelectionListener() rn public void valueChanged(TreeSelectionEvent e) rn Object selected = e.getPath().getLastPathComponent();rn if (selected instanceof NodeData) rn Object obj = ((NodeData)selected).getUserObject();rn if (obj instanceof MibNode)rn rn oid.setText(((MibNode)obj).getNumberedOIDString());rn descr.setText(((MibNode)obj).getDescription());rn descr.setCaretPosition(0);rn rn rn rn ;rn mibTree.getTree().addTreeSelectionListener(listener);rn return mibTree;rn rn rn JPanel componentPane()rn rn //具体的界面布局设置,主要用到了GridBagLayout网格包布局管理器rn JPanel jp=new JPanel();rn JPanel jp2=new JPanel();rn JScrollPane sp1=new JScrollPane(mess);rn JScrollPane sp2=new JScrollPane(descr);rn rn jp2.setLayout(new GridLayout(1,5));rn jp2.add(getB);rn jp2.add(getNextB);rn jp2.add(getTableB);rn jp2.add(setB);rn jp2.add(clear);rn rn GridBagLayout gridbag=new GridBagLayout();rn GridBagConstraints constraints=new GridBagConstraints();rn jp.setLayout(gridbag);rn rn constraints.fill = GridBagConstraints.BOTH;rn constraints.insets = new Insets(2,4,2,4);rn rn gridbag.setConstraints(hostL,constraints);rn gridbag.setConstraints(portL,constraints);rn gridbag.setConstraints(communityL,constraints);rn gridbag.setConstraints(writeCommL,constraints);rn gridbag.setConstraints(setValueL,constraints);rn gridbag.setConstraints(oidL,constraints);rn gridbag.setConstraints(descrL,constraints);rn rn constraints.gridwidth=2;rn constraints.weightx=1;rn rn gridbag.setConstraints(host,constraints);rn gridbag.setConstraints(community,constraints);rn gridbag.setConstraints(setValue,constraints);rn rn constraints.gridwidth=GridBagConstraints.REMAINDER;rn rn gridbag.setConstraints(port,constraints);rn gridbag.setConstraints(writeComm,constraints);rn gridbag.setConstraints(oid,constraints);rn gridbag.setConstraints(jp2,constraints);rn rn rn constraints.gridheight=GridBagConstraints.RELATIVE;rn constraints.weighty=0.75;rn gridbag.setConstraints(sp1,constraints);rn rn rn constraints.gridheight=GridBagConstraints.REMAINDER;rn constraints.weighty=0.25;rn gridbag.setConstraints(sp2,constraints);rn rn jp.add(hostL);rn jp.add(host);rn jp.add(portL);rn jp.add(port);rn jp.add(communityL);rn jp.add(community);rn jp.add(writeCommL);rn jp.add(writeComm);rn jp.add(setValueL);rn jp.add(setValue);rn jp.add(oidL);rn jp.add(oid);rn jp.add(jp2);rn jp.add(sp1);rn jp.add(descrL);rn jp.add(sp2);rn rn return(jp);rn rn rn

没有更多推荐了,返回首页