ARP (Address Resolution Protocol) 协议用于完成网络地址到硬件地址的转换,网络地址通常指 IP 地址,硬件地址通常为 MAC 地址。

当 IP 分组要发向下一跳时,需要借助于链路层,IP 分组需要加上链路层的头部,比如以太网头部,这其中就包含 MAC 地址,因此网络层需要知道目的 IP 对应的 MAC 地址是多少。

一种直观的想法是,直接向当前链路上的设备询问,比如查询 192.169.1.100 的 MAC 地址,那就在链路层上发送广播,问谁的 IP 地址是 192.168.1.100,请把你的 MAC 地址告诉我。

ARP 请求就是这么做的,要在链路上广播,目的 MAC 地址是 ff:ff:ff:ff:ff:ff,这样链路上所有机器都能接收到,这些机器拿自己的 IP 地址和 ARP 请求报文中的 IP 地址比较,如果匹配那就发送应答。

下面考虑一个例子:

下图中有三台计算机,A 和 B 处于同一网络,C 处于另一个网络。

当 A 要向 B 发送 IP 分组时,需要知道 B 的 MAC 地址,此时 A 使用 B 的 IP 地址发送 ARP 请求,该请求以广播形式发送,B 收到后,发现有人在查询自己的 MAC 地址,此时会发送 ARP 响应,目的地址为 A 的 MAC 地址。

如果 A 要向 C 发送 IP 分组呢?因为 A 知道 C 的 IP 地址,且知道它处于另一个网络中,因此需要把 IP 分组发到路由器上,因此查询的 MAC 地址就是路由器的地址了。而 A 的路由表中是有路由器的 IP 地址的,因此使用路由器的 IP 地址查询 MAC 地址就可以了。

通常计算机上都有 ARP 缓存,缓存着最近查询过的 IP-MAC 对,这样就不需要每次都发送 ARP 请求来查询了。