- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.
流程图如图所示:
开始
获取网卡列表
选 取 Ethernet 网 打开网卡(混杂模式)
编译设置过滤器 捕获 ARP 包并将其 相应内容输出
3. 核心代码 ARP 数据包结构
struct arppkt{ unsigned short hdtyp; unsigned short protyp; unsigned char hdsize; unsigned short op; u_char smac[6]; u_char sip[4]; u_char dmac[6]; u_char dip[4]; }; //硬件类型。值 0001 表示其为 Ethernet //协议类型。值 0800 表示上层协议为 IP //硬件地址长度。值为 06 //操作值为 0001/0002,分别表示 ARP 请求/应答 //源 MAC 地址,6B //源 IP 地址,4B //目的 MAC 地址 //目的 IP 地址
4)
5)
6) 7)
物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。 由于采用了广播地址,因此网段内所有的主机或设备都能接受到该帧。除了目的主 机外, 所有接受到该分组的主机和设备都会丢弃该分组, 因为目的主机能够识别 ARP 消息中的目的 IP 地址。 目的主机发送 ARP 应答分组。在 ARP 应答分组中,以请求分组中源物理地址、源 IP 地址作为其目的物理地址、目的 IP 地址,并将目的主机自身的物理地址、IP 地址填 入应答分组的源物理地址、源 IP 地址字段,并在操作字段中写入 2。该分组通过数 据链路层以点对点的方式发送出去(因为现在目的方已经知道双方的物理地址) 。 源结点接收到 ARP 应答分组,知道对应于目的 IP 地址的目的物理地址,将它作为 一条新记录加入到 ARP 高速缓存表。 源结点将有完整源 IP 地址、源物理地址、目的 IP 地址、目的物理地址的信息和数 据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发 送到目的主机。
unsigned char prosize; //协议地址长度。值为 04
获取网络设备列表,并以混杂模式打开网络设备
//获取网络设备列表 if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Error in pcap_findalldevs:"<<errbuf; return; } //选择 Ethernet 卡 for(d=alldevs;d;d=d->next)
ARP 消息 帧头部 帧数据
将 ARP 数据包封装成一个帧 b)ARP 协议的工作流程。 1) 在发送一个 ARP 分组之前,源主机首先根据目的 IP 地址,在本地 ARP 高速缓存表 中查找与之对应的目的物理地址。 如果找到对应的物理地址, 就不用进行地址解析, 否则需要进行地址解析。 2) 实现地址解析的第一步是产生 ARP 请求分组。 在相应的字段写入本地主机的源物理 地址、源 IP 地址,在目的物理地址字段写入 0,并在操作字段写入 1。 3) 将 ARP 分组发送到本地的数据链路层,并封装成帧。以源物理地址作为源地址,以
课程设计任务书
学院 学生姓名 设计题目 计算机科学与技术学院 专业 学号 通信工程
解析 ARP 数据包
内容及要求:
1. 2. 3. 本课程以教师讲授和学生自学同步的方式进行,学校可提供上机操作,提高实际操 作,设计能力。主要功能为设计程序,实现程序 在完成基本技巧的讲解后,学号尾号相同的同学自行分成一组,布置不同的题目。 学生独立完成 教师面对面当场检查学生掌握程序情况, 根据学生的学习情况及题目的完成情况评 定成绩。
一、
3,当程序接收到键盘输入 Ctrl+C 时字段
三、 相关知识
ARP 数据报的消息格式 网络上的每台主机或设备都有一个或多个 IP 地址。IP 地址是网络层的地址, 在网络层,数据被组装成 IP 包。但是发送 IP 包需要物理设备的支持(通常是 Ethernet 设备,在本课程设计中我们指定为 Ethernet 设备) ,即发送端必须知道 目的物理地址才能将 IP 包发送出去,所以需要一种将 IP 地址映射为物理地址 的机制。ARP 协议就是用来完成这个任务的。ARP 协议能够在同一个物理网络 中,在给定目的主机或设备的 IP 地址的条件下,得到目的主机或设备的物理地 址。ARP 协议的数据包格式如图所示: 0 8 16 24 31(位) 硬件类型 协议类型 物理地址长度 协议地址长度 操作 源物理地址(八位组 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 分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示 a)
四、课程设计分析
1. 课程设计中的重点及难点 1) 程序中会用到 Winpcap,Winpcap 是 Win32 环境下数据包捕获的开放代码函数 库。基于 Winpcap 的应用程序一般按照下面几个步骤进行设计: 输出网卡设备列表。 选择网卡并打开。 捕获数据包时,可能需要设置过滤器。 捕获数据包或者发送数据包。 2) 在程序设计过程中需要注意网络—主机字节顺序的转化。由于不同的计算机系 统所采用的数据表示方式不同,对于 2B 或 4B 的数据,有的采用低字节地址存 放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据 传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表 示长度或类型的数据转换成本地机的表达形式。 可以利用函数 ntohs()将网络字 节序转换为主机字节序。 3) 选择网卡并打开时,注意选择可用的网卡。 参考算法 1) 取得当前网卡设备列表。 2) 选择 Ethernet 网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。 3) 设置过滤器,此处的过滤器正则表达式为“arp”或者“ether proto\\arp” 。 4) 捕获数据包并进行处理(包括输出各 IP 地址,物理地址,操作类型以及时间) 。 由于要记录日志文件,为了便于输出流参数,建议采用 pcap_next_ex()函数。
{ //以混杂模式打开网卡,以接受所有的帧 if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"\nUnable to open the adapter."; pcap_freealldevs(alldevs); return; } if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL) break; } //释放设备列表
进度安排:
第一阶段:在学校计算机房掌握 Visual C++6.0 的基本使用。 第二阶段:学生自己解决上机,安装软件,自己在杂志,专业资料上参考,完成 调试运行并打印出来,添加封面,完成课程设计。
指导教师(签字) :
学院院长(签字) :
年
月
日
年
月
日
目录
1. 课程设计目的………………………………………2 2. 课程设计要求………………………………………2 3. 相关知识………………………………………………2 1) ARP 数据报的消息格式……………………3 2) ARP 协议的工作流程………………………..4 4. 课程设计分析……………………………………….5 1) 课程设计中的重点及难点………………..5 2) 参考算法………….……………………………….6 3) 核心代码…………………………………………..7 5. 相关扩展………………………………………………8 6. 心得体会………………………………………………10 7. 参考文献………………………………………………11
循环捕获 ARP 包,并进行解析
ห้องสมุดไป่ตู้
while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { 输出 ARP 数据包的各个域的内容到文件和屏幕上 } 源程序
#include<winsock2.h> #pragma comment(lib,"Ws2_32.lib") //用到 ntobs() //等同于点击"project-setting-link"打开 object/library module 编辑框后加入文件 #pragma comment(lib,"wpcap.lib") #include "pcap.h" #include<fstream.h> //此头文件没有包含在 VC 中,需要另外加入
编译过滤器并设置过滤器,只捕获 ARP 数据包
//过滤,选择 arp 协议
char packet_filter[]=”ether proto \\arp”; {
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) cout<<"\nUnable to compile the packet filter.Check the syntax.\n"; pcap_freealldevs(alldevs); return; } //设置过滤器 if(pcap_setfilter(adhandle,&fcode)<0) { cout<<"\nError setting the filter.\n"; pcap_freealldevs(alldevs); return; }
#include<iomanip.h> #include<conio.h>
//格式化输出需要用到 //用到_getch()
//注意到接收的数据包头中代表类型,数据长度的字段采用的是 big-endian //所以对于 2B/4B 的数据要用 ntohs()转换为本机形式 //ARP 包结构 struct arppkt{ unsigned short hdtyp; unsigned short protyp; unsigned char hdsize; unsigned char prosize; unsigned short op; u_char smac[6]; u_char sip[4]; u_char dmac[6]; u_char dip[4]; }; void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out); void main(int argc,char *argv[ ]) { if(argc!=2) { cout<<"Usage:arpparse logfilename"<<endl; cout<<"press any key to continue."<<endl; _getch(); return; } pcap_if_t *alldevs; pcap_if_t *d; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; u_int netmask; char packet_filter[]="ether proto \\arp"; struct bpf_program fcode; struct pcap_pkthdr *header; const u_char *pkt_data; if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Error in pcap_findalldevs:"<<errbuf; return; } for(d=alldevs;d;d=d->next) //硬件类型.值 0001
课程设计目的: 本课程设计的目的是对网络上的 ARP 数据包进行解析,从而熟悉 ARP 数据包 的结构,对 ARP 协议有更好的理解和认识。 二、 课程设计要求: 通过编制程序,获取网络中的 ARP 数据包,解析数据包的内容,将结果显示 在标准输出上,并同时写入日志文件。 程序的具体要求如下所示: 1,以命令行的形式运行,如下所示: arpparse logfile 其中,arpparse 为程序名;logfile为日志文件名。 2,程序输出内容如下所示: 源IP地址 源MAC地址 目的IP地址 操作 时间 各部分的说明如下所示: 源 IP 地址:输出 ARP 消息格式中的源 IP 地址字段 源 MAC 地址:输出 ARP 消息格式中的源物理地址字段 目的 IP 地址:输出 ARP 消息格式中的目的 IP 地址字段。 目的 MAC 地址:输出 ARP 消息格式中的目的物理地址字段 操作:输出 ARP 消息格式中的操作字段,若为 ARP 请求,则为 1,若为 ARP 应答,则为 2, 时间:该 ARP 包产生的时间