🌐 第三章 网络间的通用语言TCP/IP
📄 一句话概括

前面几节有两套门牌一直并存着(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 的记录?

第二步:广播问一圈

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 收到后做两件事:

  1. 把 192.168.1.20 → bb:bb:bb 记进自己的 ARP 缓存(下次直接查表,不再问)
  2. 正式开始发数据

顺带一个细节: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(单播)
⚠️ 最容易搞混的一点:广播发生在"帧头",不在"IP"

很多人以为 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。

  1. A 一看目标 IP(203.0.113.5)跟自己不在同一网段(用 3.11 的"IP AND 掩码"算一下就知道)
  2. 于是 A 决定:这个包交给默认网关
  3. A 去 ARP 问的,是网关(192.168.1.1)的 MAC
  4. 帧头写网关的 MAC → 发给网关
  5. 网关收到后,拆掉这段帧头,在它的下一段链路里再 ARP 一次,问下一跳的 MAC……
  6. 一段一段接力下去,直到最后一台路由器问到目标设备自己的 MAC
❗ 这句话把 3.2 的旧账结了

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 投毒):

  1. 攻击者在同一网段里广播假应答:"192.168.1.1 的 MAC 是我的"
  2. 网段里所有设备的表都被污染:以为网关是攻击者
  3. 于是所有人的上网流量,全部先经过攻击者的电脑,再由他转发出去
  4. 这就是典型的中间人攻击——可以不改内容地偷看(窃听),也可以篡改
🚨 为什么"公共 Wi-Fi 要小心"这句告诫不是空话

咖啡厅、酒店的开放 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 里。所以:

九、动手 Demo30:把 ARP 抓个现行

  1. 看名册(3.2 看过一次,这回看得懂) arp -a 重点看三列:IP 地址 / 物理地址(MAC)/ 类型(动态 or 静态)。表里应该能看到网关那条。

  2. 看它怎么"长"出新条目(本节最直观的一步) arp -a ping 192.168.1.1 arp -a 如果该条目原本不存在(或已过期),前后对比会多出一行——那一行就是刚才那次广播问答的结果。

  3. 清空后看它重问(要管理员权限的 cmd) arp -d * arp -a ping 192.168.1.1 arp -a 清空后表是空的,ping 一下又回来了——整个过程你什么都没看见,但广播已经在网段里跑了一趟。

  4. 本节最漂亮的一个实验:验证"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 了。

  1. 看静态绑定的写法(可选,要管理员权限) netsh interface ipv4 add neighbors "以太网" 192.168.1.1 c0-xx-xx-xx-xx-xx 执行后再 arp -a,网关那条的"类型"会变成静态——它不会再老化,也不会被 ARP 欺骗改掉。这是家用环境下性价比最高的一条防中间人手段(把网关的 MAC 绑死)。

  2. 30 秒实验:验证 ARP 缓存有寿命 arp -a 记下当前所有条目 → 静置 5~10 分钟什么都不做 → 再跑一遍。

  3. 那些"这期间没再通信过"的条目会消失(老化清理)
  4. 网关那条多半还在(只要你有网络活动,它就一直在用)
  5. 想看得更快:arp -d * 一键清空,效果比等更直接

十、常见误区

  1. ❌ "ARP 报文装在 IP 包里" → 直接装在以太网帧里。ICMP 才装 IP 包里(协议号 1);ARP 是网络接口层的活
  2. ❌ "ARP 请求用的是 192.168.1.255 广播地址" → 广播在帧头(目的 MAC = FF:FF:FF:FF:FF:FF);ARP 报文里的目标 IP 是具体的单播地址
  3. ❌ "跨网段时会问到目标设备的 MAC" → 只问网关。目标 MAC 由路径上最后一跳的路由器去问
  4. ❌ "每发一个包都要 ARP 一次" → 有缓存,命中就直接用,不问(这也是缓存存在的意义)
  5. ❌ "ARP 缓存永久有效" → 有寿命会老化,跟 NAT 表项一个道理(3.14)
  6. ❌ "ARP 是安全的、可靠的" → 无身份验证,谁答就信谁 → ARP 欺骗 / 中间人攻击
  7. ❌ "ARP 能跨网段用" → 跟广播一样被路由器拦下(3.9),ARP 是网段内的协议
  8. ❌ "IPv6 也有 ARP" → 被 ICMPv6 邻居发现 NDP 取代,抓包里看 NS / NA
❓ 自测一下
  1. 为什么需要 ARP?两份门牌之间缺了什么?
  2. ARP 的三步动作分别是什么?为什么第一步之后可以"不再问"?
  3. ARP 请求必须用广播,原因是什么?
  4. ARP 请求报文里的"目标 MAC"和"外层帧的目的地址"分别填什么?
  5. 收到 ARP 广播的其它设备会怎么处理?
  6. 跨网段通信时,你的电脑 ARP 问的是谁的 MAC?为什么?
  7. 3.2 说"MAC 头段段更换",本节给出了什么解释?
  8. ARP 缓存为什么要有寿命?
  9. ARP 欺骗为什么能成功?它会导致什么后果?
  10. 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)。

十一、下一步学什么

相关笔记