第6章 ICMP:网际控制报文协议
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍ICMP协议,包括ICMP的作用、报文类型、查询报文和差错报文等。
6.1 引言
ICMP的作用
ICMP(Internet Control Message Protocol):
- 网际控制报文协议
- IP层的辅助协议
- 传递网络层的控制信息
- 报告错误和异常
- 查询网络状态
ICMP是IP的辅助协议。
为什么需要ICMP
为什么需要ICMP:
- IP是不可靠的
- 丢了不知道为什么
- 需要有人报告错误
- 需要有人传递控制信息
ICMP的用途:
- 报告不可达
- 报告超时
- 重定向
- 测试连通性(ping)
- 测试路径(traceroute)
- 等等
ICMP传递控制和错误信息。
ICMP和IP的关系
ICMP和IP的关系:
- ICMP封装在IP数据报里
- IP首部的协议字段是1
- ICMP是IP的上层,但也是网络层的
- 辅助IP工作
+--------+---------+
| IP首部 | ICMP报文 |
+--------+---------+
ICMP封装在IP里。
本章讨论的内容
本章讨论的内容:
- ICMP报文类型
- ICMP查询报文
- ICMP差错报文
- ICMP的规则
- 常见的ICMP类型
本章介绍ICMP协议。
6.2 ICMP报文类型
ICMP报文分类
ICMP报文分为两大类:
-
查询报文(Query)
- 请求-应答模式
- 用来查询信息
- 比如ping、时间戳等
-
差错报文(Error)
- 报告错误
- 比如不可达、超时等
- 不产生应答
两大类:查询和差错。
常见的ICMP类型
常见的ICMP类型:
| 类型 | 代码 | 名称 | 类别 |
|---|---|---|---|
| 0 | 0 | 回显应答(Echo Reply) | 查询 |
| 3 | 0-15 | 目的不可达(Destination Unreachable) | 差错 |
| 4 | 0 | 源抑制(Source Quench) | 差错 |
| 5 | 0-3 | 重定向(Redirect) | 差错 |
| 8 | 0 | 回显请求(Echo Request) | 查询 |
| 9 | 0 | 路由器通告(Router Advertisement) | 查询 |
| 10 | 0 | 路由器请求(Router Solicitation) | 查询 |
| 11 | 0-1 | 超时(Time Exceeded) | 差错 |
| 12 | 0-1 | 参数问题(Parameter Problem) | 差错 |
| 13 | 0 | 时间戳请求(Timestamp Request) | 查询 |
| 14 | 0 | 时间戳应答(Timestamp Reply) | 查询 |
| 15 | 0 | 信息请求(Information Request) | 查询 |
| 16 | 0 | 信息应答(Information Reply) | 查询 |
| 17 | 0 | 地址掩码请求(Address Mask Request) | 查询 |
| 18 | 0 | 地址掩码应答(Address Mask Reply) | 查询 |
有很多种ICMP类型。
ICMP报文格式
ICMP报文的通用格式:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 类型 | 代码 | 检验和 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 内容 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
通用字段:
- 类型:8位,ICMP类型
- 代码:8位,进一步细分
- 检验和:16位,ICMP报文的校验和
- 内容:可变,不同类型不同内容
ICMP有通用的首部格式。
6.3 ICMP查询报文
回显请求和应答
回显请求(Echo Request)和回显应答(Echo Reply):
- 类型8:请求
- 类型0:应答
- 就是ping用的
- 测试连通性
工作方式:
- 发请求,收应答
- 能收到说明通
- 收不到说明不通
ping用的就是回显请求/应答。
时间戳请求和应答
时间戳请求和应答:
- 类型13:请求
- 类型14:应答
- 查询对方的时间
- 可以用来同步时间
- 也可以测RTT
三个时间戳:
- 发起时间戳:请求发送的时间
- 接收时间戳:收到请求的时间
- 传送时间戳:发送应答的时间
时间戳可以查询时间和测RTT。
地址掩码请求和应答
地址掩码请求和应答:
- 类型17:请求
- 类型18:应答
- 查询子网掩码
- 启动时用
- 现在一般不用了,用DHCP
地址掩码查询子网掩码。
路由器请求和通告
路由器请求和通告:
- 类型10:请求
- 类型9:通告
- 发现默认网关
- 主机启动时发请求
- 路由器定期发通告
路由器发现用的。
6.4 ICMP差错报文
目的不可达
目的不可达(Destination Unreachable):
- 类型3
- 各种原因的不可达
常见代码:
| 代码 | 含义 |
|---|---|
| 0 | 网络不可达 |
| 1 | 主机不可达 |
| 2 | 协议不可达 |
| 3 | 端口不可达 |
| 4 | 需要分片但设置了DF位 |
| 5 | 源路由失败 |
| 6 | 目的网络未知 |
| 7 | 目的主机未知 |
| … | 还有很多 |
目的不可达有很多种。
超时
超时(Time Exceeded):
- 类型11
- TTL到0了
- 或者分片重装超时
代码:
- 0:传输中TTL超时
- 1:分片重装超时
用途:
- traceroute用的就是TTL超时
- 发TTL=1的,超时就返回ICMP
- 然后TTL=2,以此类推
超时报告TTL到0了。
源抑制
源抑制(Source Quench):
- 类型4
- 告诉发送方放慢点
- 拥塞控制
- 现在基本不用了
- TCP自己有拥塞控制
源抑制用于拥塞控制,现在很少用。
重定向
重定向(Redirect):
- 类型5
- 告诉主机有更好的路由
- 主机发错了路由器
- 路由器转发,同时发重定向
- 主机更新路由表
代码:
- 0:对网络重定向
- 1:对主机重定向
- 2:对服务类型和网络重定向
- 3:对服务类型和主机重定向
重定向告诉主机更好的路由。
参数问题
参数问题(Parameter Problem):
- 类型12
- IP首部有问题
- 参数错误
- 比较少见
参数问题报告首部错误。
6.5 ICMP的规则
差错报文的规则
ICMP差错报文的规则:
-
不对ICMP差错报文产生ICMP差错报文
- 防止无限循环
- ICMP错误不会再产生错误
-
不对广播/多播产生差错报文
- 防止广播风暴
- 一个广播出错,所有人都回ICMP
- 网络就炸了
-
不对源地址不是单播的产生差错报文
- 源地址是0、广播、多播等
- 不回差错报文
这些规则防止ICMP风暴。
差错报文包含的内容
ICMP差错报文包含:
- 出错的IP首部
- IP首部后面的前8个字节
- (也就是传输层首部的前8字节,包含端口号)
为什么要包含:
- 让发送方知道是哪个数据报出错了
- 知道是哪个进程的
- 可以根据端口号找到进程
差错报文包含原始数据报的一部分。
6.6 ICMP的应用
Ping
Ping:
- 用ICMP回显请求/应答
- 测试连通性
- 测试RTT
- 最常用的网络工具
ping是最常用的ICMP应用。
Traceroute
Traceroute:
- 用ICMP超时报文
- 也可以用UDP
- 追踪路径
- 看经过哪些路由器
traceroute也是ICMP的重要应用。
路径MTU发现
路径MTU发现:
- 用ICMP不可达(需要分片)
- 发送DF位为1的分组
- MTU不够就回ICMP
- 然后减小MTU重试
路径MTU发现也用ICMP。
6.7 小结
ICMP概述
-
作用
- 网际控制报文协议
- 传递控制和错误信息
- IP的辅助协议
-
和IP的关系
- 封装在IP里
- 协议号1
- 网络层协议
ICMP报文类型
-
两大类
- 查询报文:请求-应答
- 差错报文:报告错误
-
常见类型
- 回显请求/应答(ping)
- 目的不可达
- 超时(traceroute)
- 重定向
- 时间戳
- 地址掩码
- 等等
查询报文
-
回显请求/应答
- ping用的
- 测试连通性
-
时间戳请求/应答
- 查询时间
- 测RTT
-
地址掩码请求/应答
- 查询子网掩码
- 现在少用
-
路由器请求/通告
- 发现网关
差错报文
-
目的不可达
- 网络/主机/端口不可达
- 需要分片
- 等等
-
超时
- TTL到0
- traceroute用
-
源抑制
- 拥塞控制
- 现在少用
-
重定向
- 更好的路由
- 更新路由表
-
参数问题
- 首部错误
ICMP的规则
-
防止循环
- 不对ICMP差错产生差错
-
防止广播风暴
- 不对广播/多播产生差错
- 不对非单播源产生差错
-
差错报文内容
- 包含原始IP首部
- 包含前8字节数据
ICMP的应用
-
Ping
- 回显请求/应答
- 测试连通性
-
Traceroute
- 超时报文
- 追踪路径
-
路径MTU发现
- 需要分片的不可达
- 发现MTU
关键概念
-
ICMP
- 网际控制报文协议
- IP的辅助
-
两大类
- 查询报文
- 差错报文
-
常见类型
- 回显、不可达、超时、重定向
-
规则
- 防止循环和风暴
-
应用
- ping、traceroute、PMTUD