在网络世界中,只有两种地址,一种是之前讲解过的MAC地址,另一种是IP地址。MAC地址是烧制在NIC网卡内部的物理地址,在数据链路层中进行;IP地址则是在操作系统(OS)中设置的逻辑地址,在网络层中运行。ARP就是负责将这两个地址关联起来,起着数据链路层和网络层之间的架桥作用的协议。虽然ARP是位于数据链路层和网络层中间的协议,但也可以作为数据链路层的协议来进行讲解。
当某台终端发送数据时,需要将接收到的来自网络层的IP数据包封装成以太帧,并将其传输到缆线中。但是,如果只是接收了IP数据包,是不足以创建以太帧的,还需要其他信息。发送方MAC地址已经写入自己的NIC网卡中,因此是可知的,但是对接收方MAC地址一无所知。因此,在实际进行数据通信之前,需要使用ARP根据接收方IPv4地址计算出接收方MAC地址,这一处理被称为地址解析。
目录
ARP的数据帧格式
接下来,对ARP数据帧格式中的每个字段进行讲解:
--硬件类型
硬件类型是一个2字节(16比特)的字段,表示使用的是第二层的协议。它对各种第二层的协议进行了定义,如果是以太网,硬件类型就是0x0001。
--协议类型
协议类型是一个2字节(16比特)的字段,表示使用的是第三层的协议。它对各种第三层的协议进行了定义,如果是IPv4,协议类型就是0x0800。
--硬件地址大小
硬件地址大小是一个以字节为单位来表示硬件地址,即MAC地址的长度为1字节(8比特)的字段。由于MAC地址为6字节(48比特),因此需要输入6。
--协议地址大小
协议地址大小是一个以字节为单位来表示网络层使用的地址,即IP地址的长度为1字节(8比特)的字段。由于IP地址(IPv4地址)的长度为4字节(32比特),因此需要输入4。
--操作码
操作码(OP Code)是一种表示ARP帧的种类的2字节(16比特)的字段。虽然定义了很多操作码,但是在实际构建系统的工作场合中经常会看到的代码时表示ARP Request的1和表示ARP Reply的2这两种。
--发送方MAC地址/发送方IPv4地址
发送方MAC地址和发送方IPv4地址是一种表示发送ARP终端的MAC地址和表示IPv4地址的长度可变的字段。它们所表示的就是字面意思,无须太过深入地考虑。
--目标MAC地址/目标IPv4地址
目标MAC地址和目标IPv4地址是一种表示需要使用ARP进行地址解析的MAC地址和表示IPv4地址的长度可变的字段。由于一开始是无法知道MAC地址的,因此会设置虚拟的MAC地址。
ARP的操作非常简单,也非常容易理解。大家可以想象一下,在医院里护士会对着候诊室等待就诊的大家大声地喊:“xx先生在吗?”,于是就会有人回答:“是我!”的场景。ARP中的“xx先生在吗?”的数据包被称为ARP Request。ARP Request会以广播的形式被发送给同一网络中的所有终端。此外,“是我!”的数据包则被称为ARP Replay。ARP Replay会通过1:1的单播发送。ARP只会使用这两个数据包将MAC地址和IP地址关联起来。
所有的通信都需要从ARP开始。只有经过ARP 处理,知道数据包应当发送给哪一个MAC地址,才能开始进行通信。
不过,该ARP也存在致命的缺陷,即“需要以广播为前提”。由于一开始是不知道对方的MAC地址的,因此使用广播也是一种必然的做法。但是,广播是一种会向同一网络中的所有终端发送数据的低效的通信方式。例如,假设网络中有1000台终端,那么广播就会将流量传输给这1000台的终端。如果大家在每次通信时都发送ARP,那么网络就会被ARP流量淹没。
原本MAC地址和IPv4地址也是不会经常改变的。因此,ARP具备了对经过地址解析的内容临时进行保存的缓存功能。
经过ARP处理,知道了MAC地址之后,就可以将MAC地址作为ARP表的entry(数据)添加并保存在表中。终端在保存entry的期间不会发送ARP。然后,在经过一定时间(超时时间)后,就会删除entry,再次发送ARP Request。超时时间的长短取决于使用的设备和操作系统。例如,Windows10的超时时间是10分钟,cisco公司生产的设备的超时时间是4小时。当然,这两个时间都是可以进行更改的。
ARP是一种支持早期阶段的TCP/IP的非常重要的协议。如果卡在ARP这里,后续的通信将无法建立。因此,除了常规的ARP之外,还存在可以高效实现地址解析的特殊的ARP,这种ARP被称为GARP(无故ARP)
GARP是一种在ARP字段的目标IPv4地址中设置了自己的IPv4地址的特殊的ARP,常用于IP地址的重复检测和相邻设备的表更新中。
大家有没有在公司或者学校的网络环境中不小心设置了与其他人相同的IP地址的经历呢?在这种情况下,如果使用的是windows操作系统,就会显示“检测到IP地址冲突”的错误信息。
当设置了IPv4地址时,操作系统就会发送一个将该IPv4地址设置为目标IPv4的GARP(ARP Request),并询问所有人“可以使用这个IPv4地址吗?”由于必须向所有人进行询问,因此需要使用广播。此外,如果存在使用该IPv4地址的终端,就会返回单播的ARP Reply。接收到ARP Reply之后,操作系统就会判断出存在具有相同IPv4地址的终端,并显示错误信息;如果没有返回ARP Reply,就会显示需要设置IPv4地址。