《TCP/IP 详解 卷1:协议》第4章:地址解析协议
ARP 协议
地址解析协议(ARP, Address Resolution Protocol)是IPv4协议栈中一个关键的组成部分,用于在网络层的IP地址与数据链路层的硬件地址(如MAC地址)之间建立映射关系。它的主要任务是:
- 将32位的IPv4地址解析为对应的48位MAC地址,以便以太网等链路层协议能够正确封装并投递帧。
- 提供动态映射机制,自动适应网络环境的变化,而无需手动配置。
直接交付过程
直接交付(Direct Delivery) 是指当发送方与目标主机在同一IP子网中时,IP数据报可以不经过路由器,直接通过链路层协议(如以太网)发送到目标主机。这一过程中,地址解析协议(ARP) 起到了关键作用 —— 将目标主机的IPv4地址解析为其对应的MAC地址。
-
应用程序启动连接
- 应用程序(如 Web 浏览器)发起请求,目标地址是 IPv4 地址
10.0.0.1
(非主机名,因此不需要DNS解析)。
- 应用程序(如 Web 浏览器)发起请求,目标地址是 IPv4 地址
-
请求建立连接
- 应用层请求 TCP 建立连接至目标地址。
-
TCP发送数据报
- TCP 构造连接请求,并封装成 IP 数据报,目标地址为
10.0.0.1
。
- TCP 构造连接请求,并封装成 IP 数据报,目标地址为
-
检查是否直接交付
- 网络层检测到
10.0.0.1
与本地主机在同一子网内,因此无需经由网关或路由器,执行直接交付。
- 网络层检测到
-
发起地址解析请求(ARP 请求)
- 发送方必须知道目标主机的 MAC 地址,但仅有其 IP 地址,因此需要执行地址解析。
- 发送方构造一个 ARP 请求:广播一个以太网帧,询问 “谁是
10.0.0.1
,请告诉我你的 MAC 地址”。
-
广播ARP请求
- ARP 请求在链路层广播给本地网络上的所有主机。这要求底层网络必须是广播网络(如以太网),不能是非广播多路访问网络(NBMA,如 Frame Relay)。
-
接收与响应ARP请求
- 所有在该广播域内的主机都能接收到 ARP 请求。
- 只有配置了 IP 地址
10.0.0.1
的主机才会响应。 - 响应为ARP应答(Unicast),包含其 MAC 地址。
- 同时,所有接收到请求的主机都可以被动“学习”发送方的 IP-MAC 对,并缓存。
- 只有配置了 IP 地址
- 所有在该广播域内的主机都能接收到 ARP 请求。
-
发送实际数据报
- 一旦发送方接收到 ARP 应答,便获得目标主机的 MAC 地址。
- 然后,发送方使用这个地址将实际的 IP 数据报封装为以太网帧进行投递。
ARP 缓存
为了避免在每次发送IP数据报时都重复进行地址解析操作(即重复发送ARP请求),操作系统会维护一个称为 ARP 缓存(ARP Cache)的数据结构,用于存储已解析的 IP 地址与其对应的 MAC 地址之间的映射关系。
该缓存显著提升了网络通信的效率,是ARP协议运行的关键组成部分。
ARP缓存的结构
ARP缓存通常包含以下内容:
字段 | 说明 |
---|---|
IP地址(逻辑地址) | IPv4地址 |
MAC地址(物理地址) | 对应的硬件地址 |
接口信息 | 本地用于通信的网络接口 |
状态 | 静态或动态 |
TTL / 过期时间 | 条目的剩余生命周期(通常几分钟) |
缓存条目的两种类型
-
动态条目(Dynamic Entries)
- 由ARP协议自动创建。
- 在主机接收到ARP应答时添加。
- 有时间限制,过期自动删除(典型值是 60 秒到几分钟)。
- 接收ARP请求时也可被动学习(即非目标主机也可更新缓存)。
-
静态条目(Static Entries)
- 由管理员手动配置(如通过
arp
命令)。 - 永不过期,需手动删除或重启系统后清除。
- 用于安全或关键通信链路,防止ARP欺骗。
- 由管理员手动配置(如通过
缓存更新机制
- 每当主机发送ARP请求并收到应答时,都会插入或更新缓存中的对应条目。
- 接收到其他主机的ARP请求时,也会根据请求中包含的信息更新本地ARP缓存。
- 动态条目在一段时间后过期,以适应网络拓扑或设备变更,也就是软状态刷新。
ARP 帧格式
在以太网中,ARP请求和应答消息封装在以太网帧中,用于实现IPv4地址到以太网MAC地址的映射。ARP帧分为两部分:
- 以太网帧头(14字节)
- ARP消息体(28字节,用于IPv4 → MAC 映射)
- 广播地址:ARP请求使用以太网广播地址
ff:ff:ff:ff:ff:ff
作为目的地址。 - ARP应答是单播的:应答帧直接发给请求发送方,不使用广播。
- 信息冗余:ARP帧和以太网头都包含源MAC地址,这是典型的协议重叠设计。
- Op字段重要性:由于请求和应答的以太网类型字段相同(都为
0x0806
),必须通过 Op 字段区分。
代理 ARP
代理ARP(Proxy ARP)是一种 允许设备代表其他主机响应ARP请求 的机制。根据 [RFC 1027],代理ARP主要应用于以下场景:
🔁 一个系统(通常是路由器)收到一个针对某IP地址的ARP请求,并不是将请求转发给目标主机,而是自己代为应答,返回自己的MAC地址。
这使得请求主机误以为代理设备就是目标主机,从而将后续流量直接发送给代理设备,进而实现跨网络转发。
示例场景
假设有以下两个网络使用相同的IP前缀:
网络A:192.168.1.0/24
网络B:192.168.1.0/24
它们由一台中间路由器连接,出于某些遗留系统的限制,不能更改子网配置。这时路由器可配置为代理ARP:
- 当网络A中的主机
192.168.1.10
发送ARP请求:“谁是192.168.1.20?” - 网络B中的主机实际拥有这个IP。
- 路由器响应该请求,返回自己的MAC地址。
- 数据先到路由器,由其再转发给目标主机。