ARP —— 地址解析协议
ARP —— 地址解析协议
参考资料《图解TCP/IP》
ARP协议能实现任意网络层地址到任意物理地址的转换。以目标IP为线索,用来定位下一个应该接收数据分包的网络设备所对应的MAC地址。
ARP请求/应答报文的格式:
硬件类型字段定义物理地址的类型,它的值为1表示MAC地址。
协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。
硬件地址长度和协议地址长度字段其单位是字节,对MAC地址来说,长度为6,对IP(IPv4)地址来说,长度为4。
操作字段指出4种操作类型:ARP请求(值为1)、ARP应答(值为2)、RARP请求(值为3)、RARP应答(值为4)。
ARP工作机制
ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
① 主机A要寻找的目标主机B在同一网络
如下图:假定主机A和主机B互不知道对方的MAC地址。
主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。
由于广播的包可以被同一个链路上的所有主机或路由器接收,因此ARP请求包也就会被这同一个链路上的所有主机和路由器进行解析。
如果ARP请求包中的IP地址与自己的IP地址一致,那么这个结点就将自己的MAC地址塞入ARP响应包返回给主机A。
由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。
② 主机A要寻找的目标主机B不在同一网络
当主机A在封装数据包时检测到目标主机和自己并不在同一网段时,数据包不能把目标主机的MAC地址顺利封装进去,那么就用到另一种方法,那就是网关,主机A在准备发向主机B的数据中,封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址,数据包封装到这里,主机A就用ARP去广播,请求得到网关的MAC地址,此网关必须和本机在同一网段。
如下图:主机A想要发送IP数据报给主机B,则必须先将数据包发送给路由器C的MAC地址C1,再转发给主机B。
网关收到这个ARP请求并正确回应给主机A,这时主机A在数据包中封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址和网关的MAC地址,把数据包从网卡发出去。
因为目标MAC是网关的,所以网关收到这个数据包后,发现目标MAC是自己,而目标IP却是别人,所以它不可以再往上打开这个数据包,它要做的工作就是把这些数据包发给下一跳路由器或普通PC机。
如果它是普通PC机,那么它就发给路由器,让路由器把这些数据包正确传输到远程目标网络,到达远程网络后,它们的网关再将数据包发给目标主机,即源主机A就找到了目标主机B,从而真正结束不同网络之间的通信,回应的数据包也是用同样的方法到达目的地。
在这里,还需要注意的是,当网关把数据包发给下一跳路由器时,这个数据包必须由网关把目标MAC改成下一跳路由器的MAC地址(通过ARP得到),而源端MAC改成发出端口的MAC地址,否则下一跳路由器收到目标MAC不是自己的数据包,会丢弃不予理睬,下一跳路由器再发给下一跳路由器同样要把目标MAC地址改为下一跳路由器的MAC地址再发出去。
由此可以看出,MAC地址是一直在变化的,而目标IP地址是不变的。
ARP缓存表
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存一段时间。
即把第一次通过ARP获取到的MAC地址作为IP地址和MAC的映射存储到ARP缓存表中,下一次再向这个IP地址发送数据报时不需要再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。
每执行一次ARP,其对应的缓存内容都会被清除。不过在清除之前都可以不需要执行ARP就可以获得想要的MAC地址。
一般来说,发送过一次IP数据报的主机,继续发送多次IP数据报的可能性会比较高,因此,这种缓存能够有效地减少ARP包的发送。
反之,接收ARP请求的那个主机可以从这个ARP请求包获取发送端主机的IP地址及其MAC地址。这时它也可以将这些MAC地址的信息缓存起来,从而根据MAC地址发送ARP响应包给发送端主机。
类似地,接收到IP数据报的主机又往往会继续返回数据报给发送端主机,以作为响应。因此,在接收主机端缓存MAC地址也是一种提高效率的方法。
不过,MAC地址的缓存是有一定期限的。超过这个期限,缓存的内容将被清除,这使得MAC地址与IP地址对应关系即使发生了变化,也依然能够将数据包正确地发送给目标地址。
不过,MAC地址的缓存是有一定期限的。超过这个期限,缓存的内容将被清除,这使得MAC地址与IP地址对应关系即使发生了变化,也依然能够将数据包正确地发送给目标地址。