网络层 - ARP 协议

ARP 的用途

ARP 协议的用途是为了从网络层使用的 IP 地址解析出在数据链路层使用的硬件地址。如下图所示,IP 协议使用了 ARP 协议,所以通常把 ARP 协议划归到网络层(划到数据链路层也可以)。

ARP 协议的作用

ARP 的实现

存储

每台主机都设有一个 ARP 高速缓存,里面保存了本局域网上各主机和路由器的 (IP 地址 → 硬件地址)的映射表。

ARP 流程

假设主机 A 要向本局域网上的某台主机 B 发送 IP 数据报,它首先要在自己的 ARP 高速缓存中查看有没有主机 B 的 IP 地址,如果有的话就直接取出对应的硬件地址写入 MAC 帧。如果没有,主机 A 就会自动运行 ARP:

  1. ARP 进程在本局域网上广播发送一个 ARP 请求分组,大意 ”我的 IP 地址是 xxx,硬件地址是 xxx,我想知道 IP 地址为 xxx 的主机的硬件地址“
  2. 本局域网上所有主机上运行的 ARP 进程都会收到这个 ARP 请求分组。
  3. 主机 B 的 IP 地址与 ARP 请求分组中要查询的 IP 地址一致,就收下了这个 ARP 请求,并用单播的方式向 A 发送 ARP 响应,响应的大意是 “我的 IP 地址是 xxx,我的硬件地址是 xxx“。同时,主机 B 还会在自己的 ARP 高速缓存中保存主机 A(IP 地址 → 硬件地址)的映射。其余主机因为 IP 地址不一致,都不会理睬这个 ARP 请求。
  4. 主机 A 收到主机 B 的 ARP 响应分组之后,就在其 ARP 高速缓存中写入主机 B 的(IP 地址 → 硬件地址)的映射。

image-20190807095949219

ARP 缓存生存时间

ARP 高速缓存中的(IP 地址 → 硬件地址)映射都有一定的生存时间(例如,10 ~ 20 分钟),避免某些主机退出局域网或者更换网卡之后发生错误。生存时间过后,就需要重新运行 ARP,更新缓存。

跨局域网怎么办?

ARP 是解决同一局域网上主机或路由器的(IP 地址 → 硬件地址)的映射。

如下图所示,主机 H1 想给另一个局域网上的主机 H2 发送数据,但是主机 H1 是无法解析出 H2 的硬件地址的(实际上主机 H1 也不需要知道远程主机 H2 的硬件地址)。

  1. 主机 H1 发送给 H2 的 IP 数据报首先需要通过同一个局域网的路由器 R1 来转发。所以主机 H1 需要把 R1 的 IP 地址解析成硬件地址 HA3,这样 IP 数据报就能传送到 R1;
  2. R1 从转发表找到了下一跳路由器 R2,同时用 ARP 解析出 R2 的硬件地址 HA5,就是就把 IP 数据报按照硬件地址 HA5 转发到了 R2;
  3. R2 再用类似的方法解析出目的主机 H2 的硬件地址 HA2,使 IP 数据包最终交付给了主机 H2。

image-20190807100142966

image-20190807100951881

参考文献

[1] 谢希仁. 计算机网络 [M]. 7 ed. 北京: 电子工业出版 社, 2017.