飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • IP协议

    • 认识 IP 协议与网络层定位
    • IPv4 编址体系与分类地址
    • CIDR 与子网划分实战
    • IPv6 编址体系
    • ARP 协议详解
    • NDP 协议详解
    • IGMP 与 MLD 组播侦听发现
    • VRRP 与网关冗余
    • IPv4 数据报首部解析
    • IPv6 数据报与扩展首部
    • IPsec 安全扩展
    • 分片、MTU 与路径发现
    • ICMP 与 Traceroute 原理
    • 路由基础与转发流水线
    • 动态路由协议
    • NAT 网络地址转换
    • DHCP 与自动配置
    • Wireshark 与命令行工具
    • IPv6 过渡技术
    • IP 协议栈排障与攻击防御
  • TCP协议

    • 认识 TCP 协议与传输层定位
    • TCP 报文段首部解析
    • 三次握手与连接建立
    • 四次挥手与连接释放
    • TCP 有限状态机
    • 序列号与确认机制
    • 超时重传与 RTO 计算
    • 滑动窗口与流量控制
    • 拥塞控制基础
    • 现代拥塞控制算法
    • TCP 选项与扩展
    • TCP 性能调优与内核参数
    • Nagle 算法与糊涂窗口综合征
    • TCP 定时器与 Keep-Alive 机制
    • TCP 安全与攻击防御
    • TCP 与上层/下层交互
    • TCP 综合实践与排障

ARP 协议详解

为什么需要 ARP

IP 地址是逻辑地址,就像你快递单上的收件人姓名;MAC 地址是物理地址,就像收件人的身份证号。邮局(路由器)看姓名决定送到哪个城市,但最后一公里快递员必须核对身份证号才能交到本人手上。

ARP(Address Resolution Protocol,地址解析协议,RFC 826) 的作用就是:已知对方的 IP 地址,查询对方的 MAC 地址。

ARP 工作流程:广播问,单播答

场景:主机 A(192.168.1.10)想 ping 主机 B(192.168.1.20)

第一步:查 ARP 缓存

主机 A 先翻自己的"通讯录"(ARP 缓存表):

Windows: arp -a
Linux:   ip neigh

如果找到 192.168.1.20 → 00:1B:2C:3D:4E:5F,直接封装以太网帧发送。

第二步:发送 ARP 请求(广播)

如果没找到,主机 A 在子网内大喊(广播):

"谁是 192.168.1.20?请告诉我你的 MAC 地址!"

以太网目的 MAC: FF:FF:FF:FF:FF:FF(广播)
以太网源 MAC:   00:AA:BB:CC:DD:EE(主机 A)
ARP 操作码:     1(请求)
发送方 IP:      192.168.1.10
发送方 MAC:     00:AA:BB:CC:DD:EE
目标方 IP:      192.168.1.20
目标方 MAC:     00:00:00:00:00:00(未知,填零)

整个子网的所有设备都会收到这个广播,但只有 IP 是 192.168.1.20 的主机 B 会回应。

第三步:ARP 响应(单播)

主机 B 单播回复主机 A:

"我是 192.168.1.20,我的 MAC 是 00:1B:2C:3D:4E:5F"

以太网目的 MAC: 00:AA:BB:CC:DD:EE(主机 A)
以太网源 MAC:   00:1B:2C:3D:4E:5F(主机 B)
ARP 操作码:     2(响应)
发送方 IP:      192.168.1.20
发送方 MAC:     00:1B:2C:3D:4E:5F
目标方 IP:      192.168.1.10
目标方 MAC:     00:AA:BB:CC:DD:EE

第四步:更新 ARP 缓存

主机 A 收到响应后,把映射关系写入 ARP 缓存,通常保留 2~20 分钟(动态条目)。下次再访问 192.168.1.20 就不用广播了。

上图是 ARP 地址解析的完整时序。关键细节:请求是广播(FF:FF:FF:FF:FF:FF),响应是单播——只有目标主机回复,且直接单播给请求者,不再打扰其他设备。

ARP 缓存表详解

查看 ARP 表

