ARP地址解析协议
概述
IP协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作。这需要网络层软件使用的地址和底层网络硬件使用的地址之间进行转换。如果一台主机要将一个帧发送到另一台主机,仅知道这台主机的IP地址是不够的,还需要知道主机在网络中的有效硬件地址。
而地址解析协议
就是用来发现两个地址之间映射关系的过程,对于TCP/IP来说,这通过ARP
协议来实现,它常用于32位的IPv4地址和以太网的48位MAC地址之间的映射。
ARP提供从网络层地址到相关硬件地址的动态映射
。这是因为它会自动执行和随时间变化,而不需要系统管理员重新配置。也就是说,如果一台主机改变它的网卡,从而改变了它的硬件地址,但分配的IP地址不会得到改变,ARP可以在一定延时之后继续正常运作。
比如,当我们在浏览器中打开一个网页,本地计算机必须确定如何与相关服务器相联系。它首先是判断该服务位于当前子网还是远程。如果是远程的,则需要一台可以到达目的地的路由器。仅在到达位于同一IP子网的系统时,ARP才能工作。
![](https://img2022.cnblogs.com/blog/2026333/202204/2026333-20220415221822876-609663946.png)
在一个共享的链路层网段上,ARP向所有主机发送一个称为ARP请求
的以太网帧,称其为链路层广播
。ARP请求包含目的主机的IPv4地址。
通过ARP,同一广播域中的所有系统都可以接受ARP请求。这包括可能根本不运行IPv4或IPv6协议的系统,但不包含位于不同的VLAN中的系统,即使支持它们。如果某个系统使用请求中指出的IPv4地址,它仅需要响应一个ARP问答
。这个应答包含IPv4地址和对应的MAC地址。这个应答通常不是广播,而是仅直接发送给请求的发送方。同时,接受ARP请求的主机学习IPv4到MAC地址的映射,并记录在内存中供以后使用。
ARP缓存
ARP高效运行的关键是维护每个主机和路由器上的ARP缓存(或表)
。该缓存使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当IPv4地址映射到硬件地址时,它对应于高速缓存中的一个条目,其正常到期时间是条目创建开始后的20分钟。
在Linux系统和Windows系统下可以使用arp
命令查看ARP缓存。
如图为Linux系统,每个映射是一个包含5个元素的条目:主机名、硬件地址类型、硬件地址、标志和本地网络接口。
标志列分为C、M和P。其中C类条目由ARP协议动态学习,M类条目通过手动输入,而P类条目的含义是“发布”,即对于任何P类条目,主机对输入的ARP请求返回一个ARP应答。
![](https://img2022.cnblogs.com/blog/2026333/202204/2026333-20220415223459072-980717081.png)
如图为Windows系统,其中显示了接口的IPv4地址,接口号是一个十六进制数(即图中的0xa
)。除此之外,其中还指出了地址是手动输入还是ARP学习。图中的动态
意味着它们来自ARP学习,如果是手动输入,则是静态。
![](https://img2022.cnblogs.com/blog/2026333/202204/2026333-20220415223539864-884757788.png)
ARP缓存超时通常与ARP缓存中的每个条目相关,在大多数实现中,完整条目的超时为20分钟,而不完整的条目的超时为3分钟。这些实现通常在每次使用一个条目后为它重新启动20分钟的超时。
ARP帧格式
如图,为在以太网中转换一个IPv4地址时常用的ARP请求和应答分组的格式。前14字节构成标准的以太网头部。
其中,前两个字段包含目的和源以太网地址。对于ARP请求,目的以太网地址ff:ff:ff:ff:ff:ff
是广播地址,在同一广播域中的以太网接口可接收这些帧。在以太网帧中,对于ARP(请求或应答),2字节的长度或类型
字段必须为0x0806
。其后的前4个字段制定了最后4个字段的类型和大小。
- 硬件类型字段指出硬件地址,对于以太网,该值为1。
- 协议类型字段指出映射的协议地址类型。对于IPv4,该值为0x800。
- 硬件大小字段指出硬件地址的字节数,对于IPv4地址的请求或应答,其值为6。
- 协议大小字段指出协议地址的字节数,对于IPv4地址的请求或应答,其值为4。
- Op字段指出该操作是ARP请求(值为1)、ARP应答(2)、RARP请求(3)或RARP应答(4)。
抓包分析
1. ARP请求和ARP应答
使用Wireshark抓包如下:
其中,在Info
条目下,Who has...Tell
表示该报文为ARP请求报文,is at
表示该报文为ARP应答报文。
其中,第一个报文细节如下:
其中,以太网帧长度为48字节,Ethernet II
表示以太网头部,大小为14字节;Addres Resolution Protocal(request)
表示ARP请求协议,大小为28字节。
对应于ARP帧格式的解释分别如下:
- DST:50:64:2b:46:4e:4e
- SRC:3c:f8:62:30:1d:f3
- 长度或类型:ARP(0x0806)
- 硬件类型:Ethernet(1)
- 协议类型:IPv4(0x0800)
- 硬件大小:6
- 协议大小:4
- Op:request(1)
- 发送方硬件地址:3c:f8:62:30:1d:f3
- 发送方协议地址:192.168.31.60
- 目的硬件地址:50:64:2b:46:4e:4e
- 目的协议地址:192.168.31.1
第二个报文的细节如下:
与第一个报文不同的地方在于:该报文是ARP应答报文,即其Op
字段值为reply(2)。
2. 不存在主机的ARP请求
在Linux终端下,我们使用telnet尝试访问一个不存在的本地IPv4地址:
![](https://img2022.cnblogs.com/blog/2026333/202204/2026333-20220416012555782-939138332.png)
同时使用tcpdump进行抓包:
![](https://img2022.cnblogs.com/blog/2026333/202204/2026333-20220416012629386-1225514639.png)
可以看出,ARP请求的时长大约为4秒,期间总共发送了6次ARP请求报文,且会在arp缓存中生成一个不存在的目的地址。