南昌航空大学信息工程学院课程设计课程设计题目:解析ARP数据包计划学时:2周所属课程名称:计算机网络课程设计开设时间:2011学年第一学期授课班级:网络工程2班指导教师:周之平学生姓名:黎江超学号:09046213一,课程设计目的:本课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。二,课程设计要求:通过编制程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下所示:1,以命令行的形式运行,如下所示:arpparselogfile其中,arpparse为程序名;logfile为日志文件名。2,程序输出内容如下所示:源IP地址源MAC地址目的IP地址操作时间各部分的说明如下所示:编号:捕捉到的包的序号源IP地址:输出ARP消息格式中的源IP地址字段源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分组发送到本地的数据链路层,并封装成帧。以源物理地址作为ARP消息帧头部帧数据源地址,以物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。4)由于采用了广播地址,因此网段内所有的主机或设备都能接受到该帧。除了目的主机外,所有接受到该分组的主机和设备都会丢弃该分组,因为目的主机能够识别ARP消息中的目的IP地址。5)目的主机发送ARP应答分组。在ARP应答分组中,以请求分组中源物理地址、源IP地址作为其目的物理地址、目的IP地址,并将目的主机自身的物理地址、IP地址填入应答分组的源物理地址、源IP地址字段,并在操作字段中写入2。该分组通过数据链路层以点对点的方式发送出去(因为现在目的方已经知道双方的物理地址)。6)源结点接收到ARP应答分组,知道对应于目的IP地址的目的物理地址,将它作为一条新记录加入到ARP高速缓存表。7)源结点将有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发送到目的主机。ARP响应AYXBZ主机B向A发送ARP响应分组主机A广播发送ARP请求分组ARP请求ARP请求ARP请求ARP请求209.0.0.5209.0.0.600-00-C0-15-AD-1808-00-2B-00-EE-0A我是209.0.0.5,硬件地址是00-00-C0-15-AD-18我想知道主机209.0.0.6的硬件地址我是209.0.0.6硬件地址是08-00-2B-00-EE-0AAYXBZ209.0.0.5209.0.0.600-00-C0-15-AD-18四,课程设计分析课程设计中的重点及难点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);//自动控制判断行1if(jcb1.isSelected()){itemselfClear=Integer.valueOf(baoNumber.getText());if(Number%itemselfClear==0)开始获取网卡列表选取Ethernet网卡打开网卡(混杂模式)编译设置过滤器捕获ARP包并将其相应内容输出{jta.setText(null);}}//自动控制判断行2if(jcb2.isSelected()){itemselfSleep=Integer.valueOf(baogeshu.getText());SleepTime=Integer.valueOf(miaoshu.getText());if(Number%itemselfSleep==0){try{Thread.sleep(SleepTime);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.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)){Data.add(应答);if(ARPcache_ip.size()==0){ARPcache_ip.add(((ARPPacket)packet).getSenderProtocolAddress());//源ip地址ARPcache_mac.add(((ARPPacket)packet).getSenderHardwareAddress());//源mac地址}else{for(inti=0;iARPcache_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());//源ip地址ARPcache_mac.add(((ARPPacket)packet).getSenderHardwareAddress());//源mac地址break;}}}}//显示时间DatenowTime=newDate();SimpleDateFormatformat=newSimpleDateForma