网络修炼笔记:ARP 协议与局域网通信原理

通过 Wireshark 抓包实验,深入分析 ARP 协议在局域网通信中的底层工作原理,包括 ARP 请求/应答机制、缓存老化过程以及协议栈分层行为。

...

实验环境准备

  • 测试设备:笔记本电脑(Windows 11,IP 192.168.2.162
  • 对端设备:手机(Android/iOS,IP 192.168.2.215
  • 测试工具:Wireshark、CMD 终端

实验一:局域网初始状态通信(双向互通)

操作步骤

  1. 打开 PC 命令行,执行 arp -d 清空本地 ARP 缓存表。
  2. 打开 Wireshark 并选择当前使用的网卡开始抓包。
  3. 在 PC 上执行连续 PING 测试:ping 192.168.2.215 -t

Wireshark 报文分析

在两端设备首次建立连接时,捕获到完整的 ARP 与 ICMP 报文交互:

1
2
3
4
13	0.257829	AzureWav_ef:e8:22	Broadcast	ARP	42	Who has 192.168.2.215? Tell 192.168.2.162
22	0.512216	46:44:9a:bd:52:aa	AzureWav_ef:e8:22	ARP	42	192.168.2.215 is at 46:44:9a:bd:52:aa
23	0.512296	192.168.2.162	192.168.2.215	ICMP	74	Echo (ping) request  id=0x0001, seq=630/30210, ttl=128 (reply in 32)
32	1.023984	192.168.2.215	192.168.2.162	ICMP	74	Echo (ping) reply    id=0x0001, seq=630/30210, ttl=64 (request in 23)

ARP 请求(No. 13):由于二层封装缺少目的 MAC 地址,PC 发起二层广播(Broadcast),询问谁拥有该 IP。

ARP 应答(No. 22):手机收到广播后,以单播形式回应自己的 MAC 地址(bee7945506be)。

ICMP 交互(No. 23\32):获取 MAC 地址并写入本地 ARP 缓存表后,三层 ICMP 报文成功封装二层帧头并发送,Ping 成功。

Wireshark ping 截图


实验二:突发链路故障下的协议栈行为分析

操作步骤

  1. 在上述 ping -t 过程中,突然断开手机的 Wi-Fi 连接(模拟对端物理断开关机)。
  2. 观察 PC 终端提示并持续记录 Wireshark 抓包。

报文分析与行为规律

在对端断开后,实验现象呈现明显的两个阶段:

ARP 缓存存活期(有表状态)

对端刚断开时,终端立刻提示"请求超时",但 Wireshark 中依然能看到 ICMP Request 发出:

1
2
147	6.684261	192.168.2.162	192.168.2.215	ICMP	74	Echo (ping) request  id=0x0001, seq=646/34306, ttl=128 (no response found!)
235	11.520937	192.168.2.162	192.168.2.215	ICMP	74	Echo (ping) request  id=0x0001, seq=647/34562, ttl=128 (no response found!)

原理:Windows 协议栈在封装数据时优先读取本地 ARP 缓存。只要缓存未老化,即使对端不回应,PC 依然会根据表项中的 MAC 强行完成二层封装并送入网线。

Wireshark ICMP Request 截图

ARP 缓存老化失效期(无表状态)

持续一会超时后,终端提示由"请求超时"转变为"目标主机不可达"或直接停止发送 ICMP,抓包中 ICMP 报文完全消失,只剩下 ARP 广播。

Wireshark ARP Broadcast 广播的截图

原理:当本地 ARP 表项老化删除,或者操作系统触发探测机制后,协议栈在二层封装时无法获取"目的 MAC"。由于二层帧头残缺,三层数据包(ICMP)无法向下传递,导致报文无法发出,PC 只能持续发送 ARP 广播尝试修复连接。


结论

  1. 网络通信,二层先行:三层协议(IP/ICMP等)能够发出的物理前提,是二层以太网帧必须具备合法的目的 MAC 地址。
  2. ARP 表决定封装行为:只要 ARP 表项存在,设备就会执行封装并发包(即使对方已挂);ARP 表项缺失,数据包在本地即被阻断,转化为 ARP 寻址行为。
Created by aka.g