首先我们要知道为什么要有这个协议。我们都知道,网络间的通信需要两个地址:逻辑地址和物理地址。
逻辑地址可以使得不同网络以及没有直接关联的设置之间能够相互通信。物理地址则用来在单一网段中交换机直接连接的设备之间进行通信。
在任何时候,只要一台主机或路由器有IP数据报发送给另外一个主机或路由器,它就要知道接收方的逻辑(IP)地址,但是IP数据报必须封装成帧才能通过物理网络,这就意味着发送方还需要有接收方的物理(mac)地址。
因此需要从逻辑地址到物理地址的映射,而这种映射是通过一种协议来实现的,那就是 地址解析协议(Ad-dress Resolution Protocol,ARP)。
它的解析过程只使用两种数据包:一个ARP请求与一个ARP响应。
逻辑地址就是我们的IP地址,而物理地址就是我们的mac地址。
我们在一个linux系统上输入ifconfig
inet 后面的172.19.0.1就是一个IP地址,ether后面的 02:42:09:23:dc:fb就是一个mac地址。
arp分组的格式
- 硬件类型:这是一个16位字段,用来定义运行ARP的网络的类型。每一个局域网基于其类型被指派给一个整数。例如以太网是类型1。ARP可用于任何物理网络上。
- 协议类型:这是一个16位字段,用来定义使用的协议。ARP可用于任何高层协议。
- 硬件长度:这是一个8位字段,用来定义物理地址的长度,以字节为单位
- 协议长度:这是一个8位字段,用来定义逻辑地址的长度,以字节为单位
- 操作: 这是一个16位字段,用来定义分组的类型。已定义的分组类型有两种:ARP请求(1),ARP回复(2)
- 发送方硬件地址:这是一个可变长度字段,用来定义发送方的物理地址
- 发送方协议地址:这是一个可变长度字段,用来定义发送方的逻辑(IP)地址
- 目标硬件地址: 这是一个可变字段,用来定义目标的物理地址。对于ARP请求报文,这个字段全是0,因为发送方并不知道目标的物理地址。
- 目标协议地址:这是一个可变长度字段,用来定义目标的逻辑(IP)地址。
处理步骤
ARP处理过程需要以下7个步骤
- 发送方知道目标的IP地址
- IP请求ARP创建一个ARP请求报文,填入发送方的物理地址,发送方的IP地址,目标IP地址,对于目标物理地址则全部填入0
- 这个报文被递交给数据链路层,在这一层它被封装成帧,并以发送方的物理地址作为源地址,以物理广播地址作为目标地址
- 每一个主机或路由器都会收到这个帧,因为这个帧包含的是广播地址。所有机器都会取走这个报文并把它交给ARP,但除了目标机器外,其他所有机器都会丢弃这个帧,因为只有目标机器才能认出这是自己的IP地址。
- 目标机器用ARP响应报文进行响应,响应报文中包含了它的物理地址。这个报文使用的是单播形式。
- 发送方收到这个响应报文,现在发送方知道目标机器的物理地址了
- 携带给目标机器的IP数据报现在可以封装成帧,并用单播方式发送到终点。
下面我们通过wireshark抓包来看一下
我们可以看info列,分别是who has 192.168.2.92? Tell 192.168.2.1和192.168.2.92 is at f4:5c:89:a6:34:11。
用大白话来说:
现在广播找人,广播找人,李四(192.168.2.92),李四(192.168.2.92),现在张三(192.168.2.1)找你,他想问你的家庭住址(mac地址)是啥,收到请回答,收到请回答。
因为是广播,大家都能听得到,李四,王五,赵六听到了,王五,赵六一听,不是找我的,就左耳朵进右耳朵出了(取走了这个arp报文但随后就丢弃了) 。
李四一听,这不就是找我的吗,马上找到广播室给张三(192.168.2.1)打电话,告诉张三,我是李四(192.168.2.2),我的家庭地址(mac地址)是f4:5c:89:a6:34:11。所以李四的响应是采用单播方式,而张三的请求是采用广播方式
我们来看下第一个包
Hardware type: Ethernet (1),表示网络类型是以太网,那么是不是还有其他类型呢。
我们可以从下图看到,还有其他类型
Protocol type: IPv4 (0x0800) 表示协议类型是IPv4
Hardware size: 6 表示硬件长度是6个字节
Protocol size: 4 表示协议长度是4个字节
Opcode: request (1)
从这可以看到,这是一个ARP请求报文
Sender MAC address: RalinkTe_a1:2f:07 (00:0c:43:a1:2f:07) 表示发送方硬件地址
Sender IP address: 192.168.2.1 表示发送方IP地址
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) 表示目标硬件地址,对于ARP请求报文,这个字段全是0,因为发送方并不知道目标的物理地址。
Target IP address: 192.168.2.92 表示目标协议地址
接着我们来看一下第二个包
Hardware type: Ethernet (1) 表示网络类型是以太网
Protocol type: IPv4 (0x0800) 表示协议类型是IPv4
Hardware size: 6 表示硬件长度是6个字节
Protocol size: 4 表示协议长度是4个字节
Opcode: reply (2)
从这可以看到,这是一个ARP响应报文。
Sender MAC address: Apple_a6:34:11 (f4:5c:89:a6:34:11) 表示发送方物理地址
Sender IP address: 192.168.2.92 表示发送方IP地址
Target MAC address: RalinkTe_a1:2f:07 (00:0c:43:a1:2f:07) 表示目标物理地址
Target IP address: 192.168.2.1 表示目标IP地址
参考资料:
《TCPIP 协议族第4版》