1.引言
自从八十年代末期SNMP(Simple Network Management Protocol)简单网络管理协议面世以来,网络管理技术在短短的几十年里得到了突飞猛进的发展,随着管理功能的增强和管理对象的扩大,网络管理技术正逐步成为网络构建和维护中不可少的重要因素。
Socket接口是TCP/IP的API。也就是说Socket接口规定了许多函数和例程,程序员可以用它们来开发TCP/IP应用程序。今天Socket接口是TCP/IP网络最为通用的接口之一。Java是一种面向对象的、多线程的、交互式的与平台无关的编程语言,有着强大的网络通讯功能,在基于SNMP协议网络管理技术中发挥着重要的作用。它功能强大,表达力强。且支持Socket编程,Java利用其面向对象的功能封装了Socket实现中的许多细节,给基于SNMP协议的网络管理通讯提供了很大的方便和透明性。
本文将讲述Socket,以及利用Java中的Socket进行SNMP协议报文的通讯的过程。
2.Socket类型及其原理
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,可以通过这个端口与任何一个具有Socket接口的计算机通信,利用它可以较为方便的编写网络上的数据的传递。应用程序在网络上传输,接受的信息都通过这个Socket接口来实现。在应用开发中就像使用文件句柄一样,可以对Socket句柄进行读、写操作。Socket又名套接字,套接字分为以下三种类型。
字节流套接字(SocketStream),提供了一个双向的、面向连接的、可靠的、无差错的字节流通信,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;不保持信息边界。实现这种特性的通信协议在收到差错时将重传信息,若在连接已经切断后再发数据则返回错误信息,FTP协议即采用流式套接字。
数据报套接字(Datagram Socket)有时也叫“无连接套接字”,TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,它以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个传输或可靠性不重要的场合。数据报套接字的一个重要特点是它保留了记录边界。对于这一特点,数据报套接字采用了与现在许多包交换网络(例如以太网)非常类似的模型。一个数据报套接字是一个用于数据包收发服务的发送或者接收点。每一个在数据报套接字发送或者接收的数据包都独立的寻址和路由。从一台机器发到另一台机器上的多个数据包会独立进行路由,并且不会按发送次序到达。
原始数据报套接字(Raw Socket)提供对网络下层通讯协议(如IP协议)的直接访问,如IP、ICMP直接访问。它一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。
在Java中,java.net包提供了专门的Socket类来处理用户的请求和响应。利用java.net包中的Socket类,可以实现两台计算机之间的灵活的通讯。
在本文的SNMP协议报文的通讯过程中我们使用Socket的数据报套接字(Date Socket)进行通讯。
3.基于Java的SNMP协议报文的Socket通信
SNMP报文通常采用无连接的UDP报文来传输,当然也可以采用其它传输层协议进行传输,RFC1960中定义了几种非UDP传输协议。SNMP v2可以在其上运行,它们包括:
OSI无连接模式网络服务(CLNS)
OSI面向连接的网络服务(CONS)
Novell Internetwork Packet Exchange(IPX)
Appletalk
在实际应用中,除UDP外最有可能用来传输SNMP报文的还有面向连接的TCP协议。为了使系统能够运行于多种传输层协议之上,我们为报文的发送和接收提供了统一的抽象接口,对于不同的传输层协议,只需实现该接口,就可以将该连接实现类的实例作为参数传递给报文发送/接收器,而不需要改动其它任何代码,就可以实现不同传输层的平滑移植。
由于SNMP大多采用UDP传输报文,我们就以UDP为例讨论SNMP报文的发送和接收。
J2EE的java.net包提供了两个与UDP传送相关的类:DatagramSocket和DatagramPacket,其中DatagramSocket用来建立与目的连接对象的Socket通道,并负责发送和接收数据,而DategramPacket则负责将要传递的数据封装成UDP的数据报文,供DatagramSocket发送和接收。
假设现有一SNMP GetNext报文,并且已经转换为BER字节编码,放在byte[]类型的buffer变量中,现要将它发至IP地址为202.114.33.90的SNMP Agent实体(其通讯端口为161),并等待接收从该SNMP Agent发回的响应报文。这一SNMP协议报文发送和接收过程如下:
(1)生成一个DatagramSocket派生类SNMPSocket的实例sock,可以指定端口和地址,将SNMPSocket实例与固定的地址和端口进行绑定,也可不给构造函数任何参数,系统将自动与本地地址和没有被占用的最小用户端口进行绑定。由于事先无法预知哪些端口未被占用,所以采用后一种方式比较保险。假设此次绑定的端口为本地的1980端口;
(2)生成一个DatagramPacket派生类SNMPPacket实例packet,在构造函数中指明要发送的数据buffer、buffer的长度(buffer.length)、报文要发送的目的地址202.114.33.90以及目的端口161;
(3)通过引用sock的send(sendPacket)方法,将报文发送至202.114.33.90的161端口;
(4)再定义一个足以接收SNMP响应报文数据的字节数组,用该数组生成一个准备接收报文的DatagramPacket派生类实例receivePacket;
(5)调用sock.receive(receivePacket)方法,等待对方的响应报文。因发过去的sendPacket在被对方接收到时,可以从中获得该报文的源地址和端口,即sock绑定的地址和端口,所以agent会根据这一信息,将响应报文发送至sock所在的网络通道,即1980端口;
(6)查询receivePacket中的字节数组,如果不为空,则表示已有响应报文到来,取出该报文,就完成了一次发送和接收的过程。
上面介绍的发送和接收过程是一个同步的过程,即发送一个SNMP报文,如果该报文有响应报文,就需等待它的响应报文到来,才能处理下一个请求报文。如果网络发生拥塞或发送请求频率过高,这种处理方法可能会使发送的请求报文和接收的响应报文都出现丢失情况。
针对上述问题,可以通过引进缓冲队列和采用多线程方法来解决,从而实现异步处理方法。在发送和接收时都建立一个缓冲队列,管理者在构造好需要发送的报文后,只需将该报文放入发送队列中,另一个线程则负责定期检查该发送队列,只要该队列不为空,就将队列中的报文取出进行发送;接受时一旦收到响应报文,将它放入接收队列,接着继续进行监听,等待下一个报文的到来,同样也有另一个线程专门检查接收队列,只要其中有接收到的响应报文,就将它取出进行相应的后续处理,这样就保证了发送和接收报文的完整性。
在异步方式处理方法中,我们用到了wait、notify、notifyAll这些方法。这些方法主要是处理线程间通讯的同步问题。
当线程在继续执行前需要等待一个条件时,仅有synchronized关键字是不够的。虽然synchronized关键字阻止并发更新一个对象,但它没有实现线程间发信。Java的Object类为此提供了三个函数:wait()、notify()和notifyAll()。以全球气候预测为例。这些程序通过将地球分为许多单元,在每个循环中,每个单元的计算都是隔离进行的,直到趋于稳定,然后相邻单元之间就会交换一些数据。所以,从本质上将,在每个循环中各个线程都必须等待所有线程完成各自的任务以后才能进入下一个循环。这个模型称为屏蔽同步。
当对一个线程调用wait()时,该线程就被有效阻塞,直到另一个线程对同一个对象调用了notify()或notifyAll()为止。因此,在前一个示例中,不同的线程在完成它们的工作以后将调用waitForAll()函数,最后一个线程将触发notifyAll()函数,该函数将释放所有的线程。第三个函数notify()只通知一个正在等待的线程,当对每次只能由一个线程使用的资源进行访问限制时,这个函数很有用。但是,不可能预知哪儿线程会获得这个通知,因为这取决于Java虚拟机(JVM)调度算法。
对Trap的接收也采用接收报文类似的方法,只不过在生成sock时,需指明一个固定端口(SNMP规定为162端口),通过本地的该端口等待Trap报文的到来。
4.结束语
Socket实质上提供了进程通信的端口,即从Socket发送数据和从Socket接收数据,客户程序可以向Socket写请求,服务器将处理此请求,然后通过Socket将结果返回给用户。而Java具有平台独立性、面向对象、多线程、安全性等许多优点,是目前最为优秀的编程语言。在SNMP协议通讯过程采用Java进行Socket通讯使得通讯更灵活,有利于SNMP协议通讯的实现。
分享到:
相关推荐
在深入探讨基于Java实现SNMP(简单网络管理协议)报文通讯之前,有必要先了解SNMP协议的基础知识。SNMP是一种广泛应用于网络管理系统的标准协议,它允许网络管理员远程监控和管理网络设备,如路由器、交换机、服务器...
Java调用SNMP协议主要涉及的是网络管理与监控方面的技术,SNMP(Simple Network Management Protocol,简单网络管理协议)是一种广泛用于网络设备管理和监控的标准协议。在Java中,可以通过一些库来实现对SNMP的支持...
snmp协议以太网报文,传输的http协议,可以用wireshark软件打开,适用于学习snmp报文解析,学习各种工业以太网协议可参考本人其他下载文件
HTTP协议报文格式.doc; HTTP网页访问应用分析.doc; SWIFT报文.pdf; 基于Java的SNMP协议报文的Socket通讯原理及其实现.pdf; 把几个找到的资料都放在一块,这样就方便了!
在Java中实现SNMP通信,需要理解SNMP协议的基本原理以及相关的Java库。 1. SNMP协议基础: SNMP分为三个版本:SNMPv1、SNMPv2c和SNMPv3。SNMPv1是最基础的,只提供无认证和加密的安全性;SNMPv2c增强了功能,但...
SNMP(简单网络管理协议)是网络管理标准中的一种,用于监控和管理网络...总的来说,通过Java实现SNMP PDU报文的TLV解析是一项涉及网络协议理解、数据结构设计和编程技能的任务,对提升网络管理和开发能力有很大帮助。
Java编程语言广泛应用于各种系统和网络管理任务,其中包括与SNMP(简单网络管理协议)的交互。SNMP4J是一个开源的Java库,专门设计用于实现SNMP协议的客户端功能,使得开发者能够从网络设备中读取或设置管理信息。本...
SNMP报文是SNMP协议中的基本通信单元,包含了管理信息的请求和响应。本文将深入探讨如何通过MIB浏览器发送SNMP报文,并利用sniff技术进行捕获和分析,特别是关注SNMP报文的版本号、团体名以及PDU。 首先,MIB...
基于java的Oid获取软件.rar Java进行SNMP通信的指南SnmpProgrammingGuideViaJava.doc Java实现snmp的get和walk代码示例.doc snmp4j.chm snmp.chm SnmpMain.java snmp配置说明.doc snmp协议详细讲解.doc ...
本篇文章将深入探讨如何利用Java编程语言通过SNMP协议来获取交换机设备上的详细信息,包括PC机的MAC地址、IP地址以及连接的端口号。 首先,SNMP是一种应用层协议,它允许网络管理员远程收集和配置网络设备的数据。...
首先,你需要创建一个socket,指定其为UDP(用户数据报协议)类型,因为SNMP通常基于UDP运行。然后,通过bind函数绑定到特定的IP地址和端口,等待接收数据。使用recvfrom函数可以从socket中接收数据,并获取数据的...
基于W5500+STM32的SNMP协议应用 本文档讲述了基于W5500+STM32的SNMP协议应用,主要概括了W5500简介、SNMP协议简介、Net-SNMP软件包等内容。 一、W5500简介 W5500是韩国WIZnet公司生产的一款以太网控制芯片,它...
基于SNMP协议的网络拓扑发现程序,有代码,C++语言。 操作界面十分简单,只有“开始探测”,“设置参数”和“群Ping”三个功能,分别对应“空格”,“S”和“P”三个快捷键,其中设置参数功能提供更改参数设置的...
SNMP4J是Java中一个流行的SNMP库,它封装了SNMP协议的复杂性,提供了简单易用的API接口。使用SNMP4J,开发者能够通过编写Java代码来实现对网络设备的操作,比如检索设备信息、修改设备配置、接收告警通知等。 在这...
简单网络管理协议(Simple Network Management Protocol, SNMP)是当前广泛应用于计算机网络管理的一种协议。众多网络管理软件都是基于SNMP技术开发的。理解SNMP报文的格式及其编码规则对于开发SNMP网络管理软件至关...
- SNMP使用UDP作为传输层协议,工作在应用层,基于ICMP协议。 - SNMP版本:包括SNMPv1、SNMPv2c和SNMPv3,其中v3提供了安全性增强,支持认证、加密和访问控制。 2. **管理信息库(MIB)**: - MIB是网络设备配置...
基于SNMP和Java的网络拓扑发现方法的核心在于通过SNMP协议从网络设备上获取上述提到的关键信息表,并利用Java编程语言的强大功能进行数据处理和拓扑图的绘制。具体步骤如下: 1. **SNMP数据采集**:使用SNMP协议从...
该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理...
SNMP(简单网络管理协议)是一种广泛用于网络设备管理的标准协议,它允许网络管理员远程监控和管理网络设备,如路由器、交换机、服务器等。在Java中实现SNMP功能,可以利用各种开源库来简化开发过程。这篇文档将深入...