前言
在上一篇文章 别再恐惧 IP 协议 中, 我们了解到,网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。也就是说:只要在网络层确定了 IP 地址,就可以向这个目标地址发送 IP 数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个 IP 地址所对应的 MAC 地址。
对于这段话不太了解的小伙伴强烈推荐翻看上篇讲解 IP 协议的文章 别再恐惧 IP 协议,有非常详细的解释和图例
那么,ARP 就是用来实现由 IP 地址到 MAC 地址转化的一个网络层协议,当然,还有一个 RARP 协议可以实现由 MAC 地址到 IP 地址的转化。两者原理都差不多,本文就以 ARP 协议为例进行讲解。
ARP 概要
ARP(Address Resolution Protocol )地址解析协议:实现由 IP 地址到 MAC 地址的转换。准确的来说,ARP 协议以目标 IP 地址为线索,用来定位下一个应该数据分包的网络设备对应的 MAC 地址。
以买车票为例:我们把数据链路层当成乘坐高铁从苏州到南京,再在南京转乘到北京,再在北京转乘到*的旅客,那么网络层就相当于每个车站的工作人员,在数据链路层每次转乘时,网络层为其购买了一张标有下一个 MAC 地址的车票。因此,即使旅客(数据链路层)不知道其最终目的地也没有关系,工作人员(网络层)会给你做出指引。
那么,ARP 协议做的事情就是在数据链路层每次换乘时,为其购买一张标有下一个 MAC 地址的车票
具体来说,网络层对数据链路层做出指引的过程称为路由控制,指引数据链路层的下一站是哪。为了将数据包发送给目标主机,所有主机和路由器都维护着一张路由控制表(Routing Table),该表记录着如下两个字段:
- 1)IP 地址
- 2)如果想要到达这个 IP 地址,在当前路由器,数据包的下一步应该是发送到哪个路由器
很不幸的是,路由控制表中记录的是这个数据包下一步应该发送到的 IP 地址,但是数据链路层进行通信的时候,它只认得 MAC 地址。所以,用来实现 IP 地址到 MAC 地址转换的 ARP 协议在此时就显得尤为重要。
ARP 的工作原理
那么 ARP 又是如何知道 MAC 地址的呢?
简单地说,ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。并且每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
如下图所示,假定主机 A 向同一链路上的主机 B 发送 IP 数据报,已知主机 A 和主机 B 的 IP 地址,它们互不知道对方的 MAC 地址:
1)首先,主机 A 为了获得主机 B 的 MAC 地址,它会先去查询自己的 ARP 高速缓存中有没有主机 B 的相关记录;
2)如果主机 A 的 ARP 高速缓存中没有主机 B 的 IP 地址到 MAC 地址的映射,主机 A 就会通过广播的方式发送 ARP 请求包(该包携带自己的 IP 地址 和 MAC 地址 以及 目标主机的 IP 地址),表明自己想要获得主机 B 的 MAC 地址;
2) 由于广播请求可以被同一个链路上的所有主机或路由器接收,因此如果这条链路上某个主机或路由的 IP 地址与这个 ARP 请求包中包含的目标主机的 IP 地址相同,那么这个节点就将自己的 MAC 地址塞入 ARP 响应包中返回给主机 A;
当然,ARP 响应包是以单播的形式进行发送的,毕竟 ARP 请求包中已经包含了主机 A 的 IP 地址,所以主机 B 非常清楚这个响应包应该发送给谁。
大部分网络协议在设计的时候,都是保持极度克制的,不需要的交互就砍掉,能合并的信息就合并,能不用广播就用单播,以此让带宽变得更多让网络变得更快。
3)主机 A 在收到主机 B 发过来的 ARP 响应包后,向其 ARP 高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。
当然,缓存是有一定期限的,超过这个期限,缓存的内容将被清空。这也使得即使 MAC 地址和 IP 地址的映射关系发生了变化,也依然能够正确的将数据包发送给目标地址。