7.0 KiB
7.0 KiB
tags, create time
| tags | create time | ||||
|---|---|---|---|---|---|
|
2026-05-18 00:40 |
ARP 协议完整流程
概述
ARP(Address Resolution Protocol,地址解析协议)负责将 IP 地址解析为同一局域网内的 MAC 地址。它是 IPv4 网络通信中不可或缺的"胶水协议"——每对首次通信的主机之间都必须经过一次 ARP。
ARP 报文格式
ARP 直接封装在 Ethernet 帧中(EtherType = 0x0806),不依赖 IP:
┌───────────────────┬───────────────┬────────────────────┐
│ Hardware Type │ Protocol Type │ Hardware Addr Len │
│ 2 bytes │ 2 bytes │ 1 byte │
│ 1 = Ethernet │ 0x0800=IP │ always 6 │
├───────────────────┼───────────────┼────────────────────┤
│ Protocol Addr Len │ Operation │ Sender MAC │
│ 1 byte │ 2 bytes │ 6 bytes │
│ always 4 │ 1=Request │ │
│ │ 2=Reply │ │
├───────────────────┴───────────────┴────────────────────┤
│ Sender IP Address (4 bytes) │
├────────────────────────────────────────────────────────┤
│ Target IP Address (4 bytes) │
├────────────────────────────────────────────────────────┤
│ Target MAC Address (6 bytes) │
│ (in Request, this is zeroed/empty) │
└────────────────────────────────────────────────────────┘
Total: 28 bytes payload (padded to ≥ 46 bytes by Ethernet)
Operation 字段
| 值 | 含义 |
|---|---|
| 1 | ARP Request — "谁是 x.x.x.x?请告诉我的 MAC" |
| 2 | ARP Reply — "我是 x.x.x.x,我的 MAC 是 yy" |
| 3 | RARP (Reverse ARP) — 历史遗留,已废弃 |
| 8 | InARP (Inverse ARP) — ATM 网络用 |
ARP 请求与回复流程
sequenceDiagram
participant Src as PC-A<br/>192.168.1.10/aa:bb:cc:dd:ee:01
participant Bcast as 广播域内所有主机
participant Dst as PC-B<br/>192.168.1.20/?mac
Note over Src: Application wants to send packet to .20<br/>But needs MAC first!
Src->>Bcast: ARP Request (Broadcast)<br/>Who has 192.168.1.20? Tell 192.168.1.10
Note over Src,Bcast: Src MAC=aa:bb:cc:dd:ee:01<br/>Dst MAC=ff:ff:ff:ff:ff:ff<br/>Target IP=.20, Target MAC=00:00:00:00:00:00
loop For each host on LAN
Bcast-->>Host-C: 收到但不匹配 → 忽略
end
Dst-->>Src: ARP Reply (Unicast)<br/>192.168.1.20 is at aa:bb:cc:dd:ee:20
Src->>Src: Update ARP Cache: 192.168.1.20 → aa:bb:cc:dd:ee:20
ARP 缓存条目
$ ip neigh show
192.168.1.20 dev eth0 lladdr aa:bb:cc:dd:ee:20 STALE
192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:01 REACHABLE
fe80::1 dev eth0 lladdr aa:bb:cc:dd:ee:01 DELAY
# 状态机:
# INCOMPLETE — 请求已发但未收到回复
# REACHABLE — 确认可达(刚收到回复或收到 ACK)
# STALE — 过期但可用,等待下次验证
# DELAY — 已标记为 STALE,等待 probe
# FAILED — Probe 全部失败
ARP 缓存超时时间
# Linux 默认超时(秒)
$ sysctl net.ipv4.neigh.default.base_reachable_time_ms
net.ipv4.neigh.default.base_reachable_time_ms = 30000 # 30s
# 可调为毫秒精度
$ echo 60000 > /proc/sys/net/ipv4/neigh/default/base_reachable_time_ms # 改为 60s
Gratuitous ARP(免费 ARP / 主动 ARP)
什么是 Gratuitous ARP?
一台主机主动发送 ARP 回复,即使没有收到任何请求。这相当于在广播域中宣布:"我现在是 xx:xx:xx:xx:xx:xx,绑定的是 x.x.x.x"。
三种使用场景
| 场景 | 目的 |
|---|---|
| 网卡故障切换 (VRRP/Keepalived) | 通知交换机更新 MAC→端口映射 |
| IP 冲突检测 | 先发送 GARP,如果有人回应则发现冲突 |
| 虚拟机迁移 | 新宿主机的 MAC 替代旧主机的 IP |
| DHCP 续租 | 重新声明自己的地址绑定关系 |
sequenceDiagram
participant V1 as VM-on-Host-A<br/>IP: 10.0.0.10<br/>MAC: aa:bb:cc:00:00:01
participant SW as Switch
participant Migrate as VM migrates to Host-B
Note over V1: Live Migration starts...
V1->>SW: 最后一帧 from Host-A<br/>Switch learns: .10 → Port-X
Note over Migrate: VM boots on Host-B<br/>Same IP, New MAC!
Migrate->>SW: GARP "10.0.0.10 is now cc:dd:ee:00:00:01!"
SW->>SW: UPDATE MAC table:<br/>.10 → Port-Y ✅
Note over V1,Migrate: Without GARP, all traffic would go to old port 😱
ARP 安全与攻击
ARP Spoofing / Poisoning
攻击者发送伪造的 ARP Reply,让受害者认为网关的 MAC 已被篡改:
Before:
PC: "Gateway is at aa:bb:cc:gg:hh:ii ✅"
Server: "I am at dd:ee:ff:jj:kk:ll ✅"
After Attack (Attacker injects fake ARP):
PC: "Gateway is at mm:nn:oo:pp:qq:rr ❌ ← Attacker's MAC!"
防范措施
| 措施 | 说明 | 部署位置 |
|---|---|---|
| 静态 ARP | arp -s 手动绑定 |
小型网络,管理成本高 |
| Dynamic ARP Inspection (DAI) | Switch 拦截非合法 DHCP binding 的 ARP | 交换机配置 |
| ARP Watch / Arpmonitor | 监控 ARP 变动并告警 | 服务端 |
| ndp-scan / arp-scan | 定期扫描 ARP 表变化 | 运维工具 |
# 手动添加静态 ARP 条目(重启失效)
$ sudo ip neigh add 192.168.1.1 lladdr aa:bb:cc:dd:ee:01 nud permanent dev eth0
# 永久生效需写入 NetworkManager 或 systemd-networkd 配置
IPv6 中的替代:NDP(Neighbor Discovery Protocol)
IPv6 废除了 ARP,改用 NDP(ICMPv6 类型 133/134/135/136):
| ARP 功能 | NDP 实现 | ICMPv6 Type |
|---|---|---|
| ARP Request | Neighbor Solicitation (NS) | 135 |
| ARP Reply | Neighbor Advertisement (NA) | 136 |
| gratuitous ARP | Unsolicited NA | 136 |
| 路由发现 | Router Solicitation / Advertisement | 133 / 134 |
[!tip] 为什么 NDP 更安全? NDP 支持 SEND(Secure Neighbor Discovery,RFC 3971),利用加密签名防止伪装。虽然部署不多,但架构上比明文 ARP 好得多。
关联笔记
- hhs/NETWORK/MAC地址与广播域 — ARP 如何在广播域中工作
- hhs/NETWORK/Switch与路由器 — Switch 如何处理 ARP 包
- hhs/NETWORK/OSI与TCP-IP模型对比 — ARP 跨越链路层和网络层的边界