TCP/IP协议族分为四层,互联网中不同的主机是通过IP层使用不同的IP地址来寻址的,也就是说,在IP层及其上层使用的是IP地址,它是一个逻辑地址(Logic Address)。但IP层的数据报传输到数据链路层后,通过数据链路层的网络接口卡,才能把IP数据报传输到目的主机或距目的主机较近的路由器中。在数据链路层传输的数据帧只能识别网卡物理地址(Physical Address),常用的以太网就是48位的MAC(Media Access Control)地址。这样就有一个问题,当一个IP数据报从一台主机传输到与它直接连接(这里说直接连接是因为IP数据报在传输过程中是通过点到点的通信从源主机一站一站传输到目的主机的,中间经过的这些站主要是路由器或具有路由器功能的主机)的另一台主机时,源主机如何获得另一台主机的物理地址呢?
TCP/IP协议族专门设计了用于地址解析的协议ARP(Address Resolution Protocol),它可以把一个IP地址映射成对应的物理地址。另外,对于无法保存IP地址的主机(如无盘工作站),TCP/IP协议族中也提供了从物理地址到IP地址映射的反向地址解析协议RARP(Reverse Address Resolution Protocol),如图8-17所示。
图8-17 ARP和RARP
ARP报文格式
在常用的以太网中,ARP报文被封装成如图8-18所示的以太网数据帧,然后以广播方式发送到物理网络。ARP报文格式如图8-19所示。
图8-18 ARP报文的以太网封装格式
图8-19 ARP报文格式
ARP报文格式说明如下:
① 硬件类型。硬件类型字段占2个字节,表示发送者硬件地址的类型。它的值为1即表示以太网地址。
② 协议类型。协议类型字段占2个字节,表示发送方要映射的协议地址类型,该字段的常用值如表8-5所示。协议地址为IP地址时,它的值为0x0800。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同。
③ 硬件地址长度和协议地址长度。硬件地址长度和协议地址长度各占一个1字节,分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4。
④ 操作代码。ARP和RARP在设计时的协议格式完全相同,只有操作代码字段可以对它们进行区分。该字段指出四种操作报文类型:值为1时表示ARP请求报文,值为2时表示ARP应答报文,值为3时表示RARP请求报文,值为4时表示RARP应答报文。
⑤ 发送方硬件地址和发送方协议地址。该地址长度由硬件地址长度字段和协议地址长度字段指定。
⑥ 目的方硬件地址和目的方协议地址。该地址长度由硬件地址长度字段和协议地址长度字段指定。
ARP工作原理
ARP工作时,首先由知道目的主机IP地址但不知道目的主机物理地址的主机发出一份ARP请求报文,该报文中填有发送方硬件地址、发送方IP地址和目的方IP地址,操作代码为1,目的方硬件地址填的是广播地址(在以太网中为全1),因此该网络内的所有主机都可以收到该报文,其含义是“如果你是这个IP地址的拥有者,请回答你的硬件地址”。
目的主机的ARP层收到这份广播报文后,识别出这是发送方在寻问它的IP地址,于是发送一个ARP应答报文。这个ARP应答报文包含它的IP地址及对应的硬件地址,操作代码为2,把原来的发送方硬件地址和协议地址填入目的方硬件地址和协议地址位置,即这时目的方变成了发送方,发送方变成了目的方。请求方收到ARP应答报文后,就可以使用目的方物理地址进行IP数据报的发送了。
ARP高速缓存
一台主机向另一台主机发送数据报后,可能不久还要发送,如果每发送一次数据报就进行一次ARP请求,那么ARP的工作效率就会很低。另外,由于ARP请求是以广播方式发送的,因此频繁使用ARP会使造成网络拥挤,影响网络的正常工作。解决该问题的关键是使用ARP高速缓存技术。
在网络中,每台主机上都有一个ARP高速缓存,这个高速缓存存放了最近IP地址到硬件地址之间的映射记录。高速缓存区中表项建立的方法是:
① 请求主机收到ARP应答后,主机就把获得的IP地址与物理地址的映射关系存入ARP表中。
② 由于ARP请求报文是广播发送的,所有收到ARP请求报文的主机都可以把其中发送方的物理地址和IP地址映射存入自己的高速缓存中,以备将来使用。
③ 网络中的主机在启动时,可以主动广播自己的IP地址和物理地址的映射关系,以免其他主机对它提出ARP请求(这也使一台主机在启动时,就可以知道自己的IP地址与网络中其他主机的IP地址有没有冲突)。
使用了高速缓存后,当ARP解析一个IP地址时,它会首先搜索ARP高速缓存查看是否有与该IP地址匹配的ARP表项,如果找到,ARP地址解析就完成了。假如ARP没找到一个匹配的IP地址,才会向网络上发送ARP请求报文。可以用ARP命令来检查和修改ARP高速缓存中的表项。ARP高速缓存中的表项一般分为动态表项和静态表项两种,动态表项有一定的生存时间,它随时间的推移自动添加和删除;静态表项在主机工作期间一直保留在高速缓存中,除非用ARP命令删除它。