ARP与ICMP
ping 一下通不通,traceroute 看哪里慢——这两个命令背后是 ICMP;而数据包真正发出去之前,还要靠 ARP 找到对方的 MAC 地址。
ARP:IP 地址到 MAC 地址的翻译
**为什么需要 ARP:**IP 是网络层的逻辑地址,数据链路层(以太网)只认 MAC 地址。你知道目标的 IP,但不知道它的 MAC,数据帧就没法封装,发不出去。
工作流程:
你的手机(192.168.1.5)想发数据给路由器(192.168.1.1)
1. 查本地 ARP 缓存(arp -a 可以看)
→ 有记录:直接用缓存的 MAC,不用广播
→ 没有记录:发 ARP 广播
2. ARP 广播(目的 MAC:FF:FF:FF:FF:FF:FF)
"谁是 192.168.1.1?告诉我你的 MAC"
局域网内所有设备都收到这个广播
3. 路由器(192.168.1.1)单播回复
"我是 192.168.1.1,我的 MAC 是 AA:BB:CC:DD:EE:FF"
只有目标设备回复,用单播(不广播)
4. 手机缓存这条 ARP 记录(有 TTL,一般几分钟)
之后发给路由器的包直接用这个 MAC
为什么请求广播、回复单播:请求时不知道对方 MAC,只能广播;回复时已经知道请求方的 MAC(请求包里带着),直接单播就行,没必要广播给所有人。
跨网段的情况:目标 IP 不在同一子网,ARP 请求发给默认网关(路由器),路由器回自己的 MAC。数据包先发到路由器,再由路由器转发出去。
ARP 欺骗:攻击者伪造 ARP 回复,把”192.168.1.1 的 MAC 是我的 MAC”广播出去,局域网内其他设备更新 ARP 缓存后,发给网关的流量就全走到攻击者机器上了——这是中间人攻击的基础。
**免费 ARP(Gratuitous ARP):**设备上电后主动广播”我是 192.168.1.5,我的 MAC 是 XX:XX:XX:XX:XX:XX”,不是在问谁,而是在宣告自己的存在,同时检测 IP 冲突(如果有人回复,说明这个 IP 已经被占用了)。嵌入式设备上电后通常会发免费 ARP。
ICMP:网络层的”快递回执”
为什么需要 ICMP:IP 协议本身是”尽力而为”的,路由器丢包了不会通知任何人。ICMP(互联网控制报文协议)是 IP 的补充,负责传递差错报告和诊断信息。
常用 ICMP 报文类型:
| Type | Code | 含义 | 触发场景 |
|---|---|---|---|
| 8 | 0 | Echo Request | ping 发出的请求 |
| 0 | 0 | Echo Reply | ping 收到的回复 |
| 3 | 0~15 | Destination Unreachable | 目标不可达(网络/主机/端口不可达等) |
| 11 | 0 | Time Exceeded | TTL 耗尽,traceroute 用这个 |
| 5 | 0~3 | Redirect | 路由器通知主机有更好的路由 |
ping 的工作原理
ping 发送 ICMP Echo Request,目标收到后回 ICMP Echo Reply。
TTL(Time To Live)字段:每经过一个路由器减 1,减到 0 时路由器丢弃数据包并回一个 ICMP Type 11(Time Exceeded)。防止数据包在网络里无限循环。
ping 输出解读:
$ ping 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=12.3 ms
ttl=118:数据包到达时剩余 TTL,初始值通常是 64(Linux)或 128(Windows),118 说明经过了约 10 跳time=12.3 ms:往返时延(RTT)
ping 不通的两种情况:
- 网络真的断了(路由不可达)
- 对方防火墙拦截了 ICMP 包(网络通但 ping 不通)
区分方法:用 traceroute 看能走到哪一跳,或者用 TCP 端口测试(如 telnet 目标IP 80)。
traceroute 的工作原理
traceroute 利用 TTL 字段,逐跳暴露路径上每个路由器的 IP。
原理:
第 1 个包:TTL=1
→ 第一跳路由器收到,TTL 减到 0,丢弃,回 ICMP Time Exceeded
→ 暴露第一跳路由器的 IP
第 2 个包:TTL=2
→ 第一跳路由器转发,TTL 减到 1
→ 第二跳路由器收到,TTL 减到 0,丢弃,回 ICMP Time Exceeded
→ 暴露第二跳路由器的 IP
……以此类推,直到到达目标
每跳发 3 个包,测量 RTT,输出格式:
$ traceroute 8.8.8.8
1 192.168.1.1 (192.168.1.1) 1.2 ms 1.1 ms 1.0 ms ← 家用路由器
2 10.x.x.x 8.3 ms 8.1 ms 8.2 ms ← 运营商接入层
3 * * * ← 这跳不回 ICMP(防火墙)
4 8.8.8.8 12.3 ms 12.1 ms 12.2 ms ← 目标
* * * 表示这一跳的路由器不回 ICMP Time Exceeded(被防火墙过滤了),但不代表网络断了,后面的跳可能还是通的。
网络请求慢的排查思路
第一步:ping 目标 IP
- 不通:网络层有问题,先排查路由
- 通但 RTT 高:网络延迟大,继续用 traceroute 定位
第二步:traceroute,定位哪一跳延迟高
- 某一跳突然延迟飙升:那一跳或之后的链路有问题
- 某一跳
* * *:正常,继续看后面
第三步:区分 DNS 慢还是 TCP 建连慢
curl -v https://目标可以看各阶段耗时- DNS 解析慢:换 DNS 服务器或本地缓存
- TCP 建连慢(三次握手慢):网络延迟问题
第四步:看服务端处理时间
- 应用层日志,看请求到达后处理了多久
嵌入式设备排查顺序:
- ping 网关(192.168.1.1)→ 确认局域网通
- ping DNS 服务器(8.8.8.8)→ 确认能出公网
- ping 目标域名对应的 IP → 确认目标可达
- 用 tcpdump 抓包,看实际发出去的包是什么
笔试题直击
Q:ARP 请求为什么用广播,回复为什么用单播?
请求时不知道目标 MAC,只能广播让所有人都收到;回复时请求包里已经包含了请求方的 MAC 地址,直接单播回去就行,不需要打扰局域网内其他设备。
Q:traceroute 的原理是什么?
利用 IP 首部的 TTL 字段。第一个包 TTL=1,第一跳路由器 TTL 减到 0 后丢弃并回 ICMP Time Exceeded,暴露自己的 IP。第二个包 TTL=2,第二跳路由器暴露……以此类推,逐跳探测路径。
Q:网络请求处理慢,可以从哪些地方排查?
按层排查:ping 确认网络层可达 → traceroute 定位延迟跳 → 区分 DNS/TCP 建连/应用处理时间 → 查服务端日志。
如果你正在跟随梳理, 返回 MOC←