一、ARP 技术背景
1.1、网络设备有数据要发送给另一台网络设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须包含目的MAC地址。因此发送端还必须获取到目的MAC地址。通过目的IP地址而获取目的MAC地址的过程是由ARP协议来实现的。
1.2、
ARP 报文格式
主要参数
- 硬件类型:2字节,值为1表示以太网地址
- 协议类型:2字节,0x0800表示IP地址
- 硬件地址长度:1字节,数值为6
- 协议地址长度:1字节,数值为4
- 操作代码:2字节,1表示请求报文,2表示应答报文
- 源MAC地址:6字节
- 源IP地址:4节字
- 目的MAC地址:6字节
- 目的IP地址:4节字
1.3、ARP 报文的以太网封装格式
ARP是个独立的三层协议,并不需要IP协议封装,而是直接生成自己的报文,到达数据链路层后,由数据链路层协议进行封装,一般是以太网协议。封装的过程,就是在ARP报文的前面加上以太网帧头,再加上4字节的冗余校验码结尾,校验码用于检验数据传输是否出现损坏。
以太网帧头一共14个字节,包含目的MAC地址、源MAC地址、帧类型三个字段,如下所示:
主要参数
- 以太网目的地址:6字节,如果是ARP请求报文,该字段为广播MAC地址
- 以太网源地址:6字节
- 帧类型:2字节,0x0806表示是ARP协议
- 帧校验:4字节
1.4、以太网帧最小长度是64个字节,最长1518个字节。封装后的ARP帧,实际就是一个最小以太网帧,包含14个字节的以太网帧头,28个字节的ARP报文,4个字节的以太网帧尾,一共是46个字节,其余18个字节用0来填充,共计64个字节。
二、ARP 原理
2.1、ARP 工作过程:主机A要发送一个数据包给主机C之前,先要获取主机C的MAC地址
2.2、ARP 请求
主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机C的IP地址和全0的MAC地址。由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机C)会对该请求进行处理
目的IP | 源IP | 目的MAC | 源MAC | 类型 |
10.0.0.3 | 10.0.0.1 | 00-00-00-00-00-00 | 00-01-02-03-04-AA | Request |
抓包
2.3、ARP 响应
主机C比较自己的IP地址和ARP请求报文中的目标IP地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
目的IP | 源IP | 目的MAC | 源MAC | 类型 |
10.0.0.1 | 10.0.0.3 | 00-01-02-03-04-AA | 00-01-02-03-04-CC | Reply |
抓包
2.4、ARP 缓存
为了避免重复发送ARP请求,产生大量的广播包,每台主机都有一个ARP缓存列表,当源主机得到 ARP 响应后,将目标主机的 IP 地址和物理地址存入本机 ARP 缓存中,并保留一定时间。下次请求 MAC 地址时,直接查询 ARP 缓存,而无须再发送 ARP 请求,从而节约了网络资源。当缓存生存期结束后,才会再次发送ARP请求报文。
主机A>arp -a
Internet Address Physical Address Type
10.0.0.3 00-01-02-03-04-CC dynamic
主机C>arp -a
Internet Address Physical Address Type
10.0.0.1 00-01-02-03-04-AA dynamic
主机B>arp -a
Internet Address Physical Address Type
10.0.0.1 00-01-02-03-04-AA dynamic