最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

计算机网络解析ARP数据包

来源:动视网 责编:小OO 时间:2025-10-02 00:53:18
文档

计算机网络解析ARP数据包

成绩评定表学生姓名班级学号1103050409专业计算机科学与技术课程设计题目解析ARP数据包评语组长签字:成绩日期20年月日课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名班级学号课程设计题目解析ARP数据包实践教学要求与任务:1.课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。2.通过编写程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。工作计划与进度安排:第15周星期一
推荐度:
导读成绩评定表学生姓名班级学号1103050409专业计算机科学与技术课程设计题目解析ARP数据包评语组长签字:成绩日期20年月日课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名班级学号课程设计题目解析ARP数据包实践教学要求与任务:1.课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。2.通过编写程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。工作计划与进度安排:第15周星期一
成 绩 评 定 表

学生姓名班级学号1103050409
专  业

计算机科学与技术课程设计题目解析ARP数据包

组长签字:

成绩
日期

             20   年  月  日

课程设计任务书

学  院

信息科学与工程学院专 业

计算机科学与技术
学生姓名班级学号
课程设计题目解析ARP数据包

实践教学要求与任务:

1. 课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉

ARP数据包的结构,对ARP协议有更好的理解和认识。

2. 通过编写程序,获取网络中的ARP数据包,解析数据包的内容,

将结果显示在标准输出上,并同时写入日志文件。

工作计划与进度安排:

第15周

星期一:设计任务分析和总体设计

星期二:软件算法和流程设计

星期三:软件编码实现

星期四:软件总体调试

星期五:交课程设计报告、答辩、验收程序

指导教师:

   201  年  月  日

专业负责人:

201   年  月  日

学院教学副院长:

201   年  月  日

目  录

摘 要

1  课程设计目的............................................................1

2  课程设计要求    1

3    相关知识    1

4    课程设计分析    1

5    程序代码    1

6    运行结果与分析    1

7  个人心得...................................................................1

8    参考文献    1

摘 要

     本文首先介绍了解析ARP数据包课程设计的目的与意义,本次课程设计的要求,接着说明了,什么是ARP?ARP数据报消息格式以及ARP协议的工作流程加强我们对ARP协议的认识,然后分析了本次课程设计的难点、重点、参考算法、核心代码,以及对运行结果的分析,还有一些相关知识的拓展。最后对本次课设进行了个人心得的总结。

1课程设计目的

    课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉

ARP数据包的结构,对ARP协议有更好的理解和认识。

2  课程设计要求

    通过编写程序,获取网络中的ARP数据包,解析数据包的内容,

将结果显示在标准输出上,并同时写入日志文件。

程序的具体要求如下所示:

(1)以命令行的形式运行,如下所示:

ParseArp log_file其中,arpparse为程序名;log_file为日志文件名。

(2)程序输出内容如下所示:

源IP地址 源MAC地址 目的IP地址 目的MAC地址 操作 时间

各部分的说明如下所示:

源IP地址:输出ARP消息格式中的源IP地址字段

源MAC地址:输出ARP消息格式中的源物理地址字段

目的IP地址:输出ARP消息格式中的目的IP地址字段。

目的MAC地址:输出ARP消息格式中的目的物理地址字段

         操作:输出ARP消息格式中的操作字段,若为ARP请求,

         则为1,若为ARP应答,则为2。

时间:该ARP包产生的时间。

(3)当程序接收到键盘输入Ctrl+C时字段退出。

3相关知识

(1)什么是ARP

地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在ATM和FDDIIP网络中使用。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。

    在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。   

另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的某个端口的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)。

(2)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数据包封装成一个帧

(3)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高速缓存表。

源结点将有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发送到目的主机。

4课程设计分析

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()函数。

流程图如图所示:

5程序代码

#include

#include

#include

#include"pcap.h"

#include

#pragma comment(lib,"ws2_32.lib")

#pragma comment(lib,"wpcap.lib")

//定义ARP包数据

struct arppkt

{

    unsigned short hdtyp;              //硬件类型

    unsigned short protyp;             //协议类型

    unsigned char hdsize;              //硬件地址长度

    unsigned char prosize;             //协议地址长度

    unsigned short op;                //(操作类型)操作值:   ARP/RARP

    u_char smac[6];                  //源MAC地址

    u_char sip[4];                    //源IP地址

    u_char dmac[6];                  //目的MAC地址

    u_char dip[4];                    //目的IP地址

};

void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out)

{

    //从ARP包中找到头部位置

    arppkt* arph = (arppkt *)(pkt_data +14);

    //输出源IP地址

for(int i=0;i<3;i++)

out<sip[i])<<'.';

    out.setf(ios::left);

