1. 概述
ARP(Address Resolution Protocol)地址解析协议,可以互相转换IP地址与MAC地址,从而连接网络层和数据链路层。
2. 物理地址与网络地址
2.1 数据帧
每个网络接口都有一个唯一的物理地址,进行数据帧交换时必须有正确的物理地址,之所以称之为“物理地址”而不是“数据链路地址”,是因为它通常存储在某种硬件介质当中。
以太网是目前比较流行的一种局域网技术,IEEE802.3标准以太网规定的数据帧结果如下表所示:
单位:字节
前同步码 (7) | SFD (1) | 目的地址 (6) | 源地址 (6) | 长度/类型 (2) | 数据和填充 (46~1500) | CRC (4) |
图表 1 IEEE802.3标准以太网数据帧
2.1.1 前同步码
56位的0和1,实现物理层输入输出的同步。
2.1.2 SFD
固定的10101011,用来界定帧的起始。
2.1.3 目的地址、源地址
均为6字节的MAC地址[1],目的地址存储数据帧接收方的MAC地址,源地址存储数据帧发送方的MAC地址。
目的地址可以分为三类,单播地址、多播地址和广播地址。
单播地址即向单个网卡发送数据帧,即与某个网卡的MAC地址相对应,通常要求单播模式下发送的数据帧中目的地址的首位必须为0,以与多播地址区分。
多播地址即向多个网卡发送数据帧,多播发送要求MAC的首位为1,以与单播区分。
广播地址则向所在局域网中所有网卡发送数据帧,要求所有位全为1(即FF:FF:FF:FF:FF:FF)。
2.1.4 长度/类型
该字段有两个意义,当该字段的值小于1518时,表示的是所在帧数据段的长度;当该字段的值大于1518时,表示的是所在帧数据属于的上层协议类型。【比如0x800(小端)表示IP数据包;0x806表示ARP数据包】
2.1.5 数据/填充
即所在帧携带的有效信息。
2.1.6 CRC
差错校验信息
3. 网卡工作原理
设备在发送数据时,会将数据帧的上述7个字段读取并写入网卡,然后网卡自动计算CRC并添加到数据帧尾部,同时对数据帧进行封装,然后将数据帧发送出去;接收数据时则相反。
4. ARP协议
4.1 ARP协议的本质
ARP通过引入ARP缓存表[2]的方式实现了IP到MAC的查询。故ARP协议的本质就是对ARP缓存表的建立、更新以及维护。
4.2 ARP缓存表的建立
ARP缓存表中每一个表都有一个指针,这个指针指向存储待发送信息的链表,这个链表被称作ARP数据包缓存队列,链表的数据域即数据包的信息。一张完整的ARP缓存表实际上是表项组成的结构体数组,系统通常为这个数组初始化10个表项大小的空间。
4.3 ARP缓存表的维护
(1) 系统初始化时,此时设备不知道任何其他设备的地址信息,设备的ARP缓存表应当为空,此时该设备会向所在局域网中发送一个含有自身IP与MAC地址的键值对信息的广播数据包,该数据包一般被称为无回报ARP请求,其他设备收到该数据包后会更新自己的ARP缓存表。
(2)主机发送数据包时,会查询自身的ARP缓存表,如果有目的IP的MAC则发送;没有则先向所在以太网发送广播报文以获取该IP的MAC地址,待收到应答后发送数据包并更新缓存表。
(3)ARP缓存表中的键值对并非长时有效,其具有一定的维护机制:在ARP请求包会直接携带发送方自身的IP与MAC信息以满足再次通信的需要,因此所有的接收设备都可以先根据请求包中的源地址信息更新自己的缓存表,一定程度上优化了通信。
以下定时维护机制通过 void_etharp_tmr(void) 函数实现,该函数通过管理每个表项的ctime变量来实现对应的功能。
【stable—维护】对于state变量指示stable的表项,内核会为其设置一个维护用的定时周期,当这个时间到达后,内核会发送一个ARP请求,以维护表项的有效性。
【stable—超时检查】对于state变量指示stable的表项,内核会为其设置一个超时检查周期,通常为20分钟,当这个时间到达后,对用的表项会被删除。如果后续仍需要向该表项发送数据,那么需要重新建立该表项。
【pending—超时等待】对于state变量指示pending的表项,内核会为其设置一个超时等待周期,这个时间通常为10秒,这个时间到达后,对应表项也会被删除。
4.4 ARP报文
以太网目的地址 (6) | 以太网源地址 (6) | 自身类型 (2) | 硬件类型 (2) | 协议类型 (2) | 硬件地址长度(1) | 协议地址长度(1) | OP (2) | 发送方以太网地址(6) | 发送方IP地址 (4) | 接收方以太网地址 (6) | 接收方IP地址 (4) |
14字节以太网首部 | 28字节ARP数据包 |
图表 2 ARP报文结构
(1)自身类型
在以太网数据帧中指示所在报文的类型,对于ARP包,该值为0x806;对IP包,该值为0x800;对于PPPoE,该值为0x8864。
(2)硬件类型
所在报文欲获取的硬件类型,对于以太网的MAC地址,该值为1。
(3)硬件地址长度
对于ARP数据包来说,该字段代表MAC地址,该值为6。
(4)协议地址长度
对于ARP数据包来说,该字段代表IP地址,该值为4。
(5)操作字段
指示ARP包的类型,1为ARP请求包;2为ARP应答包;3为RARP请求包;4为RARP应答包。