以太网ARP协议解析

一、什么是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博客icon-default.png?t=N7T8https://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控制器中处理)。

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 15:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 15:20:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 15:20:02       82 阅读
  4. Python语言-面向对象

    2024-04-22 15:20:02       91 阅读

热门阅读

  1. docker Get /v2/: dial tcp: lookup

    2024-04-22 15:20:02       36 阅读
  2. MATLAB图像处理介绍

    2024-04-22 15:20:02       35 阅读
  3. C#参数修饰符params

    2024-04-22 15:20:02       34 阅读
  4. 如何使用Python进行Web开发,如Flask或Django?

    2024-04-22 15:20:02       37 阅读
  5. Process in Semiconductor(半导体工艺)

    2024-04-22 15:20:02       58 阅读
  6. 【Vue 异步更新和 $nextTick】

    2024-04-22 15:20:02       38 阅读