ARP(Address Resolution Protocol),即地址解析协议,是计算机网络中一个至关重要的协议。它解决了在同一个局域网内,如何通过一个设备的IP地址找到其对应的物理地址(通常是MAC地址)的问题。尽管它的功能听起来直接且必要,但将其精确地归类到OSI或TCP/IP模型的某一特定层级,却是一个常常引起讨论的话题。

ARP协议属于哪一层?

这是关于ARP协议最核心也最具争议的问题。在OSI模型中,网络层(Layer 3)负责处理IP地址,而数据链路层(Layer 2)负责处理MAC地址。ARP协议的功能是连接IP地址和MAC地址,这使得它的位置看起来介于这两层之间。

  • 在OSI模型中: ARP通常被认为工作在数据链路层(Layer 2)和网络层(Layer 3)之间,或者更倾向于数据链路层。它使用网络层地址(IP)作为输入,输出数据链路层地址(MAC),并且其报文直接封装在数据链路层的帧中(例如,以太网帧的Protocol Type字段值为0x0806就表示上层协议是ARP),它不经过网络层路由器的转发,只在本地链路有效。
  • 在TCP/IP模型中: 对应于OSI模型的网络层和数据链路层的是TCP/IP模型的互联网层(Internet Layer)网络接口层(Network Interface Layer,或称Link Layer)。ARP协议通常被归类到网络接口层(Link Layer)。原因在于,它是在单个网络段(即广播域)内工作的,并且其操作(广播ARP请求,接收ARP回复)直接依赖于底层网络接口的技术(如以太网),解决的是在同一个链路上寻址的问题。

总结: 尽管ARP使用网络层的IP地址,但其工作范围限定在单一的物理链路上,报文直接封装在数据链路层的帧中,且不被网络层设备(路由器)处理和转发到其他网络。因此,从功能和实现上看,ARP更紧密地与数据链路层(OSI)或网络接口层(TCP/IP)相关联。许多教材和实际应用中,将其视为数据链路层或网络接口层的辅助协议

ARP协议“是什么”?

ARP协议是一种请求/应答协议。它的基本功能是:

  • 地址解析: 当一个设备(主机或路由器)知道目标设备的IP地址,但不知道其在本地链路上的MAC地址时,就通过ARP协议来查询。
  • 维护ARP缓存: 为了提高效率,设备会将已经解析到的IP地址与MAC地址的对应关系保存在一个表中,这个表称为ARP缓存(ARP Cache)。下次需要给同一个IP地址发送数据时,就可以直接查表而无需再次发送ARP请求。

除了标准的ARP请求/应答,还有一种特殊的ARP报文叫做无故ARP(Gratuitous ARP)

  • 无故ARP: 这种报文是设备主动发送的,目的通常是为了:

    • 声明自己的IP/MAC: 当设备启动或IP地址配置发生变化时,发送无故ARP可以通知其他设备更新其ARP缓存中关于自己的条目。
    • 检测IP地址冲突: 发送目标IP和发送者IP都是自己地址的ARP请求,如果收到回复,说明网络中存在其他设备使用了相同的IP地址。

为什么要使用ARP?

这个问题本质上是问,为什么我们不能直接使用IP地址或MAC地址来完成通信?

  • IP地址: IP地址是逻辑地址,用于在整个互联网范围内标识设备和路由数据包。它们是分层的,允许路由器根据网络前缀进行路由决策。但是,IP地址本身并不提供在物理线路上发送数据所需的直接寻址信息。网络接口硬件(如网卡)工作在数据链路层,它们识别的是MAC地址。
  • MAC地址: MAC地址(Media Access Control Address)是物理地址,是网卡制造商在生产时烧录的全球唯一的标识符(通常是48位)。MAC地址用于在同一个物理网络段内识别设备。数据链路层设备(如交换机)使用MAC地址来转发帧。然而,MAC地址没有层次结构,不能用于跨网络路由。路由器不会根据目标MAC地址来决定如何转发数据包到另一个网络,它们依赖的是IP地址。

因此,当一个IP数据包需要通过某个网络接口发送出去时,无论是发往同一子网内的另一台主机,还是发往默认网关(路由器)以便转发到其他子网,都需要知道目标IP地址对应的下一跳设备的MAC地址。ARP协议正是填补了IP地址(网络层)与MAC地址(数据链路层)之间的鸿沟,使得IP数据包能够在物理网络上被正确封装和传输到下一跳。

ARP在哪里工作?

