4. ARP协议原理:从广播问路到缓存表
ARP(Address Resolution Protocol)这玩意儿,说白了就是“谁有某某IP,请告诉我你的MAC地址”。
我刚开始学网络时,总觉得ARP很简单——不就是问一下嘛。后来在项目里被ARP问题坑过几次,才发现这协议虽然小,但坑不少。今天咱们就把它彻底讲透。
4.1 ARP到底解决什么问题?
两台主机通信,最终靠的是MAC地址。但应用程序只知道IP地址。这就好比你要寄快递,只知道对方姓名(IP),不知道门牌号(MAC)。ARP就是那个帮你查门牌号的“社区公告栏”。
ARP的核心逻辑就两条:
- 请求:广播问“谁有这个IP?”
- 响应:目标单播回复“我有,我的MAC是XX:XX:XX:XX:XX:XX”
你想想看,如果每次发数据都要广播问一次,那网络得炸。所以ARP引入了缓存机制——问一次,记下来,下次直接用。
4.2 ARP报文结构:拆开看看
ARP报文直接封装在以太网帧里,没有IP头部。它的结构很紧凑,我直接给你拆开:
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型 | 2字节 | 1表示以太网 |
| 协议类型 | 2字节 | 0x0800表示IPv4 |
| 硬件地址长度 | 1字节 | MAC地址长度,固定6 |
| 协议地址长度 | 1字节 | IPv4地址长度,固定4 |
| 操作码 | 2字节 | 1=请求,2=响应 |
| 发送方MAC | 6字节 | 谁发的 |
| 发送方IP | 4字节 | 谁发的 |
| 目标MAC | 6字节 | 请求时填0,响应时填目标 |
| 目标IP | 4字节 | 要找谁 |
注意看,ARP请求里“目标MAC”是空的(全0),因为还不知道嘛。响应里才会填上真正的MAC。
4.3 ARP请求与响应:一次完整的对话
假设主机A(192.168.1.10)想找主机B(192.168.1.20)。A的ARP缓存里没有B的记录,于是:
- A发送ARP请求:以太网目标MAC填FF:FF:FF:FF:FF:FF(广播),ARP里目标IP填192.168.1.20,目标MAC填00:00:00:00:00:00。
- 交换机转发:广播帧送到所有端口,同网段所有主机都能收到。
- B响应:B发现目标IP是自己,就回复一个ARP响应。这次是单播,直接发给A。
- A收到响应:把B的IP和MAC写入缓存,开始通信。
我在项目里遇到过一个问题:有台设备ARP请求发出去,但响应总是超时。后来抓包发现,是交换机的端口安全策略把广播帧给丢了。嗯,这种坑不抓包根本想不到。
4.4 ARP缓存:别老问,记下来
ARP缓存是每个主机维护的一张表,记录IP到MAC的映射。Windows上用arp -a查看,Linux上用arp -n。
缓存条目有两种状态:
- 动态:通过ARP协议自动学习,有过期时间(Windows默认2分钟,Linux默认30秒到几分钟不等)。
- 静态:手动添加,永久有效。我习惯把网关的MAC写成静态,防止ARP欺骗。
arp -d,Linux用ip neigh flush all。清完再抓包,能看到完整的ARP交互过程。
4.5 免费ARP:我来了,都记住我
免费ARP(Gratuitous ARP)是个很有意思的东西。它本质上是一个ARP请求,但目标IP是自己的IP。
它的作用有三个:
- 检测IP冲突:如果收到响应,说明有人用了同样的IP。
- 更新其他主机的缓存:比如换了网卡,MAC变了,发个免费ARP让大家都更新。
- 网关冗余:VRRP、HSRP这类协议切换时,新主设备会发免费ARP,让交换机更新MAC表。
我曾经遇到一个故障:一台服务器换了网卡后,同网段其他机器还是连不上。抓包一看,服务器没发免费ARP,其他主机的缓存里还是旧MAC。手动清一下缓存就好了。从那以后,我换网卡后都会手动发一次免费ARP。
4.6 Wireshark抓包验证:眼见为实
咱们来抓个包看看。我建议你在两台机器之间ping一下,同时抓ARP包。过滤条件用arp就行。
抓包结果里你会看到:
- 请求包:以太网目标MAC是广播(FF:FF:FF:FF:FF:FF),ARP操作码是1。
- 响应包:以太网目标MAC是请求方的MAC,ARP操作码是2。
免费ARP怎么抓?你可以在Windows上改一下IP地址(比如从自动获取改成静态),系统就会发免费ARP。过滤条件还是arp,看到目标IP等于源IP的请求包,那就是免费ARP。
4.7 ARP协议核心流程
下面这张图把ARP的完整流程画出来了,从缓存查询到请求响应,再到缓存更新:
4.8 避坑指南:我踩过的ARP坑
做网络这么多年,ARP相关的坑我踩过不少。挑几个典型的说说:
- ARP欺骗攻击:攻击者伪造ARP响应,告诉网关“我是目标主机”。我见过一个案例,内网有人用工具发伪造ARP,导致整个部门断网。解决办法是开DHCP Snooping和DAI(Dynamic ARP Inspection)。
- ARP缓存过期导致丢包:有台服务器间歇性丢包,查了半天发现是ARP缓存过期后,新请求被防火墙拦截了。把缓存超时时间调长就解决了。
- 免费ARP没发:前面说过,换网卡后一定要确认免费ARP发出去了。我习惯用
arping命令手动触发一次。
核心要点:
- ARP是IP到MAC的映射协议,请求广播,响应单播
- ARP缓存减少广播,动态条目有过期时间
- 免费ARP用于IP冲突检测和缓存更新
- Wireshark抓ARP包,过滤条件用
arp
ARP协议看着简单,但它是网络通信的基石。搞懂了ARP,你就能理解为什么有时候ping不通但抓包能看到请求——问题可能出在响应没回来,或者缓存没更新。下一层一层往上排查,ARP就是第一关。