ARP与ICMP

← 返回 MOC | ← 主页

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 报文类型:

TypeCode含义触发场景
80Echo Requestping 发出的请求
00Echo Replyping 收到的回复
30~15Destination Unreachable目标不可达(网络/主机/端口不可达等)
110Time ExceededTTL 耗尽,traceroute 用这个
50~3Redirect路由器通知主机有更好的路由

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 不通的两种情况:

  1. 网络真的断了(路由不可达)
  2. 对方防火墙拦截了 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 建连慢(三次握手慢):网络延迟问题

第四步:看服务端处理时间

  • 应用层日志,看请求到达后处理了多久

嵌入式设备排查顺序:

  1. ping 网关(192.168.1.1)→ 确认局域网通
  2. ping DNS 服务器(8.8.8.8)→ 确认能出公网
  3. ping 目标域名对应的 IP → 确认目标可达
  4. 用 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←