ARP 报文格式 完全解析


结构ether_header定义了以太网帧首部;结构arphdr定义了其后的5个字段,其信息
用于在任何类型的介质上传送ARP请求和回答;ether_arp结构除了包含arphdr结构外,
还包含源主机和目的主机的地址。

定义常量

#define EPT_IP   0x0800    /* type: IP */
#define EPT_ARP   0x0806    /* type: ARP */
#define EPT_RARP 0x8035    /* type: RARP */
#define ARP_HARDWARE 0x0001    /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001    /* ARP request */
#define ARP_REPLY 0x0002    /* ARP reply */

定义以太网首部
typedef struct ehhdr 
{
unsigned char eh_dst[6];   /* destination ethernet addrress */
unsigned char eh_src[6];   /* source ethernet addresss */
unsigned short eh_type;   /* ethernet pachet type */
}EHHDR, *PEHHDR;

定义以太网arp字段
typedef struct arphdr
{
//arp首部
unsigned short arp_hrd;    /* format of hardware address */
unsigned short arp_pro;    /* format of protocol address */
unsigned char arp_hln;    /* length of hardware address */
unsigned char arp_pln;    /* length of protocol address */
unsigned short arp_op;     /* ARP/RARP operation */

unsigned char arp_sha[6];    /* sender hardware address */
unsigned long arp_spa;    /* sender protocol address */
unsigned char arp_tha[6];    /* target hardware address */
unsigned long arp_tpa;    /* target protocol address */
}ARPHDR, *PARPHDR;

定义整个arp报文包,总长度42字节
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET, *PARPPACKET;

ARP请求包的分析:如下所示为一个ARP请求包

0000   ff   ff    ff    ff   ff   ff 00 0c f1 d4 d9 60 08 06 00 01 ...........`....
0010   08 00 06 04 00 01 00 0c f1 d4 d9 60 c0 a8 01 0f ...........`....
0020   00 00 00 00 00 00 c0 a8 01 02                              ..........
根据定义,头6个字节是以太网目的地址 ff ff ff ff ff ff 这是一个广播地址,全网下的所有终端都能接收到,紧跟着的6个字节是以太网源地址,即发送者的MAC地址( 00 0c f1 d4 d9 60 是我的MAC地址)。

帧类型0806占两个字节,到这里以太网帧头就结束了。0806指的是后面的数据是属于arp包的。

接着分析ARP包头。头两个字节是硬件类型 00 01,接着两个字节是协议类型,即ARP使用的是IP协议代号08 00硬件地址长度和协议地址长度分别是6和4。这与ARP报文格式是对应的。后面的2个字节OP指示当前包是请求包还是应答包,对应的值分别是0x0001和0x0002。原始数据里是00 01所以这是一个请求包,然后6个字节又是发送者MAC地址00 0c f1 d4 d9 60 ,后面4个字节是发送者IP地址c0 a8 01 0f ,转换成点分十进制格式即192.168.1.15,这是我的IP,接下来的6个字节留空,00 00 00 00 00 00 在arp请求包里也可以是其他数据,因为稍后IP地址为c0 a8 01 02 (192.168.1.2)会把自己的MAC地址填充进这6个字节中。
填充完后,arp包里的发送者硬件地址|目标硬件地址和以太网首部的以太网目的地址|以太网源地址正好对调。最后把这个封装好的ARP包发送出去,这样一个来回就可以让两台终端互相知道对方的IP和MAC。

ARP欺骗的3种基本方式:

1. 主机C冒充网关欺骗主机B;

2. 主机c冒充主机B欺骗网关;

3. 主机C同时欺骗主机B和网关,实现数据中转,并监听到所有主机B的数据。

PT下仿真如下:

 

这是使用的是Ethernet V2 MAC帧,然后封装ARP帧。另一台机器会返回:

这样两台PC都知道ip和MAC地址了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你的问题。 首先,ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址转换为物理MAC地址的协议。在同一网络,主机通过ARP协议来获取通信对方的MAC地址,以便进行通信。 当一个主机向另一个主机发送数据时,它首先会在自己的ARP缓存查找目标主机的MAC地址。如果缓存没有该地址,主机就会广播一个ARP请求报文,请求目标主机回应自己的MAC地址。目标主机收到请求后,会回应一个ARP应答报文,其包含自己的MAC地址。 现在回到你的问题,当你在同一网络的主机之间执行ping命令时,会产生ARP请求和应答报文。 在Windows命令行窗口执行命令“arp -a”可以查看计算机的ARP缓存表,其存储了已知主机的IP地址和对应的MAC地址。 执行命令“arp -d”可以清空ARP缓存表,这样可以强制主机重新获取目标主机的MAC地址,而不是使用缓存的信息。 启动抓包软件(如Wireshark),可以捕获网络上的数据包。执行命令“ping 192.168.1.48”后,会产生ARP请求和应答报文,这些报文可以在抓包软件查看和分析。 ARP请求报文的格式如下: - 目标MAC地址:全为0 - 源MAC地址:发送方的MAC地址 - 协议类型:0x0806(表示ARP协议) - 硬件类型:1(表示以太网) - 协议类型:0x0800(表示IPv4) - 硬件地址长度:6(表示MAC地址长度) - 协议地址长度:4(表示IPv4地址长度) - 操作码:1(表示ARP请求) - 发送方MAC地址:发送方的MAC地址 - 发送方IP地址:发送方的IP地址 - 目标MAC地址:全为0 - 目标IP地址:目标主机的IP地址 ARP应答报文的格式如下: - 目标MAC地址:目标主机的MAC地址 - 源MAC地址:发送方的MAC地址 - 协议类型:0x0806(表示ARP协议) - 硬件类型:1(表示以太网) - 协议类型:0x0800(表示IPv4) - 硬件地址长度:6(表示MAC地址长度) - 协议地址长度:4(表示IPv4地址长度) - 操作码:2(表示ARP应答) - 发送方MAC地址:目标主机的MAC地址 - 发送方IP地址:目标主机的IP地址 - 目标MAC地址:发送方的MAC地址 - 目标IP地址:发送方的IP地址 当主机收到ARP请求报文后,会查看目标IP地址是否为自己的IP地址。如果是,就会回应一个ARP应答报文,其包含自己的MAC地址。发送方收到ARP应答报文后,就可以将目标主机的MAC地址存储在自己的ARP缓存,以便进行下一次通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值