前面几节有两套门牌一直并存着(3.2):IP 管全程、MAC 管一段。可你要给对面发数据时,手上只有对方的 IP,而负责实际投递的接口层要的是对方的 MAC——两份门牌对不上号。补这个缺口的协议就是 ARP(地址解析协议):拿 IP 换 MAC。它干活的方式特别朴素——喊一嗓子问全网段,谁知道谁答。
3.2 给的 arp -a 那张"街坊名册"、3.9 说的"ARP 靠广播问人"、还有 3.2 那句"MAC 头段段更换"——为什么段段更换,本节给出答案:因为每一段都要重新 ARP 一次。
一、缺口在哪:两份门牌对不上
复述一下两套门牌
| IP 地址 | MAC 地址 | |
|---|---|---|
| 谁认 | 网际层 | 网络接口层 |
| 范围 | 全程有效(端到端不变) | 只在本段链路有效(段段更换) |
| 怎么来 | 接入网络时分配 | 网卡出厂焊死 |
| 类比 | 快递面单地址 | 身份证号 |
问题出在这儿:
你要发数据,手上的"收件人"是对方的 IP。可接口层把帧送出去时,帧头里必须写对方的 MAC。
一个跨网数据要经过好几段链路,每段的收件人 MAC 都不一样——你手里的那份 IP,没法告诉接口层"这一段的 MAC 填谁"。
所以需要一个"翻译"动作
ARP(Address Resolution Protocol,地址解析协议)就干这件事:
ARP 的职责:把"IP 地址"解析成"MAC 地址"。
名字里的"解析"(resolution)就是"翻译成另一种形式"的意思。它不传你的业务数据,专门负责问出下一跳的硬件地址——这一点跟 3.15 的 ICMP 有点像:都是配角,都在为数据包顺利送达做后勤。
二、ARP 的三步动作
(对应上面第一张图)假设你的电脑 A(192.168.1.10)要给 B(192.168.1.20)发数据:
第一步:先查自己的小本子
A 先翻自己的 ARP 缓存(一张"IP ↔ MAC"对照表):有没有 192.168.1.20 的记录?
- 有 → 直接拿它的 MAC 填进帧头,发货。整个过程不需要任何额外通信
- 没有 → 走第二步
第二步:广播问一圈
A 向整个网段发一条广播:
"谁是
192.168.1.20?请把 MAC 告诉我(我192.168.1.10)。"
这条消息本网段所有设备都会收到(3.9 的广播)。为什么必须广播?因为 A 此刻除了 IP,什么都不知道——不知道该发给谁,只能"喊一嗓子"。
但只有真正的 B 会应答,其它设备(图里的设备 C)看一眼"不是找我",直接丢弃——不是自己的事就不掺和。
第三步:单播回答 + 双方记账
B 收到广播后,单播回一条给 A:
"我是
192.168.1.20,我的 MAC 是bb:bb:bb:bb:bb:bb。"
A 收到后做两件事:
- 把
192.168.1.20 → bb:bb:bb记进自己的 ARP 缓存(下次直接查表,不再问) - 正式开始发数据
顺带一个细节:B 也会把 A 的记录顺手记进自己的缓存——因为它在应答时也看到了 A 的 IP 和 MAC。所以一次 ARP 是"双方都受益"的。
广播问、单播答、问完记账。 前半段靠广播"广撒网",后半段靠单播"精准回"——正好把 3.9 讲的两种收件形态各用了一次。
三、ARP 报文长什么样
会认级别,但有两个字段的填法必须知道:
| 字段 | 请求时怎么填 | 应答时怎么填 |
|---|---|---|
| 发送方 IP / MAC | 自己的 | 自己的 |
| 目标 IP | 对方的具体 IP(192.168.1.20) |
对方的具体 IP |
| 目标 MAC | 全 0(00:00:00:00:00:00,因为还不知道) |
自己的 MAC |
| 外层以太网帧的目的地址 | FF:FF:FF:FF:FF:FF(广播) |
对方的 MAC(单播) |
很多人以为 ARP 请求用的是 192.168.1.255 那种广播 IP。不是。
- ARP 报文里的目标 IP 是一个具体的单播地址(
192.168.1.20)——它要问的正是"这个 IP 是谁" - 真正的"广播"体现在外层的以太网帧头:目的 MAC 填
FF:FF:FF:FF:FF:FF(全 F)
说白了:ARP 的广播是链路层的广播,不是 IP 层的广播地址。 这也解释了为什么 ARP 出不了网段——因为 3.9 讲过,路由器默认不转发广播。
还有一个位置要认准:ARP 报文直接装在以太网帧里,不装在 IP 包里(对比一下:ICMP 是装在 IP 包里的,协议号 1)。所以 ARP 是网络接口层的协议,不是网际层的——虽然它处理的内容(IP 地址)归网际层管。又是"分层各管一段"。
四、ARP 缓存:那张小本子
这就是 3.2 demo 里 arp -a 看到的东西。几个要知道的点:
| 特点 | 说明 |
|---|---|
| 内容是临时的 | 有寿命,一段时间不用就被清理(几十秒到几分钟,不同系统不一样,别死记数字)——跟 3.14 的 NAT 表项一样会老化 |
| 分动态 / 静态两种 | 动态 = 问来的(会老化);静态 = 手工绑定的(不过期,用来防欺骗) |
| 容量有限 | 表满了会挤掉最老的条目 |
| 清得掉 | arp -d * 清空(要管理员权限),清完会重新问一遍 |
为什么要有寿命?因为设备的 IP 可能变、网卡可能换——如果 Forever 不清理,A 会一直拿一个过期的 MAC 去发货,直接发不出去。这跟 3.14 里"挂久的网页要重新加载"是同一个道理。
五、跨网段时问谁(本节最值钱的一段)
(对应上面第二张图)前面讲的都是同一个网段内。可你要打开 www.baidu.com,目标在千里之外——这时候 ARP 问谁?
先记住一条铁律:
ARP 只在同一个网段里工作。路由器不转发 ARP 请求(跟广播一个待遇,3.9)。
那跨网段的包怎么发出去?
答案是:A 根本不问目标的 MAC,只问网关的 MAC。
- A 一看目标 IP(
203.0.113.5)跟自己不在同一网段(用 3.11 的"IP AND 掩码"算一下就知道) - 于是 A 决定:这个包交给默认网关
- A 去 ARP 问的,是网关(
192.168.1.1)的 MAC - 帧头写网关的 MAC → 发给网关
- 网关收到后,拆掉这段帧头,在它的下一段链路里再 ARP 一次,问下一跳的 MAC……
- 一段一段接力下去,直到最后一台路由器问到目标设备自己的 MAC
3.2 说"IP 头端到端不变,MAC 头段段更换"——为什么段段更换?
因为每换一段链路,就要重新 ARP 一次,问出那一段该用的 MAC。
所以 ARP 问的永远是"下一跳"的 MAC,而不是"最终目标"的 MAC。同网段时,下一跳恰好就是目标本身;跨网段时,下一跳是网关(然后由别人接力)。
一句口诀:
IP 是全程的收件人,MAC 是这一段的收件人。
六、ARP 家族的其它成员
会认级别,遇得到再回来查:
| 名字 | 干什么 | 什么时候遇到 |
|---|---|---|
| 免费 ARP(Gratuitous ARP) | 设备开机时广播一句"我叫 X,MAC 是 Y" | 一是检测 IP 冲突(有人应答说明撞号了),二是通知邻居更新表(换了网卡时有用) |
| 代理 ARP(Proxy ARP) | 路由器替别的网段的设备应答 ARP | 老网络的兼容方案,现在少用 |
| RARP(反向 ARP) | 反过来:从 MAC 找 IP | 已经被 DHCP 取代(3.12) |
免费 ARP 那条特别实用:开机会广播自己的地址这个行为,恰好解释了一件事——有些网络里你看不到任何操作,arp -a 的表项却自己在变,就是邻居们开机在自报家门。
七、ARP 的软肋:没有身份验证
这一节的安全部分是真能用上的。
ARP 的设计有个致命假设:
它默认"谁答就信谁"。 收到一条 ARP 应答,不做任何验证,直接记进表。
这就给了攻击者可乘之机——ARP 欺骗(ARP 投毒):
- 攻击者在同一网段里广播假应答:"
192.168.1.1的 MAC 是我的" - 网段里所有设备的表都被污染:以为网关是攻击者
- 于是所有人的上网流量,全部先经过攻击者的电脑,再由他转发出去
- 这就是典型的中间人攻击——可以不改内容地偷看(窃听),也可以篡改
咖啡厅、酒店的开放 Wi-Fi 是同一个广播域,任何一个人都能发 ARP 欺骗。你以为自己在连路由器,其实流量正从陌生人的笔记本里过。
防御手段(会认即可):
- 静态 ARP 绑定:把网关的 IP-MAC 手工写死,不接受动态更新(netsh interface ipv4 add neighbors)
- 交换机侧的防护:DHCP Snooping、动态 ARP 检测(DAI)——只在企业级交换机上有
- 加密兜底:ARP 欺骗能窃听,但 HTTPS 的加密内容它读不懂——所以看到"证书错误"要及时警惕,可能不只是证书过期
八、IPv6 里没有 ARP
3.15 提过一句,这里正式认脸:
IPv6 里 ARP 被废除了,改由 ICMPv6 的邻居发现(NDP)承担——功能一样(拿 IP 换 MAC),但做在 ICMPv6 里。所以:
- IPv6 下抓包看不到 ARP,看到的是 NS / NA(邻居请求 / 邻居通告)这对报文
- 这也正是 3.15 那条警示的由来:IPv6 下禁 ICMP 会把地址解析一起禁掉,网络直接瘫痪
九、动手 Demo30:把 ARP 抓个现行
-
看名册(3.2 看过一次,这回看得懂)
arp -a重点看三列:IP 地址 / 物理地址(MAC)/ 类型(动态 or 静态)。表里应该能看到网关那条。 -
看它怎么"长"出新条目(本节最直观的一步)
arp -a ping 192.168.1.1 arp -a如果该条目原本不存在(或已过期),前后对比会多出一行——那一行就是刚才那次广播问答的结果。 -
清空后看它重问(要管理员权限的 cmd)
arp -d * arp -a ping 192.168.1.1 arp -a清空后表是空的,ping 一下又回来了——整个过程你什么都没看见,但广播已经在网段里跑了一趟。 -
本节最漂亮的一个实验:验证"ARP 只问下一跳"
arp -a ping 8.8.8.8 arp -a关键观察:arp -a里永远不会出现8.8.8.8的 MAC!只会多出(或刷新)网关那一条。
为什么?因为 8.8.8.8 在别的网段——按第五部分讲的,A 只问网关的 MAC,根本没跟 8.8.8.8 说过话。
这一条直接证明了"ARP 出不了网段"。看到它你就真懂 ARP 了。
-
看静态绑定的写法(可选,要管理员权限)
netsh interface ipv4 add neighbors "以太网" 192.168.1.1 c0-xx-xx-xx-xx-xx执行后再arp -a,网关那条的"类型"会变成静态——它不会再老化,也不会被 ARP 欺骗改掉。这是家用环境下性价比最高的一条防中间人手段(把网关的 MAC 绑死)。 -
30 秒实验:验证 ARP 缓存有寿命
arp -a记下当前所有条目 → 静置 5~10 分钟什么都不做 → 再跑一遍。 - 那些"这期间没再通信过"的条目会消失(老化清理)
- 网关那条多半还在(只要你有网络活动,它就一直在用)
- 想看得更快:
arp -d *一键清空,效果比等更直接
十、常见误区
- ❌ "ARP 报文装在 IP 包里" → 直接装在以太网帧里。ICMP 才装 IP 包里(协议号 1);ARP 是网络接口层的活
- ❌ "ARP 请求用的是
192.168.1.255广播地址" → 广播在帧头(目的 MAC =FF:FF:FF:FF:FF:FF);ARP 报文里的目标 IP 是具体的单播地址 - ❌ "跨网段时会问到目标设备的 MAC" → 只问网关。目标 MAC 由路径上最后一跳的路由器去问
- ❌ "每发一个包都要 ARP 一次" → 有缓存,命中就直接用,不问(这也是缓存存在的意义)
- ❌ "ARP 缓存永久有效" → 有寿命会老化,跟 NAT 表项一个道理(3.14)
- ❌ "ARP 是安全的、可靠的" → 无身份验证,谁答就信谁 → ARP 欺骗 / 中间人攻击
- ❌ "ARP 能跨网段用" → 跟广播一样被路由器拦下(3.9),ARP 是网段内的协议
- ❌ "IPv6 也有 ARP" → 被 ICMPv6 邻居发现 NDP 取代,抓包里看 NS / NA
- 为什么需要 ARP?两份门牌之间缺了什么?
- ARP 的三步动作分别是什么?为什么第一步之后可以"不再问"?
- ARP 请求必须用广播,原因是什么?
- ARP 请求报文里的"目标 MAC"和"外层帧的目的地址"分别填什么?
- 收到 ARP 广播的其它设备会怎么处理?
- 跨网段通信时,你的电脑 ARP 问的是谁的 MAC?为什么?
- 3.2 说"MAC 头段段更换",本节给出了什么解释?
- ARP 缓存为什么要有寿命?
- ARP 欺骗为什么能成功?它会导致什么后果?
- IPv6 里谁来干 ARP 的活?这跟"IPv6 不能禁 ICMP"有什么关系?
答案:
① 因为 IP 管全程、MAC 管一段,而接口层发货时帧头必须写本段的 MAC;手上的 IP 没法直接变成 MAC,中间缺一个"翻译"环节,这就是 ARP。
② 查缓存 → 没命中就广播问 → 收到应答后记账并发货。第一步之后能不再问,是因为结果被存进了 ARP 缓存,直接查表即可。
③ 因为发起方此刻除了目标 IP 什么都不知道——不知道该投给谁,只能向全网段广播。
④ 请求里"目标 MAC"填全 0(还不知道);外层以太网帧的目的地址填 FF:FF:FF:FF:FF:FF(广播)。
⑤ 看一眼不是找自己就丢弃,不理会、不应答(但也可能顺手把发起方的信息记进自己的表)。
⑥ 问的是默认网关的 MAC。因为 ARP 只在同一网段内工作、路由器不转发 ARP,所以跨网段只能"先把包交给网关"。
⑦ 因为每换一段链路都要重新 ARP 一次——问出那一段该用的 MAC,所以 MAC 头段段更换,而 IP 头全程不变。
⑧ 因为设备的 IP 会变、网卡会换。不老化的话会一直用过期 MAC 发货,直接发不出去。
⑨ 因为 ARP 没有身份验证,"谁答就信谁"。攻击者伪造应答把网关指向自己,就能让全段流量经由他转发——典型中间人攻击。
⑩ 由 ICMPv6 的邻居发现(NDP)承担。正因为地址解析也归它管了,所以 IPv6 下一刀切禁 ICMP 会导致连邻居都认不出来,必须按类型放行(3.15)。
十一、下一步学什么
- ☑ 3.17 根据端口号分配数据到应用程序(端口号、已知端口号) —— ✅ 已完成 → 根据端口号分配数据到应用程序(端口号、已知端口号):本节把包送到了门口(ARP 问出下一跳的 MAC),可数据进了目标电脑之后该交给哪个程序?答案就是它
- ☐ 3.18(按教材顺序) —— 报个标题接着走:按教材脉络,接下来大概率是 DNS 与域名(把名字换成 IP)、IPv6 的地址写法,或 第三章小结。等你报标题。
相关笔记
- 根据端口号分配数据到应用程序(端口号、已知端口号) —— 本节把包送到了目标电脑门口(问出了这一段的 MAC),可数据进了电脑之后该交给哪个程序?下节讲的就是这个"房间号"
- 负责传输数据的网络分层(网络接口层与网际层) —— "IP 头端到端不变、MAC 头段段更换"的出处,本节给出了为什么段段更换的答案(每段都重新 ARP)
- 接收方是1个还是多个(单播、广播、组播) —— ARP 靠的就是"广播问、单播答";广播出不了网段,正是 ARP 只在网段内工作的原因
- 数据是否成功传输给接收方(ICMP) —— 同样装着"关于数据的信息",但 ICMP 装在 IP 包里(协议号 1),ARP 装在帧里;IPv6 下 ARP 被 ICMPv6 的 NDP 取代
- 数据的发送和接收(IP、IP数据包、路由) —— 逐跳接力的本来面目:每一跳都要重新 ARP 问一次下一跳的 MAC
- 通信的对象(IP地址) —— "判断是否同一网段"在这里有了实战用途:决定 ARP 问目标还是问网关
- IP地址范围的分隔符(子网掩码) ——
IP AND 掩码算出来的结果,就是 A 判断"要不要问网关"的依据 - 从私有网络到互联网间的通信(NAT) —— ARP 缓存与 NAT 表项是同类:都会老化,都会因为"放置久了"而失效
- 连接网络的过程(IP地址的设置) —— DHCP 拿到四件套之后、"三次握手"之前,中间那一步正是 ARP 认路;DHCP 也取代了更老的 RARP
- 组成网络(局域网的构建) —— "没有路由器也能组 LAN",因为同网段通信靠 ARP + 交换机就够,不需要网关