第6篇:一文读懂 ARP——广播请求与应答过程

一、写在前面

网络通信最底层的问题是:

我知道对方的 IP 地址,但我不知道对方的 MAC 地址,怎么把数据发过去?

ARP(Address Resolution Protocol,地址解析协议)就是来解决这个问题的——通过 IP 地址找到对应的 MAC 地址

ARP 是网络通信中无处不在但默默工作的协议,理解它是排查网络故障的必备能力。


二、为什么需要 ARP?

在以太网中,二层帧的传输依赖 MAC 地址,但上层应用(TCP/IP)使用的是 IP 地址

PC-A(192.168.1.1)想给 PC-B(192.168.1.2)发数据
          │
          ▼
它知道 PC-B 的 IP = 192.168.1.2
但不知道 PC-B 的 MAC 地址是什么
          │
          ▼
所以需要 ARP 去问:"192.168.1.2 的 MAC 地址是多少?"

三、ARP 工作过程详解

3.1 场景:同一网段

PC-A                      PC-B
IP: 192.168.1.1          IP: 192.168.1.2
MAC: AA-AA-AA-AA-AA-AA   MAC: BB-BB-BB-BB-BB-BB
       │                       │
       │                       │
       └──────[交换机]─────────┘

第 1 步:PC-A 查 ARP 缓存

PC-A 想给 192.168.1.2 发数据,先查自己的 ARP 缓存表:

C:\> arp -a

接口: 192.168.1.1 --- 0x5
  Internet 地址      物理地址        类型
  192.168.1.1        aa-aa-aa-aa-aa-aa  静态   ← 自己的
  192.168.1.254      ee-ee-ee-ee-ee-ee  动态   ← 网关

没找到 192.168.1.2 的条目,触发 ARP 请求。

第 2 步:PC-A 发送 ARP 请求(广播)

PC-A 发一个 广播帧

字段
源 MAC AA-AA-AA-AA-AA-AA
目的 MAC FF-FF-FF-FF-FF-FF(广播)
源 IP 192.168.1.1
目的 IP 192.168.1.2
操作 Request(0x0001)

广播 MAC = FF-FF-FF-FF-FF-FF,交换机收到后会泛洪到所有端口。

第 3 步:所有设备收到广播

  • PC-B:检查目的 IP 是自己 → 回复
  • PC-C(如果有):检查目的 IP 不是自己 → 丢弃
  • 交换机:记录源 MAC(AA-AA-AA-AA-AA-AA)到 MAC 表

第 4 步:PC-B 回复 ARP 应答(单播)

PC-B 发送 单播帧 回复 PC-A:

字段
源 MAC BB-BB-BB-BB-BB-BB
目的 MAC AA-AA-AA-AA-AA-AA(单播,PC-A 的 MAC)
源 IP 192.168.1.2
目的 IP 192.168.1.1
操作 Reply(0x0002)

第 5 步:更新 ARP 缓存

PC-A 收到 ARP Reply,将 192.168.1.2 → BB-BB-BB-BB-BB-BB 写入 ARP 缓存表。

C:\> arp -a
  192.168.1.2        bb-bb-bb-bb-bb-bb   动态    ← 刚学的

现在 PC-A 知道 PC-B 的 MAC 了,可以发送真正的数据了


四、ARP 报文格式

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─────────────────────────────────────────────────────────────────┤
│      硬件类型(0x0001 = 以太网)        │     协议类型(0x0800 = IP)│
├──────────────────────┬──────────────────────────────────────────┤
│ 硬件地址长度 (6)     │ 协议地址长度 (4) │        操作             │
│                      │                 │ (1=Req, 2=Reply)        │
├─────────────────────────────────────────────────────────────────┤
│                    发送端 MAC 地址(6 字节)                      │
├─────────────────────────────────────────────────────────────────┤
│                    发送端 IP 地址(4 字节)                       │
├─────────────────────────────────────────────────────────────────┤
│                    目标 MAC 地址(6 字节)                        │
├─────────────────────────────────────────────────────────────────┤
│                    目标 IP 地址(4 字节)                         │
├─────────────────────────────────────────────────────────────────┤

操作(Operation): - 0x0001 = ARP Request(请求) - 0x0002 = ARP Reply(应答)


