目录
ARP协议并不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。简单来说,ARP协议能够获取到局域网内指定一台主机的MAC地址。
一、为什么需要ARP协议?
假设主机X通过查询路由表知道自己要给路由器A发送报文,经过IP层封装传递到数据链路层,现在数据链路层准备加上自己的报头,但是发现自己并不知道路由器A的Mac地址,仅仅知道路由器A的IP地址。
因此,在将报文转发给路由器A之前,需要先通过ARP协议获取到路由器A的Mac地址。
二、ARP报文的格式
我们在认识MAC帧格式的时候,有一个“类型”字段,当该字段填入 0800 的时候,“数据”字段填入的是 网络层传递下来的IP数据包;当该字段填入 0806 的时候,“数据”字段填入的是 ARP报文(长度为28个字节,PAD是填充字段,因为“数据”字段至少需要46个字节)
字段名 | 字段解析 |
硬件类型 | 指的是链路层网络类型。1为以太网 |
协议类型 | 指的是要用于交换的地址类型,0x0800代表IP地址,也就说我们想要用IP地址来换MAC地址 |
硬件地址长度 | 如果硬件类型填的是以太网,这里填的就是 6,即以太网的地址长度(MAC地址的长度) |
协议地址长度 | 如果协议类型填的是0x0800(IP地址),这里填的就是 4 |
op | 字段为1代表ARP请求,字段为2代表ARP应答 |
发送端以太网地址 | 无 |
发送端IP地址 | 无 |
目的以太网地址 | 发送ARP请求的时候,因为不知道对方的MAC地址,这个地方填 FFFFFF |
目的IP地址 | 无 |
三、主机X发送ARP请求的过程
1、填充ARP报文
按照上述表格里所提示的,依次填充对应的字段
- 硬件协议我们填的是 1(以太网);
- 协议类型填的是 0x0800(IP地址);
- 硬件地址长度是 6;
- 协议地址长度是 4;
- op是 1(ARP请求);
- 发送端以太网地址假设是MacX;
- 发送端IP地址是 IPX;
- 目的以太网地址因为不知道,填全F(FF:FF:FF:FF:FF:FF);
- 的IP地址根据路由表查询得到,假设是IPB。
2、链路层封装ARP报文
从最开始的图来看,ARP在到达物理层之前,还需要经过链路层封装一层报头。
- 目的地址填的是目标设备的Mac地址,但是不知道对方的Mac地址,填入FF:FF:FF:FF:FF:FF表示广播。
- 源地址填的是当前主机X的Mac地址,假设是MacX
- 类型当然是 0806(表示ARP请求)
3、发送ARP请求
因为Mac帧的目的地址填的是 FF:FF:FF:FF:FF:FF,代表在当前局域网内广播,此时当前局域网的每台主机都会收到这个ARP请求,此时就会将ARP请求解包向上交付给ARP协议。如果收到ARP请求的主机发现目的IP地址不匹配,就会直接丢弃这个报文。
那么会继续处理这个请求的只有路由器A了,由于每台主机都有可能收到ARP请求或者ARP响应,因此,路由器A要做的第一件事是先看op字段,发现收到的是ARP请求,此时就会构建ARP响应返回给主机X。
四、IP地址和Mac地址的映射表
主机X通过ARP协议获取到目标设备的Mac地址以后,主机X会维护路由器A的IP地址和Mac地址的映射关系,方便下一次使用。
在命令行中输入 arp -a,展示的就是IP地址和Mac地址的映射表。新增的映射关系是有时间限制的,间到了就会将保存的映射关系清除,下次需要MAC地址的时候重新请求MAC地址。