ARP协议的工作范围是本地物理网络段(或称为广播域、子网)

  • 当源设备和目标设备位于同一个子网内时,源设备需要通过ARP解析出目标设备的MAC地址,然后将IP数据包封装在以目标MAC地址为目的地的帧中直接发送。
  • 当源设备和目标设备位于不同的子网时,源设备不会去解析目标设备的MAC地址。它会根据自己的路由表,将IP数据包发送给其默认网关(路由器)。此时,源设备需要通过ARP解析的是默认网关(路由器接口)的IP地址对应的MAC地址。然后将IP数据包封装在以网关MAC地址为目的地的帧中发送给网关。路由器接收到帧后,解封装,查看IP数据包的目标IP,进行路由判断,再根据新的下一跳(可能是另一个路由器或最终目标)进行ARP解析(如果需要),并重新封装发送。

所以,ARP的“哪里”就是数据包要离开当前网络接口进入的那个物理网络段

ARP报文“有多少”字节?ARP缓存能存“多少”条?

这里探讨的是ARP报文的典型大小和ARP缓存的一些量化方面。

ARP报文大小:

  • 典型的以太网/IPv4环境下的ARP报文结构是固定的。其主要字段如下:

    • 硬件类型(Hardware Type):2字节,标识硬件类型,如以太网为1。
    • 协议类型(Protocol Type):2字节,标识上层协议类型,如IPv4为0x0800。
    • 硬件地址长度(Hardware Address Length):1字节,标识硬件地址长度,如MAC地址为6。
    • 协议地址长度(Protocol Address Length):1字节,标识协议地址长度,如IPv4地址为4。
    • 操作码(Operation Code):2字节,标识ARP操作类型,如ARP请求为1,ARP应答为2。
    • 发送方硬件地址(Sender Hardware Address):取决于硬件地址长度,如以太网为6字节(发送方MAC)。
    • 发送方协议地址(Sender Protocol Address):取决于协议地址长度,如IPv4为4字节(发送方IP)。
    • 目标硬件地址(Target Hardware Address):取决于硬件地址长度,如以太网为6字节(目标MAC,请求时通常为全0)。
    • 目标协议地址(Target Protocol Address):取决于协议地址长度,如IPv4为4字节(目标IP)。

将这些字段的长度相加:2 + 2 + 1 + 1 + 2 + 6 + 4 + 6 + 4 = 28字节

注意,这28字节是ARP报文本身的数据部分,它还需要被封装到数据链路层的帧中。例如,在一个标准的以太网帧中,前面还有14字节的以太网头部(目标MAC、源MAC、EtherType字段)和4字节的帧校验序列(FCS),总共至少是 14 + 28 + 4 = 46字节(不考虑填充)。

ARP缓存大小与条目数:

  • ARP缓存是存储IP-MAC映射的内存区域。其大小和能存储的条目数没有固定的标准或“多少”的限制
  • 这取决于设备的操作系统、配置以及可用的内存资源。普通的家用路由器可能只有几十或几百条的限制,而企业级路由器或服务器的ARP缓存可能支持数千甚至更多条目。
  • 缓存中的条目是动态学习到的,并且有老化时间(Timeout)。不同操作系统或设备类型的老化时间默认值不同,常见的可能在几十秒到几分钟之间(例如,Windows的动态ARP缓存条目默认老化时间可能约15-30秒,Linux可能更长,路由器设备可能不同)。长时间未使用的条目会被删除,以保证缓存的及时性和节省资源。也可以配置静态ARP条目,这些条目不会老化,除非手动删除。

ARP协议“如何”或“怎么”工作?

