网络合约协议分析获取并解析ARP

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

成绩: 网络协议分析

报告题目:

获取并解析网络中的ARP数据包

学院:计算机科学与技术学院

专业:计算机科学与技术

班级:0411203

学号:2012211699

姓名:李传根

一、要求及功能

编程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。

运行格式:程序名日志文件

二、原理及方法

2.0什么是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.1、ARP协议及工作原理

ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的

MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC 地址,以保证通信的顺利进行。

ARP的基本运行过程:

1、主机A希望发送数据分组给主机B,但不知道B的物理地址。

2、A发送广播报文,要求B主机用用他的物理地址来响应。

3、网站上所有的主机都接收到这个分组。

4、B识别自己的IP地址,发送响应报文,告诉A自己的物理地址。

2.2、ARP 的分组格式

图一 ARP分组格式

图二物理帧头

图三 ARP帧结构

2.3工作原理

源主机在传输数据前,首先要对数据进行封装,在该过程中会把目的主机的IP地址和MAC地址封装进去。在通信的初始阶段,我们能够知道目的主机的IP 地址,而MAC地址是不知道的。这时如果目的主机和源主机在同一网络内,源主

机会以第二层广播的方式发送ARP请求报文。ARP请求报文中含有源主机的IP

地址和MAC地址,以及目的主机的IP地址。当报文通过广播的方式到达目的主机时,目的主机会响应请求报文,并返回ARP响应报文,从而源主机就可以获得目的主机的MAC地址,同样目的主机也可以获得源主机的MAC地址。如果目的主机和源主机地址不在同一个网络中,源主机发送的IP数据包会送到交换机的默认网关,而默认网关的MAC地址同样可以通过ARP协议获取。经过ARP协议解析IP地址之后,主机会在缓存中保存IP地址和MAC地址的映射条目,此后再进行数据交换只要从缓存中读取映射条目即可。

2.4 ARP包的填充

将命令行的参数作适当的转换后填到ARP分组结构的个字段中即可。

要注意的是,填充请求包时,因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填

充任意值,因为它此时不起作用。“填充数据”字段要填充为0。

三、源程序核心函数说明

#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])<<" ";

相关文档
最新文档