一:引入

当网络设备要发送数据给另一台设备时,必须要知道对方的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的,IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须包含目的MAC地址,因此发送端还必须获取到目的MAC地址。通过目的IP地址而获取目的MAC地址的过程是由ARP协议来实现的。
ARP协议是TCP/IP协议簇中的重要组成部分,ARP能够通过目的IP地址发现目标设备的MAC地址,从而实现数据链路层的可达性。

二:ARP数据包的格式

ARP协议
注意:ARP报文不能穿越路由器,不能被转发到其他广播域。
各字段的含义:
Hardware Type表示硬件地址类型,一般为以太网
Protocol Type表示三层协议地址类型,一般为IP
Hardware Length和Protocol Length为MAC地址和IP地址的长度,单位是字节
OPeration Code制定了ARP报文的类型,包括ARP request 和ARP reply
Source Hardware Address 指的是发送ARP报文的设备MAC地址
Source Protocol Address 指的是发送ARP报文的设备IP地址
Destination Hardware Address指的是接收者MAC地址,在ARPrequest报文中,该字段值为0
Destination Protocol Address指的是接受者的IP地址

三:ARP的工作过程

ARP之简单请求应答
当两台计算机在同一个局域网通信,我们以ping命令为例,该命令使用的ICMP协议

ARP协议
PC1依据OSI模型①依次从上至下对数据进行封装,包括对ICMP Date加IP包头的封装,但是到了封装MAC地址的时候,②PC1首先查询自己的ARP缓存表,发现没有IP2和他的MAC地址的映射,这个时候MAC数据帧封装失败。我们使用ping命令的时候,是指定PC2的IP2的,计算机是知道目的主机的IP地址,能够完成网络层的数据封装,因为设备通信还需要对方的MAC地址,但是PC1的缓存表里没有,所以在MAC封装的时候填入不了目的MAC地址。

那么PC1为了获取PC2的MAC地址,③PC1要发送询问信息,询问PC2的MAC地址,询问信息包括PC1的IP和MAC地址、PC2的IP地址,这里我们想到一个问题,即使是询问信息,也是需要进行MAC数据帧的封装,那这个询问信息的目的MAC地址填什么呢,规定当目的MAC地址为ff-ff-ff-ff-ff-ff时,就代表这是一个询问信息,也即使后面我要说的广播。

PC2收到这个询问信息后,将这里面的IP1和MAC1(PC1的IP和MAC)添加到本地的ARP缓存表中,然后④PC2发送应答信息,对数据进行IP和MAC的封装,发送给PC2,因为缓存表里已经有PC1的IP和MAC的映射了呢。这个应答信息包含PC2的IP2和MAC2。PC1收到这个应答信息,理所应当的就获取了PC2的MAC地址,并添加到自己的缓存表中。

经过这样交互式的一问一答,PC1和PC2都获得了对方的MAC地址,值得注意的是,目的主机先完成ARP缓存,然后才是源主机完成ARP缓存。之后PC1和PC2就可以真正交流了。

ARP之广播请求单播回应

上图面的图解是不完全的ARP协议,因为在局域网里边不会只有两台主机,这里就要考虑如何在局域网众多主机里获得目的主机的MAC。

ARP协议

和上面的一样,刚开始PC1并不知道PC2的MAC地址,同样需要发送ARP请求,但是这个局域网里主机很多,怎么唯独获取PC2的MAC呢,①我们想到和一群陌生人交流一样,可以挨着询问一遍,这就是我们要说的广播,首先PC1广播发送询问信息(信息和上一张图介绍的一样),在这个普通交换机上连接的设备都会受到这个PC1发送的询问信息。

接下来②需要做的是,所有在这个交换机上的设备需要判断此询问信息,如果各自的IP和要询问的IP不一致,则丢弃,如图PC3、Route均丢弃该询问信息,而对于PC2判断该询问信息发现满足一致的要求,则接受,同样的写入PC1的IP和MAC到自己的ARP映射表中。

最后,③PC2单播发送应答信息给PC1,告诉PC1自己的IP和MAC地址。

四:ARP代理

ARP协议
上图中,主机A需要与主机B通信时,目的IP地址与主机的IP地址位于不同网络,但由于主机A未设置网关,所以他将会以广播的形式发送ARP Request报文,请求B的MAC地址,但是广播报文无法被路由器转发,所以主机B无法收到主机A的请求报文。
在路由器上启用代理ARP功能,就可以解决这个问题。启用代理后,路由器接收到这样的请求,会查找路由表,如果存在主机B的路由表项,路由器会将自己的G0/0/0接口的MAC地址回应该ARP Requestrian。主机A收到ARP Reply后,将一路有油漆的G0/0/0接口MAC地址作为目的MAC地址进行数据转发。
小结:1如果两台主机在同一个网段,则直接发送ARP Request报文就好。
2 如果在不同网段,(1)主机A设置了网关,ARP协议可以正常使用。
(2)主机A没有设置网关,这种情况下,我们要开启ARP代理,路由器来重新封装,转发报文

五: 免费ARP

ARP协议
主机A将ARP Request 广播报文中的目的IP地址字段设置为自己的IP地址,该网络中的所有主机都会接受到此报文。当目的IP地址已经被某一个主机或网管室友是,该主机或网关就会回应ARP reply 报文,通过这种方式主机A就能探测到IP地址冲突了。