ARP协议的核心工作流程前面已经在“如何使用ARP?”部分简要提及。这里我们更详细地分解标准ARP请求/应答过程:

  1. 检查路由表: 源主机首先检查自己的路由表,判断目标IP地址与自己是否在同一个子网。
  2. 检查ARP缓存: 如果目标在同一子网,或者需要发送到默认网关,源主机接着检查其ARP缓存中是否有目标IP地址(或网关IP地址)对应的MAC地址条目。

  3. 缓存命中: 如果找到对应的MAC地址,源主机直接将IP数据包封装到数据链路帧中,目标MAC地址使用缓存中的条目,然后将帧发送到网络。
  4. 缓存未命中(发送ARP请求): 如果ARP缓存中没有找到对应条目,源主机需要发送一个ARP请求来查找。

    • 源主机构建一个ARP请求报文。报文中包含源主机的IP和MAC地址,以及它想要查找的目标IP地址。目标MAC地址字段通常填充为00:00:00:00:00:00(表示未知)。
    • 源主机将这个ARP请求报文封装到一个数据链路层的广播帧中。广播帧的目标MAC地址是全F(例如,以太网的广播MAC地址是FF:FF:FF:FF:FF:FF)。帧的EtherType(或类型/长度字段)设置为表示ARP的值(以太网为0x0806)。
    • 源主机将这个广播帧发送到所在的物理网络段。
  5. 设备接收ARP请求: 同一网络段上的所有设备都会接收到这个广播帧。

    • 每个设备都会检查收到的ARP请求报文中的“目标协议地址”(Target Protocol Address)字段。
    • 如果这个目标IP地址与自己的IP地址不匹配,设备会丢弃这个ARP请求。
    • 如果这个目标IP地址与自己的IP地址匹配(例如,目标主机B或路由器R),该设备(主机B或路由器R)就知道这个请求是找自己的。
  6. 发送ARP应答: 匹配成功的设备(主机B或路由器R)会构建一个ARP应答报文。

    • 应答报文中包含自己的IP地址和MAC地址(这就是请求者想要的)。同时,它会把请求报文中的发送方IP和MAC地址填入到应答报文的“目标协议地址”和“目标硬件地址”字段中,这样请求者就知道这个应答是给谁的。
    • 应答设备检查自己的ARP缓存,可能会将请求方的IP和MAC地址添加到自己的缓存中,以便后续直接通信。
    • 应答设备将这个ARP应答报文封装到一个数据链路层的单播帧中。单播帧的目标MAC地址是请求方的MAC地址(从收到的ARP请求报文中获取)。
    • 应答设备将这个单播帧直接发送回请求方。
  7. 接收ARP应答并更新缓存: 源主机接收到ARP应答帧。

    • 源主机解封装,提取出应答报文中的目标IP地址对应的MAC地址(也就是主机B或路由器R的MAC地址)。
    • 源主机将这个新的IP-MAC映射关系添加到自己的ARP缓存中。
    • 现在,源主机有了目标设备的MAC地址,它可以继续之前被阻塞的IP数据包的发送过程,将IP数据包封装到以目标MAC地址为目的地的单播帧中发送出去。

这就是ARP协议在本地网络中实现IP地址到MAC地址转换的基本流程。每次通信的第一个数据包可能需要等待ARP解析完成,后续发送到同一目标的包就可以直接利用ARP缓存。

如何查看和管理ARP缓存?

在大多数操作系统中,都提供了命令行工具来查看和管理ARP缓存。最常用的命令是 `arp`。

  • 查看ARP缓存:

    • 在Windows命令提示符中:输入 `arp -a` 或 `arp -g`。这将显示当前设备的ARP缓存条目列表,包括IP地址、对应的物理地址(MAC地址)以及条目类型(动态或静态)。
    • 在Linux、macOS等类Unix系统中:输入 `arp -a` 或简单的 `arp`。输出格式可能略有不同,但内容相似。

    通过查看缓存,你可以了解你的设备当前已经学习到了哪些IP地址对应的MAC地址。

  • 添加静态ARP条目:

    • 在Windows中:输入 `arp -s [目标IP地址] [对应的MAC地址]`,例如 `arp -s 192.168.1.100 00-A1-B2-C3-D4-E5`。静态条目不会因为超时而移除。
    • 在Linux、macOS中:使用 `sudo arp -s [目标IP地址] [对应的MAC地址]`,例如 `sudo arp -s 192.168.1.100 00:A1:B2:C3:D4:E5`。

    添加静态条目通常用于安全目的(防止ARP欺骗)或某些特殊配置。

  • 删除ARP条目:

    • 在Windows中:输入 `arp -d [目标IP地址]` 或 `arp -d *` (删除所有动态条目)。
    • 在Linux、macOS中:使用 `sudo arp -d [目标IP地址]`。

    删除条目可以用于故障排查或清除错误的缓存信息。

这些命令是网络管理员和用户诊断网络连接问题、检查ARP缓存状态的重要工具。

总而言之,ARP协议虽然在OSI模型中的层次归属略有争议,但其在连接IP层和数据链路层、实现本地网络内设备通信中的作用不可或缺。它通过广播请求和单播应答的机制,动态地维护着IP地址到MAC地址的映射关系,并通过ARP缓存提高了通信效率。理解ARP的工作原理对于深入理解局域网通信、进行网络故障排查以及认识网络安全问题(如ARP欺骗)都至关重要。

arp协议属于哪一层