五、ARP 缓存表

5.1 查看 ARP 缓存

# Windows
arp -a

# Linux
ip neigh show
# 或
arp -n

# 华为交换机
<Huawei> display arp

5.2 缓存老化时间

系统 默认老化时间
Windows 通常 15~45 秒(不活动)
Linux 通常 60 秒
华为交换机 默认 1200 秒(20 分钟)

5.3 手动管理 ARP 缓存

# Windows 删除所有 ARP 条目
arp -d

# Linux 删除特定条目
arp -d 192.168.1.2

# 添加静态 ARP(固化 MAC 映射)
arp -s 192.168.1.100 bb-bb-bb-bb-bb-bb

六、ARP 的三种类型

6.1 普通 ARP(最常用)

同一网段内,通过 IP 查 MAC。

6.2 反向 ARP(RARP)

通过 MAC 找 IP。早期无盘工作站使用,现在基本被 DHCP 取代。

6.3 代理 ARP(Proxy ARP)

概念:路由器/三层设备替其他设备回复 ARP 请求。

场景:PC-A(10.1.1.1/8)想访问 PC-B(10.2.2.2/8)——逻辑上它们在不同的网段,但如果 PC-A 的子网掩码太大(/8),它会认为 PC-B 在同一网段,于是发送 ARP 广播找 PC-B 的 MAC。

这时路由器会代理回复:告诉 PC-A "PC-B 的 MAC 就是我",然后路由器负责把数据转发给 PC-B。

# 华为设备配置代理 ARP
[Huawei-GigabitEthernet0/0/1] arp-proxy enable

七、ARP 相关故障排查

7.1 ARP 表项不完全

C:\> arp -a
  192.168.1.2         **不完全**   动态

"不完全" = 发了 ARP Request 但没收到 Reply。原因: - 目标 IP 不存在 - 目标设备关机 - 链路不通 - 目标设备开启了 ARP 防攻击

7.2 IP 地址冲突

ARP 是 IP 冲突排查的重要依据:

C:\> arp -a
  192.168.1.100      aa-aa-aa-aa-aa-aa   动态
  192.168.1.100      bb-bb-bb-bb-bb-bb   动态  ← 同一个 IP 出现两个 MAC

这就是 IP 冲突的典型表现。同一 IP 对应两个 MAC,说明有两台设备用了同一个 IP。

7.3 ARP 欺骗攻击

攻击者发送伪造的 ARP 报文,把网关的 IP 映射到攻击者的 MAC:

正常情况:
  网关 192.168.1.1 → MAC: GG-GG-GG-GG-GG-GG

攻击后:
  网关 192.168.1.1 → MAC: HH-HH-HH-HH-HH-HH(攻击者的 MAC)

后果:PC 访问外网的数据全部经过攻击者,被窃听或劫持。

防护手段: - DAI(Dynamic ARP Inspection):交换机检测 ARP 报文合法性 - DHCP Snooping:配合 DAI 做信任端口 - 静态 ARP 绑定:对关键设备固化 ARP


八、华为交换机 ARP 常用命令

# 查看 ARP 表
<Huawei> display arp

# 查看 ARP 表统计
<Huawei> display arp statistics

# 静态 ARP 绑定
[Huawei] arp static 192.168.1.100 bb-bb-bb-bb-bb-bb

# 开启 ARP 防攻击
[Huawei] arp anti-attack check user-bind enable

# 查看 ARP 老化时间
<Huawei> display arp aging-time

# 修改 ARP 老化时间
[Huawei] arp aging-time 600

九、思考

  1. ARP 请求为什么是广播?ARP 应答为什么是单播?
  2. ARP 缓存表的默认老化时间一般是多少?太短或太长对网络有什么影响?
  3. 什么是"ARP 不完全"?看到这个状态怎么排查?
  4. 什么是 ARP 欺骗?如何防护?
  5. 代理 ARP 在什么场景下使用?
  6. 两台 PC 在同一个 VLAN 里,第一次通信时 ARP 和交换机 MAC 学习是什么先后顺序?

下篇预告:第7篇《同一VLAN内两台PC如何通信》——分析同一VLAN内两台PC通信的完整数据流。