logo资料库

跨网段获取远程主机MAC地址的方法与java实现.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
The method of requesting from remote host MAC and
Key Words MAC,remote host,SNMP,JAVA
跨网段获取远程主机 MAC 地址的方法与 java 实现 The method of requesting from remote host MAC and java application (1. 唐山学院; 2 保定金融专科学校; 3.北京邮电大学) 郭建波 1 李志明 2 刘宁宁 3 guo,jianbo li,zhiming liu,ningning 摘 要 本文分析了利用 SendARP 方法(基于 ARP 协议)来获取远程主机 MAC 地址的缺 陷,提出了一种新思路——研究并利用 SNMP 协议来快速获取远程主机 MAC 地址的方法, 并给出了其在 JAVA 中实现的程序。 关键词 MAC 地址,远程主机,SNMP,JAVA 中图分类号:TN911.73 Abstract The article analyzes the faults of requesting from remote host MAC in SendARP way,putting forward a new method, researching and applying SNMP protocol to request remote host MAC and delivering application programme in JAVA. Key Words MAC,remote host,SNMP,JAVA 一、引言 在计算机网络通信中,网卡中的信息最重要就是 MAC 地址,即网卡的物理地址。MAC 地址固化在网卡的 ROM 中,不易改动。在网络通信中需要监控一台计算机的最好的方法就 是获取它的 MAC 地址。 获取远程主机的 MAC 地址,采用 IpHelperAPI 的 SendARP 方法,在跨网段情况下,它 只能获取“本网段”内主机的 MAC 地址,如果源主机与目的主机不在同一个网段内,该方法就 只能获取“网关”的 MAC 地址,而无法获取目的主机的 MAC 地址。本文利用 SNMP 协议从 三层交换机缓存中获取到所有网段的 MAC 地址,采用 jawa 编程,实现了获取远程主机的 MAC 地址,供同行借鉴。 二、原理 交换机是一种基于 MAC(网卡的硬件地址)识别,完成封装转发数据包功能的网络设 备。交换机可以"学习"MAC 地址,并把其存放在内部地址表中,通过在数据帧的始发者和目 标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址,SNMP(Simple Network Management Protocol)即简单网络管理协议为网络管理系统提供了底层网络管理的 框架,通过 SNMP 协议来获取 MAC 地址速度快、效率高。 SNMP 协议定义了数据包的格式,及网络管理员和管理代理之间的信息交换,它还控制 着管理代理的 MIB 数据对象。可处理管理代理定义的各种任务。SNMP 协议对外提供了三种 用于控制 MIB 对象的基本操作命令。它们是:Set 、Get 和 Trap。 一条 SNMP 报文由三个部分组成:版本域(version field),分区域(community field)和 SNMP 协议数据单元域(SNMP protocol data unit field),数据包的长度不是固定的。 版本域:这个域用于说明现在使用的是哪个版本的 SNMP 协议。目前,version 1 是使用 最广泛的 SNMP 协议。 分区域:分区(community)是基本的安全机制,用于实现 SNMP 网络管理员访问 SNMP 管理代理时的身份验证。 协议数据单元域:SNMPv1 的 PDU 有五种类型,有些是报文请求(Request),有些则是 响应(Response)。它们包括:GetRequest、GetNextRequest、SetRequest、GetResponse、Trap 。 SNMPv2 又增加了两种 PDU:GetBulkRequest 和 InformRequest 。 SNMP 管理员使用 GetRequest 从拥有 SNMP 代理的网络设备中检索信息,SNMP 代理以
GetResponse 消息响应 GetRequest。可以交换很多的信息,如系统的名字,系统自启动后正常 运行的时间,系统中的网络接口数等等。GetRequest 和 GetNextRequest 结合起来使用可以获 得一个表中的对象。GetRequest 取回一个特定对象;而使用 GetNextRequest 则是请求表中的 下一个对象。使用 SetRequest 可以对一个设备中的参数进行远程配置。Set-Request 可以设置 设备的名字,关掉一个端口或清除一个地址解析表中的项。Trap 即 SNMP 陷阱,是 SNMP 代理发送给管理站的非请求消息。这些消息可告知管理站本设备发生了一个特定事件,如端 口失败,掉电重起等,管理站可相应的作出处理。 管理信息数据库(MIB)是一个信息存储库,它包含了管理代理中的有关配置和性能的 数据,有一个组织体系和公共结构,其中包含分属不同组的许多个数据对象。 MIB 数据对象以一种树状分层结构进行组织,这个树状结构中的每个分枝都有一个专用 的名字和一个数字形式的标识符。 在三层交换机中利用 SNMP 协议获取 CAM 表的内容,实现 IP 与 MAC 的对应。其中 ipNetToMeiaPhysAddress(1.3.6.1.2.1.4.22.1.2)对象用于将 IP 映射到物理地址的地址转换。 通过 SNMP 查询得到类似下面的结果: IP-MIB::ipNetToMediaPhysAddress.42.192.168.171.37 = STRING: 0:0:e2:47:b9:16 IP-MIB::ipNetToMediaPhysAddress.42.192.168.171.40 = STRING: 0:0:e2:43:f1:ae 其中 ipNetToMediaPhysAddress 后面的 42 表示的是 VLAN 接口号,如果需要按网段得到 MAC 地址,ipRouteIfIndex(1.3.6.1.2.1.4.21.1.2)唯一指定本地接口的索引值,可以用 来得到 VLAN 号,两者组合起来可以得到某一个具体网段的 MAC 地址。 三、实现 下面是采用 JAVA 和 netsnmp4_13 开发包来完成获取远程主机 MAC 地址的程序。 //ipRouteIfIndex 的 oid public class getMac implements Observer { util; final static String myoid = "1.3.6.1.2.1.4.21.1.2"; private SnmpContextv2c context; private OneGetNextPdu pdu; private Util private int oidlen=0; String oid; int i=0; private String[] oidValue=new String[50]; boolean init=true; public getMac(String propertiesFilename){ util = new Util(propertiesFilename, this.getClass().getName()); } public void init () { //首先得到 vlan 号 String host = util.getHost(); int port = util.getPort(SnmpContextBasisFace.DEFAULT_PORT); String socketType = util.getSocketType(); oid = util.getOid(myoid); String community = util.getCommunity(); oidlen=oid.length(); int aa=oid.lastIndexOf(".");
try { context = new SnmpContextv2c(host, port, socketType); context.setCommunity(community); pdu = new OneGetNextPdu(context); pdu.addObserver(this); pdu.addOid(oid); pdu.send(); } catch (java.io.IOException exc) { System.out.println("IOException " + exc.getMessage()); System.exit(0); } catch(uk.co.westhawk.snmp.stack.PduException exc) { System.out.println("PduException " + exc.getMessage()); System.exit(0); } } public void update(Observable obs, Object ov) //得到 vlan 中的 mac 地址表 { boolean isFinished = false; if (pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR) { varbind var = (varbind) ov; AsnObject obj = var.getValue(); int a=var.getOid().toString().indexOf(".",21); if(var.getOid().toString().substring(0,oidlen).equals(oid.substring(0,oidlen))) { pdu = new OneGetNextPdu(context); pdu.addObserver(this); if(init){ oid="1.3.6.1.2.1.4.22.1.2."+obj.toString(); //构造 ipNetToMediaPhysAddress oidlen=oid.lastIndexOf("."); pdu.addOid(oid); init=false; } else{ } try { System.out.print("ip="+var.getOid().toString().substring(a+1)); System.err.println(" mac="+obj.toString().substring(2)); oid=var.getOid().toString(); pdu.addOid(oid); oidlen=oid.lastIndexOf("."); pdu.send();
i++; } catch(java.io.IOException exc) { System.out.println("update(): IOException " + exc.getMessage()); } catch(uk.co.westhawk.snmp.stack.PduException exc) { System.out.println("update(): PduException " + exc.getMessage()); } } else {isFinished = true;} } else {isFinished = true; } if (isFinished == true) { System.exit(0); } } } 四、结束语 采用此方法获取(扫描)MAC 地址的效率较高。在几秒钟之内能得到全网的 MAC 地址, 网络资源消耗小。在计算机网络监控方面有很好的应用价值。 [基金项目]国家自然科学基金资助(69975002); 唐山市重点实验室资助(04360801-3) 作者介绍: 郭建波,男,1964,河北唐山 副教授 硕士,研究方向计算机网络及应用。 李志明,男,讲师。 刘宁宁,教授,博士后,研究生导师。 参考文献: [1] 杨旭光.. 利用 ICMP 实现局域网网卡地址的搜索[J]. 宜春学院学报,2004,(8) [2]. 邹永林,沈健. 网卡地址的识别和 Windows95IP 地址的自动设置[J]. 计算机工程,2000,(9)
分享到:
收藏