explorer

万丈高楼平地起,勿在浮沙筑高台

0%

使用 Wireshark 观察 ARP 协议

ARP 协议(处于数据链路层)的工作原理是: 1. 当前主机以广播的形式发送 ARP 请求,请求包中包含目标机器的 ip 地址 2. 目标机收到请求后,会返回 ARP 应答,应答包中包含目标机器的 MAC 地址

ARP 报文格式

- 硬件类型:定义物理地址的类型,1 表示 MAC 地址 - 协议类型:要映射的协议地址类型, 0x800 表示 IP 地址 - 硬件和协议地址长度:分别表示后面发送的物理地址和 IP 地址长度,单位为字节 + 对于 MAC 地址来说就是 6 字节,对 IPv4 来说就是 4 字节 - 操作:指出 ARP 类报文类型 + ARP 请求:1 + ARP 应答:2 + RARP 请求:3 + RARP 应答:4 - 发送端及接收端的物理地址和 IP 地址:对于最开始 ARP 请求来说,主机并不知道目标机的物理地址 + 目标机在匹配 IP 地址与自己相符后,会将自己的物理地址填充到 ARP 应答包后返回

ARP 包的长度为 28 字节,这对于数据链路层来说是属于数据部分。 - 有时候会要求该部分最小为 46 字节,所以会增加填充字节(填充内容为 0)。

该 ARP 包最终还需要封装为以太网帧才可以发送,以太网帧格式如下:

- 类型:表示数据的类型,以便于接收方分包。 + 0x800 代表数据报为 IP + 0x806 代表数据报为 ARP

那么假设 ARP 包填充到 46 字节,那么最终以太网帧长度就是 64 字节。

ARP 的缓存

ARP 维护了一个缓存来保存最近访问的机器 IP 地址和物理地址的映射关系(cache 真是个提高效率的好东西)。

ARP 常用命令如下: - arp -a : 查看缓存的映射关系 - arp -d <ip> : 删除对应 ip 的缓存项 - arp -s <ip> <mac> : 添加 ip 和物理地址映射关系

查看 ARP 通信过程

通过观察主机(192.168.11.44)访问 Linux 目标机(192.168.11.67)来查看 ARP 通信过程。

删除缓存

首先要删除其 ARP 缓存,不然无法抓取到 ARP 请求报文:

1
sudo arp -d 192.168.11.67

抓包

在主机使用ping命令,即可触发 ARP:

1
ping 192.168.11.67

如下所示: 可以看到,wireshark 已经抓到了主机发送的 ARP 请求,已经目标机的 ARP 返回。

ARP 请求

从捕获的信息可以看出: 1. ARP 请求就是 28 字节的内容加上以太网帧一共 46 字节(图中显示的 42 字节是没有计算 CRC 的长度),也就是说 ARP 请求没有填充多余的数据 2. 由于请求并不知道目的端的物理地址,所以在以太网帧中填充ff,而在 ARP 帧中填充 00 3. 由于数据类型是 ARP,所以以太网帧中的类型值就是 0x0806 4. 对于 ARP 帧的解析 wireshark 已经分离了各个部分并做了详细的说明

ARP 应答

从捕获的信息可以看出: 1. ARP 应答以太网帧返回长度是 64 字节,也就是说 ARP 应答的内容是填充到了 46 字节。 2. 由于这是应答,所以此时的目的和源的内容就做了一次对调,应答机填充了自己的 MAC 地址 3. 同时在 ARP 包中的操作字段值为 2,也表示这是一个 ARP 应答