在说ARP协议之前,我们先了解两个概念,一个是IP地址,一个是MAC地址。IP地址用于标示网络中的一台主机,IP地址可以是全球唯一的(当然这个是需要你申请的),也可以是在局域网内唯一的。MAC地址个人认为是用于标示一个网卡,并不和主机绑定,当你的主机换了一个网卡,主机的MAC也就跟着变掉了,而IP地址并不会因为网卡变了而发生改变。作为用户我们是可以修改IP地址的,但网卡的MAC地址是生产厂家烧录进去的,一般我们是无法修改,或者不会去修改的。
这里你可能有个疑问,既然已经有了MAC地址,虽然它用于标示一个网卡,但安装到主机后也可以标示这台主机,那为什么我们还要IP地址呢?个人认为原因可能是:
1、MAC地址是数据链路层地址,而IP是网络层地址,是TCP/IP协议栈中的一个概念。数据链路层我们使用以太网协议,但上面未必一定使用TCP/IP协议。基于分层的概念和各层协议之间的解耦问题,各层都有自己的寻址方式,不应该相互依赖;
2、MAC地址没有明显的地址结构,而且地址配置不灵活(生产厂家定死了),不方便网络管理;
一:为什么需要ARP协议
说了这么多,进入今天的正题 - ARP协议。实现IP地址与MAC地址间的映射关系,确切的讲是根据IP地址获取这个IP地址所在网口的MAC地址。为什么需要这个协议呢?因为当一台主机需要把以太网帧发送到位于同一局域网上的另一台主机时,是根据48bit的以太网接口地址来确定目的网口的,网口驱动程序会检查这个地址,以确定是否接收数据。所以我们只知道对端的IP地址还不行,还必须要获取对端的MAC地址。
二:ARP包的结构
ARP请求和应答报文的格式如图1所示:
图1 ARP请求和应答报文格式
前面三个字段是以太网首部,这里也简单说一下。
以太网目的地址:对于ARP请求,这个地址为全F的广播地址,同网段内的所有主机都会接受到这个请求报文。对于ARP应答,这个地址就是发送请求的网口的MAC地址;
以太网源地址:就是发送ARP请求/应答报文网口的MAC地址;
帧类型:对于ARP来说就是0x0806;
后面的9个字段属于ARP协议字段。
硬件类型和协议类型,用来描述ARP分组中的各个字段。例如,一个ARP请求分组询问协议地址(这里是IP地址)对应的硬件地址(这里是以太网地址)。
硬件类型:表示硬件地址的类型,值为1表示以太网地址;
协议类型:表示要映射的地址类型,值为0x0800表示IP地址。它的值与包含IP数据报的以太网数据帧中的类型字段的值相同;
硬件地址长度和协议地址长度分别指出硬件地址和协议地址的长度,以字节为单位。对于以太网上IP地址的ARP请求或应答来说,它们的值分别为6和4;
操作字段指出四种操作类型,它们是ARP请求(值为1)、ARP应答(值为 2)、RARP请求(值为3)和RARP应答(值为4)(RARP协议是ARP协议的反向协议,即根据MAC地址获取IP地址,现在基本不用,所以这块可以忽略)。这个字段必需的,因为ARP请求和ARP应答的“帧类型”字段值是相同的;
接下来的四个字段是发送端的硬件地址(这里是以太网地址)、发送端的协议地址(IP地址)、目的端的硬件地址和目的端的协议地址。对于一个ARP请求来说,除目的端硬件地址外的所有其他的字段都有填充值,,通常目的端硬件地址填全0值。
下面的图2和图3是在wireshark下抓包看到的ARP请求和应答包的详情,可以帮助大家详细了解ARP协议的格式。
图2 ARP请求包详情
图3 ARP应答包详情
三、ARP协议的工作流程
下面从一个ping的过程来讲解ARP协议的工作流程和它的作用。下图是我在主机192.168.43.145上ping主机192.168.43.1的过程。在发送ping包前主机上是没有主机192.168.43.1的MAC地址信息的,所有主机192.168.43.145在发送ping包前,首先发送ARP请求,即图2中的第一个数据包。然后主机192.168.43.1返回ARP应答,告知它的MAC地址信息。主机192.168.43.145获取到该MAC地址信息后,开始发送真正的ping请求包(图4中的第3个包),然后主机192.168.43.1返回ping应答包(图4中的第4个包)。
图4 ARP协议工作流程
四:ARP缓存表
ARP缓存表即IP地址与MAC地址的对应关系表。在所有的主机里都会有这么一个缓存表,在ARP请求成功后主机都会在ARP表中新增一个表项。主机在发送IP报文时都会到ARP缓存表中查找所需IP的MAC地址,如果能查到就直接拿来用,如果查不到就发送ARP请求报文请求MAC地址。
ARP表项可以为动态方式获取,也可以手动方式所设置。前者称为动态ARP,后者称为静态ARP。两者之间的区别是:动态ARP表项有老化时间,在相应IP地址长时间(时间无标准,从几分钟到20分钟都有)无数据收发时,该IP地址的ARP表项将会被删除。静态ARP表项则没有老化的说法,除非用户手动删除。
这里我们再简单说下ARP表溢出问题。溢出就是表已经满了,没办法再新增新的ARP表项了。通常发生在ARP表过小,而同一段时间内与多个终端有通信需求。另外也有可能是遭到了ARP攻击,导致ARP表被恶意填满。ARP表溢出后的现象就是,新主机的通信无法进行,即如果新通信主机的IP地址与MAC对应关系不在ARP表中,此时需要发送ARP请求,同时需要把这个不完整的表项存到ARP表中,内容如表1所示。
表1 不完整ARP表项示例
|
IP地址 |
MAC地址 |
|
新主机IP |
00:00:00:00:00:00(无效) |
因为需要把这个不完整表项先插到ARP表中,而此时ARP表项已经满了。插入肯定是会失败的。所有无法完成APR请求流程,所以数据包也就无法发送。
五:免费ARP
免费ARP(gratuitous ARP)即主机发送ARP请求,查找自己的IP对应的MAC地址。通常发生在新配IP地址和系统上电时。下图为免费ARP的抓包示例。从图中可以看出发送者IP(Sender IP address)和接受者IP(Target IP address)相同。
图5 免费ARP
免费ARP的作用主要是两个方面:
1、防止地址冲突。如果目前网络内有其他主机配置了相同的IP地址,主机将会收到免费ARP的ARP应答包,通常系统都会有提示信息;
2、如果主机换了一块网卡,可以通知网络中的其他主机及时更新其ARP表项。例如主机关机后换了一块网卡,然后重启主机,这个时候就需要通知其他主机这个更新。