out<sip[3])<<" ";

    out.unsetf(ios::left);

    //输出源MAC地址

    char oldfillchar=out.fill('0');

    out.setf(ios::uppercase);

for(i=0;i<5;i++)

out<smac[i])<<'-';

out<smac[5])<<" ";

    out.fill(oldfillchar);

    out.unsetf(ios::hex|ios::uppercase);

    //输出目的IP地址

for(i=0;i<3;i++)

out<dip[3])<<'.';

    out.unsetf(ios::left);

out<dip[3])<<' ';

    out.unsetf(ios::left);

    //输出目的MAC地址

    out.fill('0');

    out.setf(ios::uppercase);

for(i=0;i<5;i++)

         out<dmac[i])<<'-';

out<dmac[5])<<" ";

    out.fill(oldfillchar);

    out.unsetf(ios::hex|ios::uppercase);

    //输出操作类型

out<op)<<" ";

    //输出操作时间

    struct tm *ltime;

ltime=localtime(&header->ts.tv_sec);

    out.fill('0');

out<tm_hour<<':'<tm_min<<':'<tm_sec;

    out.fill(oldfillchar);

out<}

void main(int argc,char *argv[ ])//命令行参数

{

    //检查输入命令格式

    if(argc!=2)

    {

        cout<<"Please  input  command: ParseArp output_file"<        

        

        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_find all devs:"<        return;

    }

    //选取一个Ethernet网卡

for(d=alldevs;d;d=d->next)

    { 

    //    网卡设为混杂模式,接收所有帧

        if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL)

        {

            cout<<"\\nUnable to open the adapter.";

            pcap_freealldevs(alldevs);

            return;

        }

        //检查数据链路是否为Ethernet

        if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL)

            break;

    }

if(d==NULL)

{

cout<<"\\nNo interfaces found! Make sure Winpcap is installed.\\n";

    return;

}

//获得子网掩码

netmask=((sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;

//编译过滤器,只捕获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;

}

//显示提示信息及每项含义

cout<<"listening on "<description<<"..."<ofstream fout(argv[1],ios::app);   //日志记录文件

//为了查看日志时的方便,其中加入了日期记录

time_t t;

time(&t);

fout.seekp(0,ios::end);

if(fout.tellp()!=0)

fout<fout<<"\\ARP request(1)/reply(2) on"<cout<<"Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address"<<" "<<"OP"<<" "<<"Time"<fout<<"Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Address" <<" "<<"OP"<<" "<<"Time"<//释放设备列表

pcap_freealldevs(alldevs);

//开始截获ARP包

int result;

while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0)

{   //循环解析ARP数据包

    if(result==0)

       continue;

    //解析ARP包,结果输出到屏幕与文件

    packet_handler(header,pkt_data,cout);

    packet_handler(header,pkt_data,fout);

}

}

6运行结果与分析

相关扩展与分析:

本课程设计还可以在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步之间进行循环,直到强行退出为止。

7 个人心得

    本次课程设计,完成了在xp环境下的解析ARP数据包。在具体实现获取网络中的ARP数据包解析数据包的内容,并将其写入日志文件的过程中,是我更加清楚物理地址、IP地址的关联,源地址与目的地址的关系,以及二者对数据类型的格式要求。最重要的是通过这次的实际训练让我对ARP协议更加理解。为了完成本次课程设计查阅了大量的资料,学到了很多知识,使我对计算机网络有了更深入的了解。我觉得这次课程设计我觉得收获挺大的。之前的学习仅限于书本,网络的很多东西都只知道其然而不知道其所以然。通过这次课程设计,我也领略到网络安全的一些知识,例如ARP欺骗,黑客等等,,同时也锻炼实践能力。随着科学技术发展的日新月异,网络已经成为当今计算机发展中空前活跃的领域,在生活中可以说是无处不在,特别是我们在寝室上网的时候,也涉及到ARP欺骗的问题,网络安全特别引起我们的注意,我感觉这次的课设,通过上网查资料,我也学到了很多网络安全的知识,以后对付一些简单的网络攻击,应该还行。

8参考文献

[1]谢希仁 编著.  计算机网络 (第5版) .北京:电子工业出版社,2008

[2]吴宜功  吴英 编著. 计算机网络课程设计 (第2版).   北京: 机械工业出版社,2012

[3]百度百科

文档

计算机网络解析ARP数据包

成绩评定表学生姓名班级学号1103050409专业计算机科学与技术课程设计题目解析ARP数据包评语组长签字:成绩日期20年月日课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名班级学号课程设计题目解析ARP数据包实践教学要求与任务:1.课程设计的目的是对网络上的ARP数据包进行解析,从而熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。2.通过编写程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。工作计划与进度安排:第15周星期一
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top