ARP 协议原理

纸上得来终觉浅,绝知此事要躬行。

—— 南宋·陆游·《冬夜读书示子聿》

前面介绍网络层和 IP 协议时,有个问题被我们束之高阁——如何由 IP 地址找到与之对应的 MAC 地址呢?

上图是一个由以太网组建的局域网,每台主机都可以通过 IP 协议进行通信。以 antbee 发送数据为例,ant 将数据封装成一个 IP 包:

注意到 IP 包头部,源地址是 ant ,即 192.168.1.1 ;目的地址是 bee ,即 192.168.1.2IP 协议位于网络层,IP 包必须搭载在以太网帧中,由链路层负责传输到目标主机:

ant 知道自己 eth0 网卡的 MAC 地址是 40:aa:aa:aa:aa:aa ,但它该如何获悉 192.168.1.2 ,也就是 beeMAC 地址呢?前面我们提到过,每台主机内部都有一个映射表,但映射表又从何而来呢?

地址解析原理

其实,主机 ant 可以通过以太网,向网络中的其他主机发出广播,询问 192.168.1.2 这个 IPMAC 地址:

补充一些背景知识,ff:ff:ff:ff:ff:ff 是一个特殊的广播地址,目的地址为 ff:ff:ff:ff:ff:ff 的以太网帧,将被送到以太网中的每一台主机。交换机收到目的地址为 ff:ff:ff:ff:ff:ff 的帧后,也会将它广播到所有端口:

主机 beecicada 都会接收并处理目的地址为 ff:ff:ff:ff:ff:ff 的广播帧,由此获悉 ant 正在询问 192.168.1.2MAC 地址。主机 bee 定睛一看, 192.168.1.2 不正是它自己吗?因此,beeant 回复自己的 MAC 地址:

ant 收到 bee 应答的 MAC 地址后,将其保存在一个映射表中。这个映射表就是 ARP 缓存:

下次用到 192.168.1.2MAC 地址时,系统可以从直接从 ARP 缓存中查询,效率更高。

假设 192.168.1.2 后来被分配到其他主机,但 ant 仍缓存旧主机的 MAC 地址,通信肯定乱套了。为保持时效性, ARP 缓存需要设置有效期。当缓存失效后,系统必须重新发起 ARP 查询,并缓存最新结果。

ARP 报文格式

为了让参与地址解析的各方顺利协作,有必要对 请求应答 的格式进行统一规范,这就是 ARP 协议负责范畴。 ARP 协议报文承载在链路层帧中,以太类型为 0x0806 ,它的结构如下图所示:

一个 ARP 报文中有 9 个字段,分别是:

  • 硬件类型hardware type ),数据链路层协议类型,例如: 1 表示以太网协议;
  • 协议类型protocol type ),网络层协议类型,例如 0x0800 表示 IP 协议;
  • 硬件地址长度hardware address length ),数据链路层地址长度,对以太网来说,地址长度为 6 字节;
  • 协议地址长度protocol addess length ),网络层地址长度,对 IP 协议来说,地址长度为 4 字节;
  • 操作码operation ),报文的操作类型,1 表示 请求request ),2 表示 应答reply );
  • 源硬件地址sender hardware address ),即发送者的数据链路层地址;
    • 对于 ARP 请求,该字段表示请求发起者的地址;
    • 对于 ARP 应答,该字段表示请求应答者的地址,也就是发起者查找的地址;
  • 源协议地址sender protocol address ),即发送者的网络层地址;
  • 目标硬件地址target hardware address ),即接收者的数据链路层地址;
    • 对于 ARP 请求,这个字段被忽略;
    • 对于 ARP 应答,这个字段表示请求发起者的地址;
  • 目标协议地址target protocol address ),即接收者的网络层地址;
    • 对于 ARP 请求,这个字段就是待查找地址;
    • 对于 ARP 应答,同上;

ARP 协议负责在数据链路层和网络层间进行地址解析,它的报文很简单,也很好理解。

数据链路层协议有很多,包括以太网协议、 PPP 等等;而网络层协议也有很多,包括 IP 协议,IPv6 等等。因此, ARP 报文需要硬件类型和协议类型字段,分别注明数据链路层和网络层协议类型。

不同的协议类型,使用的地址长度也不一样:以 IP 协议为例,它的地址长度为 4 字节;而 IPv6 的地址长度为 16 字节。ARP 报文中两个用于记录地址长度的字段,为报文后面的地址字段切分提供了长度依据。

ARP请求

回到前面的场景,以 ant 解析 192.168.1.2 为例,它需要封装 ARP 请求报文,并广播到整个网络:

注意到,操作码为 1 表示 请求报文 ,源地址填的是 ant 自己的地址,目标硬件地址忽略,目标协议地址填待解析的 IP 地址。 ARP 报文封装在以太网帧中进行广播,目的地址是 ff:ff:ff:ff:ff:ff ,以太类型 0x0806 表明该帧承载的是 ARP 报文。

ARP应答

bee 收到 ARP 请求后,向 ant 应答自己的 MAC 地址,同样需要封装 ARP 报文:

注意到,操作码为 1 表示 应答报文 ,源地址填的是 bee 自己的地址,目标地址填的是 ant 的地址。ARP 应答报文同样封装在以太网帧中发给 ant ,无须广播,目的地址是 40:aa:aa:aa:aa:aa

ant 收到应答报文后,即可从源硬件地址字段获得 192.168.1.2 ,也就是 beeMAC 地址。

扩展阅读

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: