E7段获取远程主机MAC地址的方法与java实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
跨网段获取远程主机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地址的方法,并给出了其在JA V A中实现的程序。
关键词MAC地址,远程主机,SNMP,JA V A
中图分类号:TN911.73
Abstract The arti cle 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 JA V A.
Key Words MAC,remote host,SNMP,JA V A
一、引言
在计算机网络通信中,网卡中的信息最重要就是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地址。
三、实现
下面是采用JA V A和netsnmp4_13开发包来完成获取远程主机MAC地址的程序。public class getMac implements Observer
{
final static String myoid = "1.3.6.1.2.1.4.21.1.2"; //ipRouteIfIndex的oid
private SnmpContextv2c context;
private OneGetNextPdu pdu;
private Util util;
private int oidlen=0;
String oid;
int i=0;
private String[] oidV alue=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=stIndexOf(".");