# Windows
C:\> arp -a
接口: 192.168.1.10 --- 0x12
  Internet 地址      物理地址              类型
  192.168.1.1        00-50-56-c0-00-08     动态
  192.168.1.20       00-1b-2c-3d-4e-5f     动态
  192.168.1.88       00-50-56-ea-12-34     静态

# Linux
$ ip neigh
192.168.1.1 dev eth0 lladdr 00:50:56:c0:00:08 REACHABLE
192.168.1.20 dev eth0 lladdr 00:1b:2c:3d:4e:5f STALE

条目类型

类型说明生命周期
动态通过 ARP 协议学习几分钟到几十分钟,无访问则删除
静态手工绑定(arp -s)重启前一直有效

ARP 状态机(Linux)

状态含义
REACHABLE刚确认过,可信
STALE超过可达时间,但未失效,下次访问先确认
DELAY准备发送探测,等待短暂时间
PROBE正在发送 ARP 探测
FAILED探测失败,无此邻居

Linux 的邻居缓存状态机设计精妙:REACHABLE 表示"刚确认过可信",STALE 表示"可能还可用但需验证",避免每次通信都发 ARP 请求造成广播风暴。

免费 ARP(Gratuitous ARP)

免费 ARP 是不发请求、直接广播自己的映射,操作码也是 1(请求),但发送方和目标方 IP 相同。

用途 1:IP 冲突检测

主机开机时广播:"我是 192.168.1.10,MAC 是 xx:xx:xx:xx:xx:xx"。如果子网内已有此 IP,对方会收到并报警(Windows 弹出"IP 地址冲突")。

用途 2:VRRP 主备切换

VRRP 备机升主时,广播免费 ARP:"网关 IP 192.168.1.1 的 MAC 现在改为我了"。子网内所有主机会更新 ARP 缓存,流量自动切到新主。

用途 3:更新 ARP 缓存

更换网卡后 MAC 变了,发送免费 ARP 让邻居更新。

代理 ARP(Proxy ARP)

路由器开启代理 ARP 后,会代替其他主机响应 ARP 请求。

场景:主机 A(192.168.1.10/24)想访问 192.168.2.10,但子网掩码配错了(配成 /16),以为对方在同一子网。A 发 ARP 请求找 192.168.2.10,路由器收到后代替响应:"192.168.2.10 的 MAC 是我(路由器)"。

风险:代理 ARP 会掩盖网络配置错误,增加广播流量,现代网络已不推荐开启。

ARP 欺骗与防御

ARP 欺骗(ARP Spoofing / ARP Poisoning)

攻击者 C 向 A 广播:"192.168.1.20 的 MAC 是我(C)!" 同时向 B 广播:"192.168.1.10 的 MAC 是我(C)!"

结果:A 发给 B 的流量先到 C,C 看完/改完再转发给 B。这就是中间人攻击(MITM)。

防御手段

手段原理
静态 ARP 绑定arp -s 192.168.1.20 00:1b:2c:3d:4e:5f,但维护成本高
DHCP Snooping + DAI交换机记录 IP-MAC 映射,拦截非法 ARP
802.1X 认证只有合法设备才能接入网络
动态 ARP Inspection(DAI)Cisco 交换机特性,校验 ARP 包合法性

本篇小结

  • ARP 解决"IP 地址 → MAC 地址"的映射问题
  • 流程:查缓存 → 广播请求 → 单播响应 → 缓存结果
  • 免费 ARP 用于 IP 冲突检测、VRRP 切换、MAC 更新
  • 代理 ARP 已不推荐,会掩盖配置错误
  • ARP 欺骗是局域网常见攻击,可用静态绑定或 DAI 防御

动手实践

  1. 查看本机 ARP 缓存:arp -a(Win)或 ip neigh(Linux)

  2. 清空 ARP 缓存后 ping 网关,Wireshark 抓包观察 ARP 请求/响应:

    # Windows
    arp -d *
    ping 192.168.1.1
    
    # Linux
    ip neigh flush all
    ping 192.168.1.1
    
  3. Wireshark 过滤 arp,观察操作码(Opcode)1=请求,2=响应

  4. 观察免费 ARP:重启虚拟机或切换 VRRP 主备时抓包,看是否有发送方 IP=目标方 IP 的 ARP 包

上一页
IPv6 编址体系
下一页
NDP 协议详解