黎江超计算机网络课设解析ARP数据包Word下载.docx
- 文档编号:18435855
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:15
- 大小:294.01KB
黎江超计算机网络课设解析ARP数据包Word下载.docx
《黎江超计算机网络课设解析ARP数据包Word下载.docx》由会员分享,可在线阅读,更多相关《黎江超计算机网络课设解析ARP数据包Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
源MAC地址:
输出ARP消息格式中的源物理地址字段
目的IP地址:
输出ARP消息格式中的目的IP地址字段。
目的MAC地址:
输出ARP消息格式中的目的物理地址字段
操作:
输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2,
时间:
捕捉到该ARP数据包的时间
3,当程序接收到键盘输入Ctrl+C时字段
三,相关知识
a)ARP数据报的消息格式
网络上的每台主机或设备都有一个或多个IP地址。
IP地址是网络层的地址,在网络层,数据被组装成IP包。
但是发送IP包需要物理设备的支持(通常是Ethernet设备,在本课程设计中我们指定为Ethernet设备),即发送端必须知道目的物理地址才能将IP包发送出去,所以需要一种将IP地址映射为物理地址的机制。
ARP协议就是用来完成这个任务的。
ARP协议能够在同一个物理网络中,在给定目的主机或设备的IP地址的条件下,得到目的主机或设备的物理地址。
ARP协议的数据包格式如图所示:
08162431(位)
硬件类型
协议类型
物理地址长度
协议地址长度
操作
源物理地址(八位组0~3)
源物理地址(八位组4~5)
源IP地址(八位组0~1)
源IP地址(八位组2~3)
目的物理地址(八位组0~1)
目的物理地址(八位组2~5)
目的IP地址(八位组0~3)
ARP数据包的消息格式
下面对数据包的各个部分进行说明
●硬件类型:
指定硬件接口类型。
例如,值为1表示Ethernet
●协议类型:
指定发送方支持的上层协议的类型
●物理地址长度:
指定物理(硬件)地址的长度
●协议地址长度:
网络层协议的地址长度。
若为IP协议,其值为4
●操作:
指定ARP的操作类型,例如,1表示ARP请求,2表示ARP应答
●源物理地址:
指定发送方的IP地址
●目的物理地址:
指定目的物理地址。
●目的IP地址:
指定目的IP地址
ARP分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示
将ARP数据包封装成一个帧
b)ARP协议的工作流程。
1)在发送一个ARP分组之前,源主机首先根据目的IP地址,在本地ARP高速缓存表中查找与之对应的目的物理地址。
如果找到对应的物理地址,就不用进行地址解析,否则需要进行地址解析。
2)实现地址解析的第一步是产生ARP请求分组。
在相应的字段写入本地主机的源物理地址、源IP地址,在目的物理地址字段写入0,并在操作字段写入1。
3)将ARP分组发送到本地的数据链路层,并封装成帧。
以源物理地址作为源地址,以物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。
4)由于采用了广播地址,因此网段内所有的主机或设备都能接受到该帧。
除了目的主机外,所有接受到该分组的主机和设备都会丢弃该分组,因为目的主机能够识别ARP消息中的目的IP地址。
5)目的主机发送ARP应答分组。
在ARP应答分组中,以请求分组中源物理地址、源IP地址作为其目的物理地址、目的IP地址,并将目的主机自身的物理地址、IP地址填入应答分组的源物理地址、源IP地址字段,并在操作字段中写入2。
该分组通过数据链路层以点对点的方式发送出去(因为现在目的方已经知道双方的物理地址)。
6)源结点接收到ARP应答分组,知道对应于目的IP地址的目的物理地址,将它作为一条新记录加入到ARP高速缓存表。
7)
图1ARP工作原理
源结点将有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发送到目的主机。
四,课程设计分析
课程设计中的重点及难点
1)本课设我小组采用java语言编写,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。
JPCAP扩展包弥补了这一点。
JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。
在官方网站上声明,JPCAP支持FreeBSD3.x,LinuxRedHat6.1,FedoraCore4,Solaris,andMicrosoftWindows2000/XP等系统。
:
●输出网卡设备列表。
●选择网卡并打开。
●捕获数据包时,可能需要设置过滤器。
●捕获数据包或者发送数据包。
2)在程序设计过程中需要注意网络—主机字节顺序的转化。
由于不同的计算机系统所采用的数据表示方式不同,对于2B或4B的数据,有的采用低字节地址存放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表示长度或类型的数据转换成本地机的表达形式。
可以利用函数valuesOf()将网络字节序转换为主机字节序。
3)选择网卡并打开时,注意选择可用的网卡。
4)第一种是通过回调函数的机制,另一种是利用JpcapCaptor实例的getPacket()的方法,一个数据包一个数据包的接收。
第一种是类似与事件触发的机制。
为了了解ARP包的具体解析过程我们采用回调函数机制,首先,你要自定义一个类,该类必顺实现PacketReceiver接口,(在事件处理机制雷同)。
PacketReciver接口只声名了receivePacket(Packetpacket)方法,所以你要在你自义的类中实现该方法,方法体里放置你处理接收到的数据包的代码,得到的数据包为型参packet.
接着,你就可以通过调用JpcapCaptor类的实例的processPacket()或loopPacket()来开始接收数据包。
开始接收数据包后,当接收到数据包时就会回调实现PacketReceiver接口的类的receivePacket的方法,使理接收到的数据包。
1.参考算法
1)取得当前网卡设备列表。
2)选择Ethernet网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。
3)设置过滤器,此处的过滤器正则表达式为“arp”或者“etherproto\\arp”。
4)捕获数据包并进行处理(包括输出各IP地址,物理地址,操作类型以及时间)。
由于要记录日志文件,为了便于输出流参数,建议采用Vector向量存储方式。
流程图如图所示:
五,自己负责的功能核心代码,
//向文本区写入捕获到的ARP包的信息并加入自动控制程序
classReceiverimplementsPacketReceiver{
publicvoidreceivePacket(Packetpacket){//匿名类,每捕获一个包就调用此方法,打开数据包包并输出
VectorData=newVector();
Strings6="
"
;
Strings7="
Strings8="
Strings9="
Strings10="
Strings11="
//添加捕捉到的包序号
Data.add(Number);
//自动控制判断行1
if(jcb1.isSelected())
{
itemselfClear=Integer.valueOf(baoNumber.getText());
if(Number%itemselfClear==0)
{
jta.setText(null);
}
}
//自动控制判断行2
if(jcb2.isSelected())
{
itemselfSleep=Integer.valueOf(baogeshu.getText());
SleepTime=Integer.valueOf(miaoshu.getText());
if(Number%itemselfSleep==0)
try{
Thread.sleep(SleepTime);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
Number++;
Data.add(((ARPPacket)packet).getSenderProtocolAddress());
//源ip地址
Data.add(((ARPPacket)packet).getSenderHardwareAddress());
//源mac地址
Data.add(((ARPPacket)packet).getTargetProtocolAddress());
//目的ip地址
Data.add(((ARPPacket)packet).getTargetHardwareAddress());
//目的mac地址
if(Short.valueOf(ARPPacket.ARP_REQUEST).equals(((ARPPacket)packet).operation))
{
Data.add("
请求"
);
}
elseif(Short.valueOf(ARPPacket.ARP_REPLY).equals(((ARPPacket)packet).operation))
应答"
if(ARPcache_ip.size()==0)
ARPcache_ip.add(((ARPPacket)packet).getSenderProtocolAddress());
ARPcache_mac.add(((ARPPacket)packet).getSenderHardwareAddress());
else{
for(inti=0;
i<
ARPcache_ip.size();
i++)
if(String.valueOf(Data.get(0)).equals(String.valueOf(ARPcache_ip.get(i))))//判断ip是否存在缓存表中
//判断mac地址是否相同
if(!
String.valueOf(Data.get
(1)).equals(String.valueOf(ARPcache_mac.get(i))))
{
isDeceive=true;
//存在arp欺骗
break;
else{
ARPcache_ip.add(((ARPPacket)packet).getSenderProtocolAddress());
ARPcache_mac.add(((ARPPacket)packet).getSenderHardwareAddress());
break;
//显示时间
DatenowTime=newDate();
SimpleDateFormatformat=newSimpleDateFormat("
HH:
mm:
ss"
Data.add(format.format(nowTime));
DataOut.add(Data);
//显示信息
Strings0="
+Data.get
(1);
Strings1="
+Data.get
(2);
Strings2="
+Data.get(3);
Strings3="
+Data.get(4);
Strings4="
+Data.get(5);
Strings5="
+Data.get(6);
if(Number<
10)
s11="
"
elseif(Number>
9)s11="
for(inti=0;
16-s0.length();
i++)s6=s6+"
25-s1.length();
i++)s7=s7+"
16-s2.length();
i++)s8=s8+"
30-s0.length();
i++)s9=s9+"
22;
i++)s10=s10+"
s6=s6+"
s8=s8+"
//输出数据
if(!
isDeceive)
//正常输出
insert("
+String.valueOf(Number),Color.black);
insert(s11+s0,Color.black);
insert(s6+s1,Color.black);
insert(s7+s2,Color.black);
insert(s8+s3,Color.black);
insert(s9+s4,Color.black);
insert(s10+s5+"
\r\n"
Color.black);
elseif(isDeceive)
//出现arp欺骗时,警告输出
+String.valueOf(Number),Color.red);
insert(s11+s0,Color.red);
insert(s6+s1,Color.red);
insert(s7+s2,Color.red);
insert(s8+s3,Color.red);
insert(s9+s4,Color.red);
insert(s10+s5+"
Color.red);
isDeceive=false;
//插入数据的函数
publicvoidinsert(Stringstr,Colorcol){
Documentdoc=jta.getDocument();
//获得JTextPane的Document
SimpleAttributeSetattrSet=newSimpleAttributeSet();
//定义字符样式
StyleConstants.setForeground(attrSet,col);
//设置颜色颜色
try{
doc.insertString(doc.getLength(),str,attrSet);
catch(BadLocationExceptione)
e.printStackTrace();
六,程序运行效果如下
整体功能如下图所示
输出日志文件效果如下
查看日志文件
清空后的结果
通过检测ip冲突检测ARP欺骗
七,功能扩充
1,以图形化界面设计,改善程序运行时的视觉效果,同时图形化界面操作简单,界面友好,也方便非计算机专业人员的使用。
2,通过检测IP冲突,可以检测到ARP欺骗。
3,通过增加自动控制功能可以让程序休息一段时间后继续工作已经自动清屏功能
八,实验中遇到的问题
1、本程序是在命令行模式下运行,只有C++版本的没有java版本,并且书本上java这
方面的知识可以确定为零,我们小组通过上网查资料和其他书本上的相应知识找到了下
手的地方,且设计了美观的界面。
2、程序点两次捕获就会异常退出,弹出一个消息框完美解决了这个问题;
3、程序布局很困难,java界面编程不行,导致界面设计话了很大一部分时间。
4、编译环境配置比较麻烦,虽然JPCAP函数封装性好,效率高,使用方便,但是,使
用前的准备工作在不知如何配置的情况下要花费大量时间,介绍一下JPCAP的配置。
一、
首先必须安装Winpcap,首要条件。
二、安装最新版本jpcap配置Jpcap路径:
这一步也
是最重要的一步。
具体路径为,把Jpcap文件夹下lib文件夹里的Jpcap.dll复制到"
C:
\ProgramFiles\Java\jre1.6.0_07\bin"
文件
夹里面(复制到你机器JRE文件夹放到bin文件夹里面就可以了,其中JRE的版本一定
要与Eclipse配置的版本一致),再把Jpcap文件夹下lib文件夹里的Jpcap.jar复制到
\ProgramFiles\Java\jre1.6.0_07\lib\ext"
文件夹里面(复制到你机器JRE文件夹->
lib->
到
ext文件夹里面就可以了),
配置Eclipse的JRE环境,(一定需要),选
Window->
preferences->
Java->
InstalledJREs,在InstalledJREs选择框中选择相应的JRE版本,点Edit,选择AddExternalJARs…,选择的Jpcap.jar包("
文件夹里),在Finish就配
置全部完成了;
5、把数据输出到界面和写入到日志中时,输出到界面时组件和数据的长短不一样导致无
法对对齐,通过写了一个自动判断空格个数的函数解决的完全无法对齐的尴尬,但是存
在稍微一点偏差。
写到日志时,刚开始直接获取JTextPane的文本内容,因文本无法对齐
造成日志杂乱,通过把数据备份入DataOut向量中重新输出很好的解决了只以问题。
6、还有一些细节上的小问题,通过小组大家讨论找资料出意见都很好的解决了这些问题。
7、缺少pc自动控制,后来追加了程序自动控制功能,通过设置好后能自动执行。
九,实验总结以及体会
通过这次课设,不仅对网络体系的内容有更深入的学习,而且还加强了自己的编程能力。
在课设的过程中,由于java对数据链路层应用的较少所以这方面的资料,这也给我们小组增加了一定的难度,在搜集材料的过程中我发现,自己在找材料的同时也能学到很多其他知识,比如说我刚开始用JTextArea做界面的数据输出框体,但是无意中发现JTextPane这个组件更好用的时候,我果断换了JTextPane,而且由于JTextPane的字体颜色可单独更改让我想到了ARP欺骗的检测这个扩展。
加深了对课本知识的理解与掌握,同时自己亲自动手实现,对课本知识有了更加深刻的领悟。
另外,我还认了识ARP地址解析协议的工作原理,了解ARP攻击(ARP欺骗)的实现原理,找到了解决ARP攻击的有效解决方案。
最重要的一点是,这次试验暴露出我对这门课程的学习的许多问题,也发现了自己的很多不足之处,像逻辑分析的时候往往走岔路,等程序出错了才想起来更改,因此程序排错在这方面浪费了很大一部分时间。
作为组长分工也不是很明确,有些组员的负责部分并没有发挥到他们的特长,这方面我还需以后改进。
本课设遗憾的是最后只实现了老师后来要求程序自动控制功能,而发送arp包这个程序由于时间原因只做出了雏形,只能以后在完善。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 黎江超 计算机网络 解析 ARP 数据包