一、ARP协议的作用
一台主机要发送数据给另一台主机时,必须要知道目的主机的网络层地址(即IP地址)。IP地址由网络层来提供,但是仅有IP地址是不够的。
IP数据报文必须封装成帧才能通过数据链路进行发送。数据帧必须要包含目的MAC地址,因此发送端还必须获取到目的MAC地址。那么如何获取对方的mac地址呢?
通过ARP(Address Resolution Protocol)协议可以根据IP地址获取对方的MAC地址。
二、ARP获取主机MAC地址流程
主机A(ip为10.0.0.1)要和主机C(ip为10.0.0.3)通信,数据包经过主机A的封装后发给主机C,我们知道主机A封装数据时除了要知道对方的IP地址,还需要知道对方的MAC地址,这时候就需要借助ARP协议了。
下面我们看下ARP是如何获取主机C的MAC地址的?
1、ARP请求
主机A首先会去检查ARP缓存表(ARP缓存用来存放IP地址和MAC地址的关联信息)中是否存在主机C的MAC地址。
本例中由于是第一次通信,主机A的ARP缓存表中没有主机C的MAC地址。这时主机A会发送ARP request报文(广播报文)来获取主机C的MAC地址。
之前已经讲过广播的概念的,广播报文只会在广播域中传播,路由器可以隔离广播域。
ARP request报文封装在以太帧里。
帧头中的源MAC地址为发送端主机A的MAC地址。此时,由于主机A不知道主机C的MAC地址,所以目的MAC地址为广播地址FF-FF-FF-FF-FF-FF。
ARP request报文中包含源IP地址、目的IP地址、源MAC地址、目的MAC地址,其中目的MAC地址的值为0。
ARP Request报文会在整个网络上传播,该网络中所有主机包括网关都会接收到此ARP request报文。网关将会阻止该报文发送到其他网络上。
本例中主机B和主机C都会收到主机A发送的ARP广播请求报文。
2、ARP应答
主机B收到主机A发送的ARP广播请求报文,查看目的IP不是自己会丢弃,但是会在自己的ARP缓存表中记录主机A的IP和MAC的映射关系,在主机B上通过命令arp -a 可以查询到;
主机C发现目的IP是自己,会在自己的ARP缓存表中记录主机A的IP和MAC的映射关系,并会向主机A单播回应ARP Reply报文。
主机A收到主机C的回应报文后后会在自己的ARP缓存表中记录主机C的IP和MAC的映射关系,下次发送数据时就可以查询到主机C的MAC。
ARP Reply报文中的源协议地址是主机C自己的IP地址,目标协议地址是主机A的IP地址,目的MAC地址是主机A的MAC地址,源MAC地址是自己的MAC地址,同时Operation Code被设置为reply。ARP Reply报文通过单播传送。