ARP的引入
通过前面的介绍,我们已经知道在计算机网络中,只要确定了 IP 地址就可以向目标主机发送 IP 数据包。不过,在数据链路底层进行通信时,却有必要了解每个 IP 地址对应的 MAC 地址。这样才能完成「最后一公里」的通信,把数据包发送给目标主机。
而通过 IP 地址获取 MAC 地址就需要借助 ARP,ARP 是一种地址解析协议,以目标 IP 地址为条件,来定位下一个应该接收数据包的网络设备的 MAC 地址,如果对应 MAC 地址不存在,意味着目标主机不在该网段内,接着通过 ARP 查找下一跳路由器的 MAC 地址。
ARP的工作原理
ARP 协议借助 ARP 请求和响应两种类型的包来确定 MAC 地址,以下是 ARP 请求和响应的一般流程:
主机 A 为了获取主机 B 的 MAC 地址,首先要通过广播发送一个 ARP 请求包,这个包中包含了想要了解其 MAC 地址的对应主机 IP 地址(即主机 B 的 IP 地址),由于广播包可以被同一链路上的所有主机或路由器接收,因此 ARP 的请求包就会被这个链路上的所有主机和路由器进行解析,如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,这个节点就将自己的 MAC 地址塞入 ARP 响应包返回给主机 A。有了 IP 地址和 MAC 地址,就可以完成链路内的 IP 通信。
为了降低网络流量,提高通信效率,发送 ARP 请求包的主机会把获取到的 MAC 地址缓存一段时间,IP 地址与 MAC 地址映射关系表叫 ARP 缓存表,每执行一次 ARP,对应的缓存表内容就会被清除。
反之,接收 ARP 请求的那个主机又可以从这个 ARP 请求包获取发送端主机及其 MAC 地址,这时候,它也可以将这些 MAC 地址信息缓存起来,从而根据 MAC 地址发送 ARP 响应包给发送端主机。
IP地址与MAC地址对比
整个互联网其实就是通过路由器将一个个网段连接起来,同一个网段(链路)内通过 MAC 地址即可通信,但是跨网段的通信需要通过 IP 地址,如果没有 IP 地址,仅仅通过 MAC 地址无法知道节点所处的位置(没有网络地址部分),就需要向全网发送数据包,可想而知这将会造成多大的网络流量,而且维护这个 MAC 地址的缓存表也非常庞大。
所以,在互联网通信中,IP 地址和 MAC 地址缺一不可,于是就有了将这两个地址相关联的 ARP 协议。另外,有些时候我们可能还需要反过来通过 MAC 地址获取 IP 地址,相应的协议是 RARP。
下面是一个跨网段的网络请求根据 IP 地址和 MAC 地址最终到达目标主机的流程图:
如上所述,在整个过程中,IP 头没有变动,而数据链路帧头(MAC头)里的目标 MAC 地址随着链路的变动而变动,从而将网络包一步步转发到目标主机,完成整个通信。