计算机网络课程设计报告 解析ARP数据包含C++源码
更新时间:2024-01-25 11:09:01 阅读量: 教育文库 文档下载
课程设计任务书
学院 学生姓名 设计题目 计算机科学与技术学院 专业 学号 通信工程 解析ARP数据包 内容及要求: 1. 本课程以教师讲授和学生自学同步的方式进行,学校可提供上机操作,提高实际操作,设计能力。主要功能为设计程序,实现程序 2. 在完成基本技巧的讲解后,学号尾号相同的同学自行分成一组,布置不同的题目。学生独立完成 3. 教师面对面当场检查学生掌握程序情况,根据学生的学习情况及题目的完成情况评定成绩。 进度安排: 第一阶段:在学校计算机房掌握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数据包进行解析,从而熟悉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包产生的时间
3,当程序接收到键盘输入Ctrl+C时字段
三、 相关知识
a) 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分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示
ARP消息
帧头部 帧数据 将ARP数据包封装成一个帧 b)ARP协议的工作流程。
1) 在发送一个ARP分组之前,源主机首先根据目的IP地址,在本地ARP高速缓存表
中查找与之对应的目的物理地址。如果找到对应的物理地址,就不用进行地址解析,否则需要进行地址解析。
2) 实现地址解析的第一步是产生ARP请求分组。在相应的字段写入本地主机的源物理
地址、源IP地址,在目的物理地址字段写入0,并在操作字段写入1。
3) 将ARP分组发送到本地的数据链路层,并封装成帧。以源物理地址作为源地址,以
4)
5)
6) 7)
物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。
由于采用了广播地址,因此网段内所有的主机或设备都能接受到该帧。除了目的主机外,所有接受到该分组的主机和设备都会丢弃该分组,因为目的主机能够识别ARP消息中的目的IP地址。
目的主机发送ARP应答分组。在ARP应答分组中,以请求分组中源物理地址、源IP地址作为其目的物理地址、目的IP地址,并将目的主机自身的物理地址、IP地址填入应答分组的源物理地址、源IP地址字段,并在操作字段中写入2。该分组通过数据链路层以点对点的方式发送出去(因为现在目的方已经知道双方的物理地址)。 源结点接收到ARP应答分组,知道对应于目的IP地址的目的物理地址,将它作为一条新记录加入到ARP高速缓存表。
源结点将有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发送到目的主机。
四、课程设计分析
1. 课程设计中的重点及难点
1) 程序中会用到Winpcap,Winpcap是Win32环境下数据包捕获的开放代码函数
库。基于Winpcap的应用程序一般按照下面几个步骤进行设计:
? 输出网卡设备列表。 ? 选择网卡并打开。
? 捕获数据包时,可能需要设置过滤器。 ? 捕获数据包或者发送数据包。
2) 在程序设计过程中需要注意网络—主机字节顺序的转化。由于不同的计算机系
统所采用的数据表示方式不同,对于2B或4B的数据,有的采用低字节地址存放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表示长度或类型的数据转换成本地机的表达形式。可以利用函数ntohs()将网络字节序转换为主机字节序。
3) 选择网卡并打开时,注意选择可用的网卡。 2. 参考算法
1) 取得当前网卡设备列表。
2) 选择Ethernet网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。 3) 设置过滤器,此处的过滤器正则表达式为“arp”或者“ether proto\\\\arp”。 4) 捕获数据包并进行处理(包括输出各IP地址,物理地址,操作类型以及时间)。
由于要记录日志文件,为了便于输出流参数,建议采用pcap_next_ex()函数。
流程图如图所示:
开始 获取网卡列表 选取Ethernet网打开网卡(混杂模式) 编译设置过滤器 捕获ARP包并将其相应内容输出
3. 核心代码
? ARP数据包结构
struct arppkt{ };
unsigned short hdtyp; //硬件类型。值0001表示其为Ethernet unsigned short protyp; //协议类型。值0800表示上层协议为IP unsigned char hdsize; //硬件地址长度。值为06 unsigned char prosize; //协议地址长度。值为04
unsigned short op; //操作值为0001/0002,分别表示ARP请求/应答 u_char smac[6]; //源MAC地址,6B u_char sip[4]; //源IP地址,4B u_char dmac[6]; //目的MAC地址 u_char dip[4]; //目的IP地址
? 获取网络设备列表,并以混杂模式打开网络设备
//获取网络设备列表
if(pcap_findalldevs(&alldevs,errbuf)==-1)
{ }
for(d=alldevs;d;d=d->next)
cout<<\return;
//选择Ethernet卡
{ }
if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { }
if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL)
break;
cout<<\pcap_freealldevs(alldevs); //释放设备列表 return;
//以混杂模式打开网卡,以接受所有的帧
? 编译过滤器并设置过滤器,只捕获ARP数据包
char packet_filter[]=”ether proto \\\\arp”; //过滤,选择arp协议 if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) { cout<<\ pcap_freealldevs(alldevs); return; }
//设置过滤器
if(pcap_setfilter(adhandle,&fcode)<0) { cout<<\ pcap_freealldevs(alldevs); return; }
? 循环捕获ARP包,并进行解析
while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) {
输出ARP数据包的各个域的内容到文件和屏幕上 } ?
源程序
#include
#pragma comment(lib,\用到ntobs()
//等同于点击\打开object/library module编辑框后加入文件 #pragma comment(lib,\
#include \此头文件没有包含在VC中,需要另外加入 #include
#include
//注意到接收的数据包头中代表类型,数据长度的字段采用的是big-endian //所以对于2B/4B的数据要用ntohs()转换为本机形式 //ARP包结构 struct arppkt{ };
void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out); void main(int argc,char *argv[ ]) {
if(argc!=2) { }
pcap_if_t *alldevs; pcap_if_t *d; pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE]; u_int netmask;
char packet_filter[]=\struct bpf_program fcode; struct pcap_pkthdr *header; const u_char *pkt_data;
if(pcap_findalldevs(&alldevs,errbuf)==-1) { }
for(d=alldevs;d;d=d->next)
cout<<\return;
cout<<\cout<<\_getch(); return;
unsigned short hdtyp; //硬件类型.值0001 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];
{
{ }
if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { }
if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addressess!=NULL)
break;
cout<<\pcap_freealldevs(alldevs); return;
if(d==NULL)
cout<<\ return; }
//获得子网掩码
netmask=((sockaddr_in *)(d->netmask))->sin_addr.s_un.s_addr; //编译过滤器,只捕获ARP包
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)
{ cout<<\ pcap_freealldevs(alldevs); return; }
//设置过滤器
if(pcap_setfilter(ashandle,&fcode)<0) { cout<<\ pcap_freealldevs(alldevs); return; }
cout<<\//显示提示信息及每项含义
ofstream fout(argv[1],ios::app); //日志记录文件 //为了查看日志时的方便,其中加入了日期记录 time_t t; time(&t);
fout.seekp(0,ios::end); if(fout.tellp()!=0) fout< fout<<\cout< <<\//释放设备列表 pcap_freealldevs(alldevs); int result; while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { if(result==0) continue; packer_handler(header,pkt_data,cout); packet_handler(header,pkt_data,fout); } } void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out) { arpkt* arph = (arppkt *)(pkt_data +14); for(int i=0;i<3;i++) out< out< out< out.unsetf(ios::hex|ios::uppercase); for(i=0;i<3;i++) out< out.unsetf(ios::left); //输出目的MAC地址 out.fill('0'); out.setf(ios::uppercase); for(i=0;i<5;i++) out< out.unsetf(ios::hex|ios::uppercase); out< ltime=localtime(&header->ts.tv_sec); out.fill('0'); out< 五、相关扩展 本课程设计还可以在Linux环境下用rawsocket完成。 算法和代码提示: 1) 调用socket()打开协议簇为PF_PACKET的原始套接字,这样我们就可以收到数据 链路帧: int fd = socket(PF_PACKET,SOCK_RAM,htons(ETH_P_ALL)); 2) 对打开的套接字调用ioct1(),将网卡设置为混杂模式,这样我们就可以接受到局 域网中所有的包(包括目的地址不是本机的帧): struct ifreq req; memset (&req,0,sizeof(req)); strncpy(req.ifr_name,”eth0”,strlen(“eth0”)+1); ioctl(fd,SIOCGIFFLAS,&req); req.ifr_flags|=IFF_PROMISC; //设置为混杂模式 icotl(fd, SIOCGIFFLAGS,&req); 3) 利用recvfrom()接收包: recvform(fd,buffer,sizeof(buffer),0,(struct sockaddr *)&from,&from_len); 4) 接收到包后,判断是否为ARP包,若是ARP包则进行处理,否则丢弃。 If( (ntohs(eth_header->ether_type)==0x0806) &&(ntohs(arp_header->ar_hrd)==0x0001) &&(ntohs(arp_header->ar_pro)==0x0800) &&(arp_header->ar_hln==0x06) &&(arp_header->ar_pln==0x04) &&( (ntohs(arp_header->ar_op)==0x01)|| (ntohs(arp_header->ar_op)==0x02))) { 对ARP数据包进行分析并打印 } 5) 算法在3、4步之间进行循环,直到强行退出为止。 六、心得体会 本次课程设计,完成了在xp环境下的解析ARP数据包。 在具体实现获取网络中的ARP数据包解析数据包的内容,并将其写入日志文件的过程中,是我更加清楚物理地址、IP地址的关联,源地址与目的地址的关系,以及二者对数据类型的格式要求。最重要的是通过这次的实际训练让我对ARP协议更加理解。 本次课程设计查阅了大量的案例,学到了很多知识,使我对计算机网络有了更深入的了解。我觉得这次课程设计我觉得收获挺大的。之前的学习仅限于书本,网络的很多东西都只知道其然而不知道其所以然。 课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不在,因此作为二十一世纪的计算机专业的大学生来说掌握网络组网技术是十分重要的。 七、参考资料 1. 谢希人著. 计算机网络(第四版)大连理工大学出版社2003 2. 宋凯等著. 计算机网络. 北京:清华大学出版社 2010 3. 吴功宜等著. 计算机网络课程设计. 北京:机械工业出版社2005.9 4. 李爱华等著. 面向对象程序设计(C++语言). 北京:清华大学出版社2010 } 5) 算法在3、4步之间进行循环,直到强行退出为止。 六、心得体会 本次课程设计,完成了在xp环境下的解析ARP数据包。 在具体实现获取网络中的ARP数据包解析数据包的内容,并将其写入日志文件的过程中,是我更加清楚物理地址、IP地址的关联,源地址与目的地址的关系,以及二者对数据类型的格式要求。最重要的是通过这次的实际训练让我对ARP协议更加理解。 本次课程设计查阅了大量的案例,学到了很多知识,使我对计算机网络有了更深入的了解。我觉得这次课程设计我觉得收获挺大的。之前的学习仅限于书本,网络的很多东西都只知道其然而不知道其所以然。 课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不在,因此作为二十一世纪的计算机专业的大学生来说掌握网络组网技术是十分重要的。 七、参考资料 1. 谢希人著. 计算机网络(第四版)大连理工大学出版社2003 2. 宋凯等著. 计算机网络. 北京:清华大学出版社 2010 3. 吴功宜等著. 计算机网络课程设计. 北京:机械工业出版社2005.9 4. 李爱华等著. 面向对象程序设计(C++语言). 北京:清华大学出版社2010
正在阅读:
计算机网络课程设计报告 解析ARP数据包含C++源码01-25
下载图片教学设计06-11
简历模板08-20
2008-2-21 semi-blank - factory - profile - (2) - 图文12-14
罪刑各论习题(光盘)05-26
2014年杭州百灵时代地铁媒体刊例价08-30
中空注浆锚杆怎样施工11-04
重要的是友谊作文500字06-28
某高校学生公寓计算书06-08
2020年冠军荣誉证书模板内容05-08
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- C++
- 网络课程
- 源码
- 解析
- 包含
- 计算机
- 报告
- 数据
- 设计
- ARP
- 马克思主义理论在高校教育管理工作中的指导作用
- HAAS EC-400 卧式加工中心 常规操作说明书 - 图文
- 一位数码时钟 程序
- 新四军组建时各个山头和干部的来历
- 样卷及答案复变A卷12-13(1)
- 分节总复习3
- 智库评选指标
- 中南大学网络教育课程护理伦理学案例分析
- PlasmaCut1.0-MPC03用户手册
- 第三章 微生物的营养与代谢复习题
- 核心力量训练的作用
- 进展性脑梗死的病因和危险因素
- 2014中考数学复习资料分式与分式方程1
- 监视主力 副图 无未来函数 超准确通达信指标公式源码
- 2012年福布斯全球富豪榜完全名单20120308
- 合肥市人口和计划生育委员会文件
- 山东省《监狱安全防范系统建设技术规范》(DB37T 2640-2014)
- 百年收藏
- 企业法律顾问考试学习忠告及方法每日一练(2014.3.6)
- 沈万三生意经