假设有一台主机想要向本地局域网上的另一台目标主机发送 IP 分组时,首先会在本地主机的 ARP 高速缓存中查询是否有目标主机的 IP 地址,如果有该 IP 地址对应的条目,则可以直接查出其 MAC 地址,写入 MAC 帧,然后通过局域网将该帧发送给对应 MAC 地址的主机上。
如果没有,则先通过广播 ARP 请求分组(如上图),在获得目标主机的 ARP 响应分组后(如下图),将目标主机的 MAC 地址写入 ARP 高速缓存,建立目标主机的 IP 地址到 MAC 地址的映射关系。注意:ARP 请求分组是广播发送的,但 ARP 响应分组是普通的单播。
当然,ARP 只是解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题的。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 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
之外,其他字段都需要进行填充。
参考文献:
[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.
👇每周一到周五晚上21:00更新,期待你的关注👇
联系客服