地址解析协议ARP

对于TCP/IP网络在网络通信过程中,通常数据从应用层数据链路层会被层层封装加上各层的报头,在数据链路层会加上以太网的报头,而以太网的报头中包含目标MAC地址源MAC地址等数据。其中的目标MAC地址就是通过地址解析协议ARP来获取的。

ARP基础

ARP仅用于IPv4,IPv6使用邻居发现协议。

地址解析是发现两个地址之间的映射关系的过程。

ARP高效运行的关键是维护每个主机和路由器上的ARP缓存,该缓存使用地址解析为每个接口维护从网络层到硬件地址的最新映射。

ARP地址解析过程

当主机A向主机B发送数据时,首先将主机B的地址跟主机A的地址进行一个与运算来确认两主机是否处于同一个网段(通过网络地址来区分)。

当确认处于同一网段时,首先主机A会查自己的ARP高速缓存表中是否存在主机B的IP地址和其MAC地址的映射关系。如果存在,就直接把IP数据封装成帧进行通信,如果不存在,则先缓存该数据报文,然后主机A就使用链路层广播帧向在同一个共享链路层网段上的所有主机广播ARP请求。该网段上的所以主机都会收到该ARP请求广播包,所有收到ARP请求的主机先比较自己IP地址跟请求中的目的IP地址是否匹配,如果不匹配主动丢弃该ARP查询。如果匹配,把该ARP请求中的源IP地址和源MAC地址存入自己的ARP高速缓存表中,然后填充自己的MAC地址,将两个发送方地址和接收方地址互换,然后向主机A发送生成的应答,应答通常不是广播,而是仅直接发送给请求的发送方。当主机A收到该ARP应答后后,把主机B的IP地址和MAC地址添加到ARP高速缓存表中,然后把IP数据封装成帧与主机B进行通信。

当两主机处于不同网段时。主机A先向网关发送ARP请求报文,当收到网关ARP应答时,先把网关的MAC地址和IP地址记录的ARP高速缓存表中,然后把IP数据包封装成帧发送给网关,然后网关再查看自己的ARP高速缓存表中有没有主机B的IP地址和其MAC地址的映射关系,如果有,就直接封装再发送,如果没有就发送广播,再获取主机B的MAC地址,再封装发送。

ARP帧格式

ARP帧格式

DST:目的MAC地址,对于ARP请求目的MAC地址全为1为广播地址。
SRC:源MANC地址,MAC地址为48位即6个字节。
长度或类型:在以太网帧中,对于ARP请求或应答,2字节的长度或类型字段必须为0x0806
硬件类型:指硬件地址类型,对于以太网该值为1
协议类型:指映射的协议地址类型,对于IPv4地址改值为0x0800
硬件大小:硬件地址的字节数
协议大小:协议地址的字节数
Op:指ARP请求类型。 1:ARP请求;2:ARP应答;3:RARP请求;4:RARP应答

ARP请求或ARP应答的大小是42字节(ARP消息为28字节,以太网头部为14字节

对于一个ARP请求,除了目的硬件地址设为0之外,其他字段都需要填充。当一个系统接收到一个ARP请求,它填充自己的硬件地址,将两个发送方地址和接收方地址互换,将Op字段设置为2,然后发送生成的应答。

ARP命令

1
arp -a  # 显示ARP缓存中的所有条目

通过该命令能够查出动态静态的映射关系条目。

在大多数实现中,完整条目的超时未20分钟,而不完整的条目的超为3分钟(例如:强迫执行一次到不存在主机的ARP请求)。