ARP(Address Resolution Protocol)是一个非常重要并经常使用的地址解析协议,它虽然是一个网络层协议,但却涉及一些数据链路层的信息。ARP协议的基本作用是根据已知的IP地址获得其对应的MAC地址。
3.4.1 ARP的基本原理
在3.3节中,我们分析帧在交换机网络中的运动过程时,总是特别假定源计算机已经知道了目的计算机的MAC地址。事实上,一个源设备开始是不知道目的设备的MAC地址的。源设备总是通过某种机制(如DNS,Domain Name System)先获取到目的设备的IP地址(后续的章节会专门讲解有关IP地址的知识),然后利用ARP协议对此IP地址进行解析,从而获取到目的设备的MAC地址。当然,一个设备总是知道自己的MAC地址和IP地址的。
源设备需要解析一个IP地址时,会发出一个广播帧,广播帧的载荷数据是一个ARP请求报文。目的设备在接收到ARP请求报文后,会向源设备发送一个单播帧,该单播帧的载荷数据是一个ARP应答报文,该ARP应答报文中包含了目的设备的MAC地址。
下面通过一个例子来说明ARP的基本工作原理。
如图3-21所示,假设源主机PC1已经知道了目的主机PC2的IP地址为10.0.0.2,现在需要获取PC2的MAC地址。PC1获取PC2的MAC地址的过程如下。
(1)PC1会发送一个广播帧,该广播帧的源MAC地址为MAC1,类型字段的值是0x0806,代表该广播帧的载荷数据是一个ARP报文(具体为ARP请求报文)。该ARP请求报文的含义是:我的IP地址是10.0.0.1,我的MAC地址是MAC1,请求IP地址10.0.0.2所对应的MAC地址是多少?
(2)因为PC1发送的是一个广播帧,所以PC2和PC3都会接收到它,并根据其类型字段的值(0x0806)将其中的ARP请求报文上送给网络层的ARP处理模块进行处理。
(3)PC3的ARP处理模块会发现,10.0.0.2并不是自己的IP地址,所以不会进行应答,而是将ARP请求报文中10.0.0.1与MAC1的对应关系存放进自己的ARP缓存表,然后将此ARP请求报文丢弃。
(4)PC2的ARP处理模块会发现,10.0.0.2正是自己的IP地址,所以会进行应答。PC2会向PC1发送一个单播帧,该帧的目的MAC地址为MAC1,源MAC地址为MAC2,类型字段的值还是0x0806.该帧的载荷数据是一个ARP应答报文,应答报文中包含了PC2的IP地址10.0.0.2和MAC地址MAC2.另外,PC2也要将所收到的ARP请求报文中的10.0.0.1与MAC1的对应关系放进自己的ARP缓存表。
(5)PC1在收到PC2发送的单播帧后,会将其中的ARP应答报文上送给三层的ARP处理模块。PC1的ARP处理模块会从该应答报文中获取到PC2的MAC地址MAC2.另外,PC1也会将10.0.0.2与MAC2的对应关系存放进自己的ARP缓存表。
从上面的描述中,我们接触到了ARP缓存表这个概念。设备中的ARP缓存表是用来临时存放IP地址与MAC地址的对应关系的。当某一设备需要向设备发送单播帧时,会首先查看自己的ARP缓存表中是否已经有了目的设备的MAC地址。如果有,就直接使用它;如果没有,就会发起ARP请求来获取它。
ARP缓存表也具有动态特性:一个条目(即一个IP地址与MAC地址的对应关系)从其被建立或最近一次被使用算起,会有180s(该时间值可通过配置进行修改)的生存期;一旦过了生存期,该条目就会被删除。某个条目在每次被使用时,该条目的生存期都会被重新设置为180s.
3.4.2 ARP的报文格式
ARP报文分为ARP请求报文和ARP应答报文,这两种报文的结构相同,但是各个字段的取值有所不同,具体结构如图3-22所示(有阴影的区域才是ARP报文)。
ARP报文中各字段的含义如表3-1所示。