一、什么是ARP协议
ARP协议,全称是Address Resolution Protocol,即地址解析协议。
ARP协议的作用,就是在已知目标设备的IP地址但是不知道其MAC地址的时候,根据IP地址,获取到其MAC地址,以便组成完整的IP包进行通信。
完整的IP数据包,由目标MAC、源MAC、目标IP、源IP等等信息组成。关于IP协议包部分,后面我们再讨论,本文只讨论怎么根据IP地址获取MAC地址。
完整的ARP协议包含两部分,ARP请求和ARP应答。
下图是ARP请求的示意图,主机AIP地址为192.168.1.102,需要获取192.168.1.10这个IP地址的设备的MAC地址,便会以单播的形式发送ARP请求包。
下图是ARP应答的示意图。主机B的IP地址刚好为192.168.1.10,那么他收到ARP请求包后,会返回ARP应答包,该数据包中包含主机B的MAC地址。
二、ARP 协议结构
ARP数据包的格式如下图:
具体解析如下:
名称 | 字节数 | 数值 | 含义 |
硬件类型 | 2字节 | 0x0001 | 硬件地址的类型,此处应为以太网硬件,固定为0x0001 |
协议类型 | 2字节 | 0x0800 | 要映射的协议地址类型。ARP 协议的上层协议是IP协议,即获取IP协议的MAC地址,此处为IP协议类型,即0x0800。 |
硬件地址长度 | 1字节 | 0x06 | MAC 地址长度,MAC地址固定6个字节 |
协议地址长度 | 1字节 | 0x04 | IP 地址的长度,固定为4个字节 |
OP | 2字节 | / | 操作码,0x0001表示ARP请求,0x0002表示ARP应答 |
源MAC地址 | 6字节 | / | 发送端的MAC地址,比如0x0011_2233_4455 |
源IP地址 | 4字节 | / | 发送端的IP地址,比如192.168.1.10 |
目的MAC地址 | 6字节 | 0x0000_0000_0000 | 目标设备的MAC地址,由于此地址未知,此处应该是0x0000_0000_0000 |
目的IP地址 | 4字节 | / | 目标设备的IP地址 |
这里需要注意的是,由于以太网协议中有效数据最少是46字节,而ARP数据包总共为28字节,因此为了满足以太网传输的要求,需要填充18个字节的数据(一般填充0x00)。
三、ARP协议在以太网协议中的组帧
根据以太网协议的格式,参考文章:
以太网帧格式解析-CSDN博客https://blog.csdn.net/yindq1220/article/details/138027595?spm=1001.2014.3001.5502将ARP数据摆放到以太网协议中,形成下图的格式。
准确的字段描述可以参考下表:
协议类型 | 名称 | 字节数 | 数值 | 含义 |
数据同步 | 前导码 | 7字节 | 0x55_5555_5555_5555 | |
帧起始界定符 | 1字节 | 0xD5 | ||
以太网协议 | 目的MAC地址 | 6字节 | / | |
源MAC地址 | 6字节 | / | ||
长度/类型 | 2字节 | / | ||
ARP 协议 | 硬件类型 | 2字节 | 0x0001 | |
协议类型 | 2字节 | 0x0800 | ||
硬件地址长度 | 1字节 | 0x06 | ||
协议地址长度 | 1字节 | 0x04 | ||
OP | 2字节 | / | ||
源MAC地址 | 6字节 | / | ||
源IP地址 | 4字节 | / | ||
目的MAC地址 | 6字节 | 0x0000_0000_0000 | ||
目的IP地址 | 4字节 | / | ||
18字节的填充 | 18字节 | 0x00 | ||
以太网协议 | 校验FCS | 4字节 | / |
四、实际举例
下图是从wiresharkz中抓包的ARP请求和ARP应答包。
主机192.168.10.151请求主机192.168.10.100的MAC地址。然后主机192.168.10.100返回其MAC地址为E880_88BA_9F36。
ARP请求包的具体数据如下:
将数据带入到ARP协议的以太网帧中,表示如下:
协议类型 | 名称 | 字节数 | 数值 | 含义 |
以太网协议 | 目的MAC地址 | 6字节 | 0xFFFF_FFFF_FFFF | 广播MAC地址 |
源MAC地址 | 6字节 | 0x0006_7743_EB39 | ||
长度/类型 | 2字节 | 0x0806 | ARP协议 | |
ARP 协议 | 硬件类型 | 2字节 | 0x0001 | |
协议类型 | 2字节 | 0x0800 | 请求IP协议的MAC地址,为IP协议类型 | |
硬件地址长度 | 1字节 | 0x06 | ||
协议地址长度 | 1字节 | 0x04 | ||
OP | 2字节 | 0x0001 | ARP请求 | |
源MAC地址 | 6字节 | 0x0006_7743_EB39 | ||
源IP地址 | 4字节 | 0xC0A8_0A97 | 发送端的IP地址:192.198.10.151 | |
目的MAC地址 | 6字节 | 0x0000_0000_0000 | 未知目标的MAC地址,因此为全0 | |
目的IP地址 | 4字节 | 0xC0A8_0A64 | 目标的IP地址:192.168.10.100 | |
18字节的填充 | 18字节 | 0x00 | 填充18字节0, |
ARP应答包具体数据如下:
将数据带入到ARP协议的以太网帧中,表示如下:
协议类型 | 名称 | 字节数 | 数值 | 含义 |
以太网协议 | 目的MAC地址 | 6字节 | 0x0006_7743_EB39 | 目标MAC地址 |
源MAC地址 | 6字节 | 0xE880_88BA_9F36 | 源MAC地址 | |
长度/类型 | 2字节 | 0x0806 | ARP协议 | |
ARP 协议 | 硬件类型 | 2字节 | 0x0001 | |
协议类型 | 2字节 | 0x0800 | 请求IP协议的MAC地址,为IP协议类型 | |
硬件地址长度 | 1字节 | 0x06 | ||
协议地址长度 | 1字节 | 0x04 | ||
OP | 2字节 | 0x0002 | ARP应答 | |
源MAC地址 | 6字节 | 0xE880_88BA_9F36 | ||
源IP地址 | 4字节 | 0xCA08_0A64 | 源IP地址:192.168.10.100 | |
目的MAC地址 | 6字节 | 0x0006_7743_EB39 | ||
目的IP地址 | 4字节 | 0xC0A8_0A97 | 源IP地址:192.168.10.151 | |
18字节的填充 | 18字节 | 0x00 | 此处正常应该有18个字节的填充,但是电脑的ARP应答中未增加此填充。我们自己做设计的时候,建议还是按照标准协议,增加上18字节的填充。 |
PS.在wireshark抓包中,未抓取网卡处理前的数据,只抓取了网卡处理后的数据。所以我们在报文中没有看到前导码+帧起始界定符+校验序列(此三部分字段一般在网卡的MAC控制器中处理)。