ARP协议获取局域网内部活动主机物理地址的程序实现.docx
《ARP协议获取局域网内部活动主机物理地址的程序实现.docx》由会员分享,可在线阅读,更多相关《ARP协议获取局域网内部活动主机物理地址的程序实现.docx(10页珍藏版)》请在冰点文库上搜索。
ARP协议获取局域网内部活动主机物理地址的程序实现
山东建筑大学计算机科学与技术学院
课程设计说明书
题目:
ARP协议获取局域网内部活动主机物理地址的程序实现
课程:
计算机网络
院(部):
计算机科学与技术
专业:
网络工程
班级:
网络***
学生姓名:
张***
学号:
***********
******
完成日期:
2014-7-9
山东建筑大学计算机科学与技术学院
课程设计任务书
设计题目
使用ARP协议获取局域网内部活动主机物理地址的程序实现(Java)
已知技术参数和设计要求
1.已知参数:
选择适当的网络适配器,以绑定Winpcap。
2.设计要求:
2.1协议实现需要哪些数据帧?
注意要数据帧的定义要符合公共标准。
2.2如何实现数据帧的发送?
2.3如何接收及解析目的主机的响应数据帧?
2.4如何显示ARP协议的执行结果?
3.JAVA环境为Eclipse
设计内容与步骤
1.熟悉ARP协议的工作原理;
2.熟悉ARP协议相关数据帧结构;
3.构造ARP请求数据帧;
4.使用Winpcap相关函数实现数据帧的发送;
5.接收及解析目的主机的响应数据帧;
6.获得IP地址与MAC地址的对应关系并显示;
7.课程设计任务说明书。
设计工作计划与进度安排
1.知识准备,整体思路设计2小时
2.开发环境与程序调试环境4小时
3.构造协议需要的相关数据帧,使用标准数据帧结构2小时
4.数据帧的发送10小时
5.接收、解析目的主机的相应数据帧,并显示结果12小时
6.课程设计说明书10小时10小时
设计考核要求
1.出勤20%
2.答辩或演示30%
3.课程设计说明书50%
使用ARP协议获取局域网内部活动主机物理地址的程序实现
一、问题描述
构造多个Arp的数据帧。
输入:
局域网中的IP地址;输出:
从控制台屏幕输出局域网内部活动主机物理地址。
二、基本要求
1.协议实现需要哪些数据帧?
注意要数据帧的定义要符合公共标准。
2.如何实现数据帧的发送
3.如何接收及解析目的主机的响应数据帧
4.如何显示ARP协议的执行结果
三、设计思想
首先构造ARP的数据包,然后通过java对网卡数据捕获需要用到jpcap,jpcap调用wincap实现数据包的发送,并监听返回的数据包,显示出来。
四、系统结构
程序可以分为两部分:
1:
程序构造具体的ARP数据包,发送。
2:
监听返回的数据包,并显示结果。
五、程序流程
程序一开始会要求用户输入本机所在局域网内的IP字段,再通过循环对每个目的IP发送请求包(根据构造目的IP构造的ARP请求包)。
当发送完ARP的请求包,系统就会在监听状态,等待是否返回响应包。
如果有返回包,说明此IP在局域网中并且处于活动状态,解析显示结果。
如果没有返回包,说明此IP没有在局域网或者处于关机状态
六、源程序
importjpcap.JpcapCaptor;
importjpcap.JpcapSender;
importjava.util.Arrays;
import.InetAddress;
import.Inet4Address;
importjpcap.packet.ARPPacket;
importjpcap.packet.EthernetPacket;
importjpcap.NetworkInterface;
importjpcap.NetworkInterfaceAddress;
publicclassDemo2{
publicstaticARPPacketgetTargetMAC(InetAddresstargetIp){
NetworkInterface[]devices=JpcapCaptor.getDeviceList();
NetworkInterfacedevice=null;
//寻找适合的网络设备
loop:
for(NetworkInterfaced:
devices){
for(NetworkInterfaceAddressaddr:
d.addresses){
if(!
(addr.addressinstanceofInet4Address))
continue;
byte[]bip=targetIp.getAddress();
byte[]subnet=addr.subnet.getAddress();
byte[]bif=addr.address.getAddress();
for(inti=0;i<4;i++){
bip[i]=(byte)(bip[i]&subnet[i]);
bif[i]=(byte)(bif[i]&subnet[i]);
}
if(Arrays.equals(bip,bif)){
device=d;
breakloop;
}
}
}
if(device==null)
thrownewIllegalArgumentException(targetIp
+"isnotalocaladdress");
JpcapCaptorcaptor=null;
//打开一个网络数据包捕捉者
try{
captor=JpcapCaptor.openDevice(device,2000,false,300);
//只接收ARP数包
captor.setFilter("arp",true);
}catch(Exceptione){
}
//获得发送数据包的实例
JpcapSendersender=captor.getJpcapSenderInstance();
InetAddresssrcip=null;
for(NetworkInterfaceAddressaddr:
device.addresses)
if(addr.addressinstanceofInet4Address){
srcip=addr.address;
break;
}
//进行广播数据报的MAC地址
byte[]broadcast=newbyte[]{(byte)255,(byte)255,(byte)255,
(byte)255,(byte)255,(byte)255};
//构造REQUEST类型的ARP的数据包
ARPPacketarp=newARPPacket();
arp.hardtype=ARPPacket.HARDTYPE_ETHER;
arp.prototype=ARPPacket.PROTOTYPE_IP;
arp.operation=ARPPacket.ARP_REQUEST;
arp.hlen=6;
arp.plen=4;
//源MAC地址
arp.sender_hardaddr=device.mac_address;
//源IP地址
arp.sender_protoaddr=srcip.getAddress();
//目地MAC地址:
广播地址全为1(二进制)
arp.target_hardaddr=broadcast;
//目地IP地址
arp.target_protoaddr=targetIp.getAddress();
//构造以太网头部
EthernetPacketether=newEthernetPacket();
ether.frametype=EthernetPacket.ETHERTYPE_ARP;
ether.src_mac=device.mac_address;
ether.dst_mac=broadcast;
//ARP数据包加上以网关头部
arp.datalink=ether;
//向局域网广播ARP请求数据报
sender.sendPacket(arp);
//接收目标主面的答应ARP数据报
while(true){
ARPPacketp=(ARPPacket)captor.getPacket();//接收返回包
if(p==null){
System.out.println(targetIp+"不是本地局域网的IP号");
returnp;
}elseif(Arrays.equals(p.target_protoaddr,srcip.getAddress())){
returnp;
}
}
}
publicstaticvoidmain(String[]args)throwsException{
Strings="10.13.72.";
for(intn=1;n<=254;n++){
System.out.println(s+n);
ARPPacketarpP=Demo2.getTargetMAC(InetAddress.getByName(s+n));
if(arpP==null){}
else{
System.out.println("硬件类型:
"+arpP.hardtype);
System.out.println("操作类型:
"+arpP.operation);
System.out.println("源 MAC 地址:
"+arpP.getSenderHardwareAddress());
System.out.println("源 IP 地址 :
"+arpP.getSenderProtocolAddress());
System.out.println("目标 MAC 地址 "+arpP.getTargetHardwareAddress());
System.out.println("目标 IP 地址 "+arpP.getTargetProtocolAddress());
System.out.println("===================================");
}
}
}
}
七、测试数据
循环输入局域网中的ip10.15.130.0/24
八、测试情况
结论
通过这段时间对本系统的设计与实现,我们成长了很多,也增长了不少知识。
也认识到了自己的不足之处:
以前总是眼高手低,现在真动手操作了,才知道,要想熟练的运用学过的知识,也不是一件简单易行的事情,需要不断的积累,不断的实践,不断的总结经验和教训。
同时,在设计过程中,遇到不会的问题应及时跟同学老师交流,或者查阅相关文献资料,这样才能提高工作效率,并且提高自己的自信心,同时也可以增强团队合作能力,和与他人的沟通能力。
这次实践将会是我们人生的一笔宝贵财富。
参考文献
[1][美]RogersCadenhead.Java.梅兴文译.第4版.北京:
人民邮电出版社,2007
[2][美]BruceEckel.ThinkingInJava.英文第4版.北京:
机械工业出版社,2007
[3]陈轶.姚晓昆编著.Java程序设计实验指导.北京:
清华大学出版社,2006
[4]杨昭编著.二级Java语言程序设计教程.北京:
中国水利水电出版社,2006
[5]赵文靖编著.Java程序设计基础与上机指导.北京:
清华大学出版社,2006
[6]赵毅主编.跨平台程序设计语言——Java.西安:
西安电子科技大学出版社,2006