引言

有过网络编程经验的同学知道,在应用层通过网络发送数据时,必须知道接收方的IP地址。但当数据包一层一层封装下去到达数据链路层时,会发现仅仅有IP地址是不够的,因为网络层的数据报文必须封装成帧才能通过物理网络发送,发送方还得有接收方的物理地址(MAC地址)才能完成数据帧的封装。那该怎么办呢,本期要讲的ARP协议就是来解决这个问题的。

什么是ARP协议

ARP协议(Address Resolution Protocol)中文名为地址解析协议,是局域网中将IP地址解析为MAC地址的协议。
上面说到在数据链路层发送方需要得知接收方的MAC地址,ARP协议正好可以将接收方的IP地址转换成MAC地址,这个问题将得到解决。
当设备通过ARP协议解析到目的MAC地址后,会将这个IP地址到MAC地址的映射关系保存起来,后续遇到同样的IP地址时,将直接使用对应的MAC地址,不再通过ARP协议来获得。
ARP适用于IPv4网络;在IPv6网络中,ARP 的功能由邻居发现协议(NDP) 提供。

ARP报文长什么样

ARP报文分为ARP请求和ARP应答报文,报文格式如下。
image.png
逐字段解释如下,括号里为该字段所占字节数:
硬件类型(2):表示硬件地址的类型,值为1表示以太网地址。
协议类型(2):表示要映射的协议地址类型,值为0x0800即表示IP地址。
硬件地址长度(1):通常指MAC地址的长度,单位为字节,值为6。
协议地址长度(1):通常指IP地址的长度,单位为字节,值为4。
操作类型(2):1表示该报文为ARP请求报文,2表示该报文为ARP响应报文。
发送端硬件地址(6):发送方设备的MAC地址,在ARP响应报文中,该字段表示请求时IP地址对应的MAC地址。
发送端协议地址(4):发送方设备的IP地址。
接收端硬件地址(6):接收方设备的MAC地址,在ARP请求报文中,该字段被忽略(通常为ff:ff:ff:ff:ff:ff)。
接收端协议地址(4):接收方设备的IP地址。

什么是ARP表

我们通常将ARP协议保存起来的IP地址到MAC地址的对应关系称为ARP表,将每条映射关系称为ARP表项。ARP表在操作系统内核中保存。
ARP表项可以分为动态ARP表项和静态ARP表项两种。

动态ARP表项

动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,可以被静态ARP表项覆盖。当到达老化时间或者接口down时,会删除相应的动态ARP表项。适用于拓扑结构复杂、通信实时性要求高的网络。

静态ARP表项

静态ARP表项通过手工配置和维护,不会被老化,不会被动态ARP表项覆盖。配置静态ARP表项可以增加通信的安全性,指定IP地址的设备在通信时只使用指定的MAC地址,恶意的ARP报文无法进行修改,从而保护了本端设备和对端设备间的正常通信。一般会在网关设备上配置静态ARP表项。

ARP如何进行地址解析

我们看看ARP协议具体如何工作。假设主机A要向主机B发送IP报文,且A和B在同一个网段。

  1. 主机A先查询自己的ARP表,看看其中是否包含有主机B对应的ARP表项。如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP报文封装成帧,并发送给主机B。
  2. 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该IP报文,然后以广播方式发送一个ARP请求报文。ARP请求报文中的接收端协议地址为主机B的IP地址。

    我们之前提到ff:ff:ff:ff:ff:ff的MAC地址为广播地址,所以将接收端硬件地址填成ff:ff:ff:ff:ff:ff,该ARP报文会发送给整个网段。

  3. 由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求。其他主机收到报文后比较自己的IP地址和ARP请求报文中的接收端协议地址,如果不同则将忽略该请求报文。因此只有被请求的主机(即主机B)会对该请求进行处理。

  4. 主机B比较IP地址发现两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。

    当接收端硬件地址的值有意义时,ARP报文有具体的发送目标,因此对于这个报文的通信是一对一的,我们称为单播。

  5. 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP报文进行封装后发送出去。

至此,要发送的IP报文已经顺利发送,撒花🎉。

后记

我们本节在讨论ARP工作原理的时候仅假设在同一网段内的情况,不在同一网段时情况其实比较类似,但是由于我们还未涉及到其他网络知识,本期暂且不讲,后续再做补充。
本期讲的内容有点抽象,下次(不一定是下期)结合具体的Linux命令来探究下ARP更深层的知识。