Appearance
ICMP 协议
考情分析
ICMP 在 408 中属于中低频考点,主要以选择题出现,考查 ICMP 报文类型的分类、哪些情况不发送 ICMP 差错报文、ping 和 traceroute 分别使用了什么 ICMP 报文等。
考频:★★☆
ICMP 的作用
IP 协议本身是尽最大努力交付,不保证可靠性。数据报在传输过程中可能被丢弃(TTL 耗尽、路由器缓冲区溢出等),但 IP 协议不会通知发送方。
ICMP(Internet Control Message Protocol,互联网控制报文协议)弥补了这个不足,它允许路由器或目的主机向源主机报告传输过程中出现的错误或异常情况。
ICMP 报文封装在 IP 数据报的数据部分中,协议字段值为 1。虽然 ICMP 使用 IP 来传送,但它属于网络层协议。
ICMP 报文类型
ICMP 报文分为两大类:差错报告报文和询问报文。
差错报告报文
| 类型 | 名称 | 说明 |
|---|---|---|
| 3 | 目的不可达 | 路由器或目的主机无法交付数据报(网络不可达、主机不可达、端口不可达等) |
| 4 | 源站抑制 | 通知发送方降低发送速率(已弃用) |
| 11 | 超时 | TTL 减到 0,路由器丢弃数据报并通知源主机 |
| 12 | 参数问题 | IP 首部中某字段的值有误 |
| 5 | 重定向 | 路由器告诉源主机有更好的路由路径 |
其中最常考的是目的不可达和超时。
询问报文
| 类型 | 名称 | 说明 |
|---|---|---|
| 8/0 | 回送请求/回送回答 | 测试目的主机是否可达(ping 使用) |
| 13/14 | 时间戳请求/时间戳回答 | 用于时钟同步和测量传输时延 |
408 考试中主要关注回送请求和回送回答(类型 8 和 0),这是 ping 命令的基础。
不发送 ICMP 差错报文的情况
以下几种情况,不允许发送 ICMP 差错报文:
- 对 ICMP 差错报文不再发送 ICMP 差错报文(避免无限循环)
- 对第一个分片后面的分片不发送(只有第一个分片有完整的上层协议信息)
- 对组播地址不发送
- 对特殊地址(127.0.0.0 或 0.0.0.0)不发送
这个列表在选择题中偶尔直接考。
ping 的工作原理
ping 是最常用的网络诊断工具,基于 ICMP 的回送请求和回送回答报文。
工作过程:
- 源主机发送 ICMP 回送请求报文(类型 8)给目的主机
- 目的主机收到后,回复 ICMP 回送回答报文(类型 0)
- 源主机根据是否收到回答以及往返时间(RTT)来判断网络连通性
ping 工作在网络层,它不使用 TCP 或 UDP。
traceroute 的工作原理
traceroute(Windows 中叫 tracert)用于追踪数据报从源到目的经过的所有路由器。它巧妙地利用了 IP 首部的 TTL 字段和 ICMP 超时报文。
工作过程:
- 发送一个 TTL=1 的数据报,第一个路由器收到后 TTL 减为 0,丢弃数据报并返回 ICMP 超时报文。源主机由此得知第一跳路由器的 IP 地址
- 发送 TTL=2 的数据报,第二个路由器返回超时报文,得知第二跳
- 依次递增 TTL,直到数据报到达目的主机
- 目的主机返回 ICMP 端口不可达报文(因为 traceroute 使用了一个不可能开放的高端口号),源主机由此知道已经到达目的地
TTL=1 → R1 返回超时报文 → 得知第1跳
TTL=2 → R2 返回超时报文 → 得知第2跳
TTL=3 → R3 返回超时报文 → 得知第3跳
TTL=4 → 到达目的主机 → 返回端口不可达 → 结束注意区分:ping 使用的是 ICMP 回送请求/回答,traceroute 使用的是 ICMP 超时报文和端口不可达报文。
ICMP 的协议位置
ICMP 虽然封装在 IP 数据报中(像 TCP/UDP 一样),但它是网络层协议,不是传输层协议。
+-------------------+
| 以太网帧首部 | ← 数据链路层
+-------------------+
| IP 首部 | ← 网络层
| (协议字段=1) |
+-------------------+
| ICMP 报文 | ← 网络层
+-------------------+易错点
1. ICMP 是网络层协议,不是传输层
虽然 ICMP 报文封装在 IP 数据报的数据部分(和 TCP/UDP 报文段的位置一样),但 ICMP 属于网络层。IP 首部中协议字段值为 1 表示 ICMP。
2. ping 不使用 TCP 或 UDP
ping 直接使用 ICMP,不经过传输层。有些同学以为 ping 用的是 UDP,这是错误的。
3. traceroute 利用的是超时报文,不是回送报文
traceroute 靠 TTL 递增来逐跳探测,中间路由器返回的是 ICMP 超时报文(类型 11),最终目的主机返回的是端口不可达报文(类型 3)。
4. 不是所有情况都会发送 ICMP 差错报文
对 ICMP 差错报文本身、组播数据报、特殊地址、非首分片,都不发送 ICMP 差错报文。
高频考点清单
- ICMP 报文分为差错报告报文和询问报文两大类
- 五种差错报告报文:目的不可达、源站抑制、超时、参数问题、重定向
- ping 使用 ICMP 回送请求(类型 8)和回送回答(类型 0)
- traceroute 利用 TTL 递增 + ICMP 超时报文
- 不发送 ICMP 差错报文的四种情况
- ICMP 是网络层协议,封装在 IP 数据报数据部分