ARP协议详解

今天我打算整理下ARP协议的知识点,并且或者以这个简单的网络协议为开端,慢慢地了解其他的协议

我们都知道在网络通信中,我们的主机都有一个唯一的MAC地址与IP地址(或许并非全局唯一),只有设置好这两个地址才能对外通信.其中MAC地址对应于OSI七层模型中的第二层数据链路层(Datalink Layer);IP地址对应第三层网络层(Network Layer)

跨网段访问的寻址另说,如果有多个主机在同一个网段,或者说在同一个广播域(由于VLAN等原因,两者并不完全相同),那么这些主机该怎么通信呢?这就涉及到ARP协议了

ARP简介

ARP的全称为Address Resolution Protocol,即地址解析协议.正如其名称所说一样,ARP协议用于将IP地址解析为MAC地址.ARP协议位于第三层

ARP的地址解析过程只使用了两种数据包:ARP请求包和ARP响应包

ARP请求

当上层协议需要IP对IP通信时,请求主机需要构造数据包.但在此之前,请求主机还需要发送一个ARP请求包,向同一广播域中的所有主机请求被请求主机的MAC地址.随后,请求主机将数据包构造完成后发送给此广播域的二层设备,由它根据MAC地址决定此数据包的去向

这个请求主机发送的ARP请求,基本上就是在问:”大家好,我的IP地址是XX.XX.XX.XX,MAC地址是XX.XX.XX.XX.XX.XX,我需要向IP地址为YY.YY.YY.YY的家伙发些东西,但我不知道它的硬件地址,你们谁有这个IP地址的,可否回复给我你的MAC地址?”

ARP请求示例

ARP响应

请求主机发送的ARP数据包将被广播给同一广播域的所有设备.不是这个IP地址的设备将简单地丢弃这个数据包,而拥有这个IP地址的设备将发送一个ARP响应.就像是说:”你好,我就是你所找的那个拥有IP地址为YY.YY.YY.YY的,我的MAC地址为YY.YY.YY.YY.YY.YY.”

ARP响应示例

ARP详解

ARP头部

ARP头部包含如下几个域:

  1. 硬件类型:数据链路层使用的类型数据.大多数情况下这个类型都是以太网(类型1)
  2. 协议类型:ARP请求正在使用的高层协议.可以是IPv4或IPv6
  3. 硬件地址长度:使用的MAC地址的长度.以字节为单位
  4. 协议地址长度:使用的逻辑地址的长度.以字节为单位
  5. 操作:ARP数据包的功能.1表示请求,2表示响应
  6. 发送方硬件地址:发送者的硬件地址
  7. 发送方协议地址:发送者的高层协议地址.一般为IP地址
  8. 目标硬件地址:目标接收方的硬件地址.ARP请求中为全零
  9. 目标协议地址:目标接收方的高层协议地址.一般为IP地址

ARP头部

ARP请求数据包

ARP请求数据包

如图所示,该数据包是一个ARP请求.在数据链路层中,该数据包的源地址是此主机的MAC地址,即a4:02:b9:75:9f:d1;目的地址是ff:ff:ff:ff:ff:ff,这是一个广播地址,因此该数据包会广播至当前广播域中的所有设备

用蓝色标记的即是ARP协议的所有内容.可以看出,它列出了发送方的MAC地址a4:02:b9:75:9f:d1,IP地址192.168.10.5,以及接收方的IP地址192.168.10.1.由于想要得到目标MAC地址,还是未知的,所以这里的MAC地址填写为00:00:00:00:00:00

ARP响应数据包

ARP响应数据包

ARP响应的数据包与ARP请求很像,只有以下几点不同:

  1. 数据包的操作码(opcode)现在是0x0002,用来表示这是一个响应而不是请求
  2. 地址信息进行了颠倒,发送方的的MAC地址与IP地址现在变成了目的MAC地址与IP地址
  3. 最重要的是,现在数据包中所有的信息都是可用的.响应的数据包不再广播,而是直接发送给192.168.10.5主机

请求主机接收到ARP响应后,它便知道了指定IP主机所对应的MAC地址

无偿ARP

无偿ARP又称免费ARP,毕竟英文名是free ARP

无偿ARP用于这种情况:一个主机的IP地址是可变的,当它更改了自己的IP地址后,同一广播域中所有设备缓存的IP地址与MAC地址映射就都不再有效了.为了防止造成通信错误,该主机将发送一个无偿ARP,强制所有接收到它的设备去用新的IP和MAC地址映射更新缓存

无偿ARP示例

有几种可能的情形会使用无偿ARP:

  • 主机的IP地址的更改
  • 操作系统启动完成后
  • 高可用集群IP切换

如下是无偿ARP的数据包:

无偿ARP数据包

可以看出,除了发送方的IP地址与接收方的IP地址一样以外,无偿ARP与普通的ARP请求没什么不同.事实上,无偿ARP就是ARP请求的特殊类型

由于该ARP数据包是未经请求的,却导致客户更新ARP缓存,所以会称之为无偿

代理ARP

如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答这个请求,这个过程就称为ARP代理

我们之前讨论的都是同一广播域的主机通信,试想一下,如果是跨广播域(仍然在同一网段)间主机的通信会怎么样?请求主机直接将ARP请求包发送给跨广播域的另一端?由于广播域对二层流量的隔离,显然不可以

此时,就轮到代理ARP发挥作用了.请求主机照常像广播域发送ARP请求,此时,如果位于该网段的二层设备接收到ARP请求,开启了代理ARP功能,并知道被请求主机属于它所连接的网络,那么该二层设备就会用自己的MAC地址代替请求主机的MAC地址来对被请求主机进行ARP请求,以及响应,最后向请求主机回复响应数据包

在代理ARP的过程中,请求主机对此是无感知的,一切都由两个广播域间的二层设备完成

ARP缓存

主机间自然不会每次发起IP请求时都发送一次ARP请求,那样太耗时间.实际上,每个主机都在内存中有一个缓冲区,专门用来存储IP地址与MAC地址的映射关系.这就是ARP缓存

当ARP被询问一个IP地址对应的MAC地址时,往往先是在ARP缓存中查看是否已存在该IP地址的信息,若存在,则直接返回与之对应的MAC地址;若不存,才发送ARP请求向同一广播域查询

动态条目与静态条目:

  • 动态条目随时间推移自动添加和删除,每个动态ARP缓存项都有都设置了TTL(生存时间),TTL为0时此项目就从表中删除
  • 静态ARP缓存条目是永久性的,可以使用TCP/IP工具手动添加和删除.静态ARP缓存条目用来禁止节点发送对常用的本地IPv4地址(例如路由器和服务器的IPv4地址)的ARP请求

在Linux中,可以通过ip neigharp工具来查看或更改ARP缓存

小结

ARP协议能够完成IP地址对MAC地址的映射,是整个TCP/IP协议栈中相当基础的协议,但正因为其基础性,它几乎是所有基于IP通信的协议的基石

ARP协议往往被称为局域网中的协议,但这并不是说跨局域网就不需要ARP协议.固然同一个广播域中与其他设备通信需要ARP协议去获得MAC地址,跨局域网间设备的通信也需要ARP协议去获取网关设备的MAC地址,和网关设备通信呢

参考文档

“Wireshark数据包分析实战(第二版)”

xpleaf:在实践中深入理解ARP协议

songoo:TCP/IP协议——ARP详解

0%