IP头(Protocol=1)
└─ ICMP报文
┌──────────┬──────────┬──────────────┐
│ 类型(1B) │ 代码(1B) │ 校验和(2B) │
├──────────┴──────────┴──────────────┤
│ 数据部分 │
└────────────────────────────────────┘
| 类型 | 名称 | 说明 |
|---|---|---|
| 3 | 目的不可达 | 路由器或主机无法交付分组 |
| 11 | 超时 | TTL 减为 0 或重组超时 |
| 12 | 参数问题 | IP 头字段有误 |
| 5 | 改变路由 | 建议使用更优路由 |
| 类型 | 名称 | 说明 |
|---|---|---|
| 8 / 0 | 回送请求 / 回答 | Ping 使用 |
| 13 / 14 | 时间戳请求 / 回答 | 查询时间 |
代码0: 网络不可达(路由表中无匹配网络)
代码1: 主机不可达(网络可达但主机不可达)
代码2: 协议不可达(IP头的协议字段无对应协议)
代码3: 端口不可达(UDP端口无进程监听)
代码4: 需要分片但 DF=1
代码5: 源路由失败
代码0: TTL超时(路由器将TTL减为0)
代码1: 分片重组超时(目的端重组时超时)
1. ICMP差错报文本身出错(防止无限循环)
2. 分片中非第一个分片
3. 多播/广播分组
4. 特殊地址(如127.0.0.0)的分组
原理:发送ICMP回送请求(类型8),接收ICMP回送回答(类型0)
1. 发送方发送 ICMP Echo Request
2. 接收方收到后返回 ICMP Echo Reply
3. 发送方计算往返时间(RTT)
原理:逐步增大 TTL,获取路径上每个路由器的信息
1. 发送 TTL=1 的分组 → 第1个路由器返回 ICMP 超时
2. 发送 TTL=2 的分组 → 第2个路由器返回 ICMP 超时
3. ...直到到达目的主机
最终目的主机返回 ICMP 端口不可达(发送到不存在的UDP端口)
| 考点 | 说明 |
|---|---|
| ICMP 报文类型 | 差错报告和询问报文的分类 |
| ICMP 的应用 | Ping 和 Traceroute 的原理 |
| 不发送 ICMP 的情况 | 防止 ICMP 差错报文的无限循环 |
| ICMP 封装 | 封装在 IP 分组中,$Protocol=1$ |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。