本文为笔者学习以太网对网上资料
归纳整理所做的笔记
,文末均附有参考链接,如侵权,请联系删除。
ARP 协议
ARP 概述
ARP(Address Resolution Protocol),即地址解析协议,是根据 IP 地址(逻辑地址)获取 MAC 地址的一种 TCP/IP 协议。在以太网通信中,数据是以“帧”的格式进行传输的,帧格式里面包含目的主机的
MAC 地址。源主机的应用程序知道目的主机的 IP 地址,却不知道目的主机的 MAC 地址。而目的主机的MAC 地址直接被网卡接收和解析,当解析到目的 MAC 地址非本地 MAC 地址时,则直接丢弃该包数据,
因此在通信前需要先获得目的的 MAC 地址,而 ARP 协议正是实现了此功能。
ARP 协议的基本功能是通过目的设备的 IP 地址,查询目的设备的 MAC 地址,以保证通信的顺利进行。MAC 地址在网络中表示网卡的 ID,每个网卡都需要并有且仅有一个 MAC 地址。在获取到目的 MAC 地址之后,将目的 MAC 地址更新至 ARP 缓存表中,称为 ARP 映射,下次通信时,可以直接从 ARP 缓存表中获取,而不用重新通过 ARP 获取 MAC 地址。但一般 ARP 缓存表会有过期时间,过期后需要重新通过ARP 协议进行获取。
ARP 映射是指将 IP 地址和 MAC 地址映射起来,分为静态映射和动态映射。
静态映射指手动创建一张 ARP 表,把 IP 地址和 MAC 地址关联起来。手动绑定之后,源主机在通信之前,就可以直接从 ARP 表中直接找到 IP 地址对应的 MAC 地址,但这样做有一定的局限性,因为 MAC地址可能会变化,比如:
- 机器可能更换 NIC(网络适配器),结果变成一个新的物理地址;
- 在某些局域网中,每当计算机加电时,他的物理地址都要改变一次。
- 移动电脑可以从一个物理网络转移到另一个物理网络,这样会改变物理地址。
要避免这些问题出现,必须定期维护更新 ARP 表,此类比较麻烦而且会影响网络性能。
动态映射指使用协议来获取相对应的物理地址,之所以用动态这个词是因为这个过程是自动完成的,一般应用程序的用户或系统管理员不必关心。已经设计出用于实现动态映射协议的有 ARP 和 RARP(逆地
址解析协议)两种,如下图所示。
ARP 把 IP 地址映射为物理地址,RARP 把物理地址映射为 IP 地址。RRAP 是被那些没有磁盘驱动器的系统使用(一般是无盘工作站或 X 终端),此类应用较少,本章不做讨论。
ARP 协议分为 ARP 请求和 ARP 应答,源主机发起查询目的 MAC 地址的报文称为 ARP 请求,目的主机响应源主机并发送包含本地 MAC 地址的报文称为 ARP 应答。
ARP 缓存表
为了实现IP地址与网卡MAC地址的查询与转换,ARP协议引入了ARP缓存表的概念,每台主机或路由器在其内存中具有一个ARP缓存表(ARP table),这张表包含IP地址到MAC地址的映射关系,表中记录了<IP地址,MAC地址>对,它们是主机最近运行时获得关于其他主机的IP地址到物理地址的映射,当需要发送IP数据的时候,主机就会根据目标IP地址到ARP缓存表中进行查找对应的MAC地址,然后通过网卡将数据发送出去。ARP表也包含一个寿命(TTL)值,它指示了从表中删除每个映射的时间。从一个表项放置到某ARP表中开始,一个表项通常的过期时间是10分钟。
我们电脑也是有自己的ARP缓存表的,可以在控制台中通过 arp -a
命令进行查看,如下图所示
从图中可以看到作者的电脑有很多这样子的缓存表,其中192.168.24.221 是我电脑的IP地址,而192.168.24.xxx这些IP是其他电脑与其对应的物理地址(MAC地址),比如IP地址为192.168.24.26的电脑MAC地址为c8-4b-d6-44-e1-f3,如果我想向该电脑发送一个数据包,那么我的电脑就会从已有的ARP缓存表中寻找这个IP地址对应的物理地址,然后直接将数据写入以太网数据帧中让网卡进行发送即可,而如果没有找到这个IP地址,那么这个数据就没法立即发送,电脑会先在局域网上广播一个ARP请求(目标MAC地址为FF-FF-FF-FF-FF-FF)
,广播的ARP请求发出后,处于同一局域网内的所有主机都会接收到这个请求,如果目标IP地址与主机自身IP地址吻合就会返回一个ARP应答,告诉请求者自身的MAC地址,当我的电脑收到这个ARP应答后,就去更新ARP缓存表,并且重新将数据发送出去。
ARP协议的核心就是对缓存表的操作,发送数据包的时候,查找ARP缓存表以得到对应的MAC地址,必要时进行ARP缓存表的更新,此外ARP还需要不断处理其他主机的ARP请求,在ARP缓存表中的TTL即将过期的时候更新缓存表以保证缓存表中的表项有效。
ARP 工作过程
其运作过程大致可以理解为:
- 如果主机A想发送数据给主机B,主机 A首先会检查自己的 ARP 缓存表,查看是否有主机B的IP地址和MAC地址的对应关系, 如果有,则会将主机B的MAC地址作为目的MAC地址封装到数据帧中。如果本地ARP缓存中没有对应关系, 主机A就会向局域网中广播ARP请求(包括发送方的IP地址、MAC地址、接收方的IP地址), 每台主机接收到ARP请求后都检查自己的IP地址是否与ARP请求中的接收方IP地址相同,若不相同则丢弃ARP请求包。
- 当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。
- 当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机 A 的 IP 地址和 MAC 地址的对应关系记录到自己的ARP缓存表中, 同时会发送一个ARP响应,其中包括自己的 MAC 地址。
- 主机 A 在收到这个回应的数据帧之后,在自己的 ARP 缓存表中记录主机 B 的 IP 地址和 MAC 地址的对应关系。 而此时交换机已经学习到了主机 A 和主机 B 的 MAC 地址了。
ARP 请求
当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个 ARP 请求报文,这个报文包含了发送方的 MAC 地址和 IP 地址以及接收方的 IP 地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播,即 ARP 请求时发送的接收方物理地址为广播地址,用48’hff_ff_ff_ff_ff_ff 表示。ARP 请求的示意图如下图所示:
上图中的主机 A 发起 ARP 请求,由于发送的目的 MAC 地址为广播地址,所以此时局域网中的所有主机都会进行接收并处理这个 ARP 请求报文,然后进行验证,查看接收方的 IP 地址是不是自己的地址。是则返回 ARP 应答报文,不是则不响应。
ARP 应答
只有验证成功的主机才会返回一个 ARP 应答报文,这个应答报文包含接收方的 IP 地址和物理地址。ARP 应答的示意图如下图所示:
主机 B 利用收到的 ARP 请求报文中的请求方物理地址,以单播的方式直接发送给主机 A,主机 A 将收到的 ARP 应答报文中的目的 MAC 地址解析出来,将目的 MAC 地址和目的 IP 地址更新至 ARP 缓存表中。当再次和主机 A 通信时,可以直接从 ARP 缓存表中获取,而不用重新发起 ARP 请求报文。需要说明的是,ARP 缓存表中的表项有过期时间(一般为 20 分钟),过期之后,需要重新发起 ARP 请求以获取目的 MAC 地址。
ARP 协议
ARP 协议通过以太网进行传输,那么必须也要按照以太网所规定的格式进行传输以太网是目前应用最广泛的局域网通讯方式,同时也是一种协议。以太网协议定义了一系列软件和硬件标准,从而将不同的计算机设备连接在一起。我们知道串口通信单次只传输一个字节,而以太网通信是以数据包的形式传输,其单包数据量达到几十,甚至成百上千个字节。下图为以太网通过 ARP 传输单包数据的格式,从图中可以看出,以太网的数据包就是对协议的封装来实现数据的传输,即 ARP 数据位于以太网帧格式的数据段。这里只是让大家了解下以太网数据包的格式,后面会逐个展开来讲。
ARP 协议属于 TCP/IP 协议簇的一种,从前面介绍中可以看出,ARP 协议位于以太网 MAC 帧格式的数据段,ARP 数据包格式如下图所示
- 硬件类型(Hardware type):硬件地址的类型,1 表示以太网地址。
- 协议类型(Protocol type):要映射的协议地址类型,ARP 协议的上层协议为 IP 协议,因此该协议类型为 IP 协议,其值为 0x0800。
- 硬件地址长度(Hardware size):硬件地址(MAC 地址)的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 6。
- 协议地址长度(Protocol size):IP 地址的长度,以字节为单位。对于以太网上 IP 地址的 ARP 请求或者应答来说,该值为 4。
- OP(Opcode):操作码,用于表示该数据包为 ARP 请求或者 ARP 应答。
- 1 表示 ARP 请求,
- 2 表示ARP 应答,
- 3表示RARP 请求,
- 4表示RARP应答
- 源 MAC 地址:发送端的硬件地址。
- 源 IP 地址:发送端的协议(IP)地址,如 192.168.1.102。
- 目的 MAC 地址:接收端的硬件地址,在 ARP 请求时由于不知道接收端 MAC 地址,因此该字段为广播地址,即 48’hff_ff_ff_ff_ff_ff。
- 目的 IP 地址:接收端的协议(IP)地址,如 192.168.1.10。
以太网的帧格式、ARP 数据格式到这里已经全部介绍完了,关于通过以太网传输 ARP 报文的格式如下图所示:
由上图可知,28 字节的 ARP 数据位于以太网帧格式的数据段。由于以太网数据段最少为 46 个字节,而 ARP 数据包总长度为 28 个字节,因此在 ARP 数据段后面需要填充 18 个字节的数据,以满足以太网传输格式的要求。这个填充的过程称为 Padding(填充),填充的数据可以为任意值,但一般为 0。
协议类型 | 名称 | 字节数 | 数值 | 含义 |
---|---|---|---|---|
数据同步 | 前导码 | 7字节 | 0x55_5555_5555_5555 | |
帧起始界定符 | 1字节 | 0xD5 | ||
以太网协议 | 目的MAC地址 | 6字节 | / | |
源MAC地址 | 6字节 | / | ||
长度/类型 | 2字节 | / | ||
ARP 协议 | 硬件类型 | 2字节 | 0x0001 | |
协议类型 | 2字节 | 0x0800 | ||
硬件地址长度 | 1字节 | 0x06 | ||
协议地址长度 | 1字节 | 0x04 | ||
OP | 2字节 | / | ||
源MAC地址 | 6字节 | / | ||
源IP地址 | 4字节 | / | ||
目的MAC地址 | 6字节 | 0x0000_0000_0000 | ||
目的IP地址 | 4字节 | / | ||
18字节的填充 | 18字节 | 0x00 | ||
以太网协议 | 校验FCS | 4字节 | / |
实例分析
下图是从wiresharkz中抓包的ARP请求和ARP应答包。
主机 192.168.10.151
请求主机192.168.10.100
的MAC地址。然后主机192.168.10.100
返回其MAC地址为E880_88BA_9F36
ARP 请求包
将数据带入到ARP协议的以太网帧中,表示如下:
注意,在发送ARP请求包的时候,以太网首部的目标MAC地址是FF-FF-FF-FF-FF-FF,而ARP首部目标MAC地址为00-00-00-00-00-00-00,这里千万不要混淆。
ARP 应答
ARP应答包具体数据如下:
将数据带入到ARP协议的以太网帧中,表示如下:
注意:在wireshark抓包中,未抓取网卡处理前的数据,只抓取了网卡处理后的数据。所以我们在报文中没有看到前导码+帧起始界定符+校验序列(此三部分字段一般在网卡的MAC控制器中处理)。
参考
- https://blog.csdn.net/yindq1220/article/details/138027232
- 正点原子《开拓者之FPGA开发指南V3.2》