因为时间的关系,昨天的 ARP 推文只写了 ARP 缓存部分,所以今天补充 ARP 工作的原理以及 ARP 帧格式和 ARP 的四种典型情况。
ARP 工作原理
假设有一台主机想要向本地局域网上的另一台目标主机发送 IP 分组时,首先会在本地主机的 ARP 高速缓存中查询是否有目标主机的 IP 地址,如果有该 IP 地址对应的条目,则可以直接查出其 MAC 地址,写入 MAC 帧,然后通过局域网将该帧发送给对应 MAC 地址的主机上。
如果没有,则先通过广播 ARP 请求分组(如上图),在获得目标主机的 ARP 响应分组后(如下图),将目标主机的 MAC 地址写入 ARP 高速缓存,建立目标主机的 IP 地址到 MAC 地址的映射关系。注意:ARP 请求分组是广播发送的,但 ARP 响应分组是普通的单播。
当然,ARP 只是解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题的。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络,剩下的工作就由下一个网络来做。
ARP 帧格式
由图可见,前 14
个字节是 MAC(以太网)头部 ,其余部分由 ARP 协议定义。ARP 帧的前 8
个字节是通用的,剩余部分用于将 IPv4 协议映射到 48
位的以太网地址。
首先让我们看看以太网头部,第一个字段是 DST
即 目的以太网地址 ,第二个字段是 SRC
即 源以太网地址 。这里需要注意一点,对于一个 ARP 请求来说,目的地址字段填充的是以太网地址 ff:ff:ff:ff:ff:ff
,即以太网广播地址,这样在同一个广播域中的每个接口都能收到该帧。第三个字段是 长度或类型 ,此字段占据 2
字节大小,对于 ARP 请求或响应该字段的值一定为 0x0806
。
接下来的 4 个字段指定了最后 4 个字段的类型和大小 [RFC5494]。
硬件类型字段 指出硬件地址类型。对于以太网,硬件类型字段值为 1
。
协议类型字段 指出映射的协议地址类型。对于 IPv4 ,协议类型字段的值为 0x800
。
硬件大小字段 指出硬件地址的字节数。对于以太网中使用 IPv4 地址的 ARP 请求或响应,硬件大小字段的值为 6
。
协议大小字段 指出协议地址的字节数。对于以太网中使用 IPv4 地址的 ARP 请求或响应,协议大小字段的值为 4
。
操作码字段(Op) 指出该报文所执行的操作。当 Op = 1
时,该报文为 ARP 请求报文
;当 Op = 2
时,该报文为 ARP 响应报文
;当 Op = 3
时,该报文为 RARP 请求报文
;当 Op = 4
时,该报文为 RARP 响应报文
。
接下来的字段指出了发送方和目的的硬件地址和协议地址。
发送方硬件地址字段 指出了发送方的以太网 MAC 地址。
发送方协议地址字段 指出了发送方的 IPv4 地址。
目的硬件地址字段 指出了目的地的以太网 MAC 地址。
目的协议地址字段 指出了目的地的 IPv4 地址。
接下来是 填充字段 ,当要发送一个 ARP 请求时,除了目的硬件地址设为 0
之外,其他字段都需要进行填充。
ARP 的 4 种典型情况总结:
- 发送方是主机,要把 IP 数据报发送到本网络上的另一个主机。这时用 ARP 找到目的主机的硬件地址。
- 发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址,剩下的工作由这个路由器来完成。
- 发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用 ARP 找到目的主机的硬件地址。
- 发送方是路由器,要把 IP 数据报转发到另一个网络上的一个主机。这时用 ARP 找到本网络上的一个路由器的硬件地址,剩下的工作由这个路由器来完成。
参考文献:
[1] Fall, K. R., and Stevens, W. R. TCP/IP详解 卷1:协议. Translated by 吴英, 张玉 and 许昱玮, 2nd ed., 机械工业出版社, 2016.
[2] 谢希仁, 计算机网络, 8th ed., 电子工业出版社, 2021.
[3] J. Arkko, C. Pignataro, "IANA Allocation Guidelines for the Address Resolution Protocol (ARP)" RFC 5494, April 2009.