1. 概述
由于IP协议提供的时一种不保证可靠的无连接的数据报交付服务,在一个IP数据报被交付到最终目的地的过程中,难免会遇到各种意外状况,这些意外状况都有可能导致IP数据报无法正常送达目的地址。
IP层缺少这样的辅助检查机制,即主机的管理和查询机制。于是网际报文控制协议(Internet Control Message Protocol, ICMP)应运而生,从网络分层上看,ICMP与IP同属于网络层协议,它的报文也是放到IP数据报中发送的。
2. 报文格式
(8) | 代码 (8) | 校验和 (16) |
首部剩余字节 | ||
数据部 |
图表 1 ICMP报文格式
2.1 类型
该字段表示ICMP报文的具体类型,如下表所示。
ICMP报文总体上可以分为ICMP差错报告报文和ICMP查询报文两类。
差错报告报文主要用来向IP数据报源主机返回差错报告信息,查询报文用于一台主机向另一台主机查询特定的信息,查询报文通常是成对出现的,即目的主机(即差错报告报文的接收方)应当向源主机回复一个应答报文。
ICMP报文种类 | 取值 | 报文功能 |
差错报告报文 | 3 | 目的不可达 |
4 | 源站抑制 | |
5 | 重定向(路由改变) | |
11 | 数据报超时 | |
12 | 数据报参数错误 | |
查询报文 | 8/0 | 回送请求或回答 |
10/9 | 路由器询问或回答 | |
13/14 | 时间戳请求或回答 | |
15/16 | 信息请求或回答 | |
17/18 | 地址掩码请求或回答 |
图表 2 ICMP报文分类
2.2 代码
类型字段表示ICMP报文的类型,代码字段则是在此基础之上进一步描述问题的原因。
3. 各类型报文介绍
3.1 差错报告报文
当协议栈[1]收到任何类型的差错报告报文时,会直接将其所在的数据报(IP数据报)丢弃。
另外,值得注意的是,ICMP差错报文不会对以下情况返回差错报文:
(1)差错回复报文;
(2)分片报文的非第一个分片所在的IP数据报;
(3)多播地址等特殊地址的数据报。
3.2 目的站不可达报文
当路由器不能为数据报找到合适的路由路径,或是主机不能将数据呈递到上层软件时,对应的IP数据报会被丢弃,随后返回一个“目的站不可达差错报告报文”给源主机,“目的不可达”的真实原因需要在ICMP差错报告报文的代码字段中描述,如下所示:
类型:3 (8) | 代码 (8) | 校验和 (16) |
0 | ||
出现问题的IP数据报首部+数据部前8个字节 |
图表 3 目的不可达报文格式
其代码字段的具体取值如下:
代码段取值 | 含义 |
0 | 网络不可达 |
1 | 主机不可达 |
2 | 协议不可达 |
3 | 端口不可达 |
4 | 需要分片但不分片位被置位 |
5 | 源路由失败 |
6 | 目的网络未知 |
7 | 目的主机未知 |
图表 4 目的不可达报文代码段取值
3.3 数据报超时报文
该报文用以防止数据在网络中循环地路由。IP数据报中有一个记录数据报最大路由次数的生存时间(TTL)字段,当该字段地值被减为0,数据报会被丢弃,同时返回数据报超时报文给源主机。
类型:11 (8) | 代码 (8) | 校验和 (16) |
0 | ||
出现问题的IP数据报首部+数据部前8个字节 |
图表 5 数据报超时报文格式
代码段 | 含义 |
0 | TTL超时 |
1 | 分片重装超时 |
图表 6 超时报文代码段取值
3.4 源站抑制报文
IP协议本身没有流量控制机制,同时在数据报的转发过程中各个节点设备也没有稳定的通信关系,因此在各个设备之间建立流量控制机制是不现实的。因而诞生了ICMP源站抑制报文,它的目的是告知源主机发送的数据报速率过快,旨在缓解网路中的信道拥塞状况。
3.5 重定向(改变路由)报文
该报文用来通知源主机及时变更目的地址以提高数据报的发送效率,这样做的一个典型场景是:当一台主机刚启动时,它的所有数据报都发往其所在网络的默认路由器,而默认路由接收到这样的数据后,它就可以发送一个ICMP重定向报文到源主机,通知源主机改变目的地址(其它的路由器),不必在向它发送。
3.6 数据报参数错误报文
顾名思义,当数据报中任何一个字段无法解析时,数据报会被丢弃并返回一个数据报参数错误报文。
4. 查询报文
比较常用的查询报文有 回送请求或回答报文 和 时间戳请求或回答报文,其它三种查询报文,原来用于确定主机在网络环境中的IP地址、地址掩码、路由器状态等信息,而现在DHCP协议完全可以满足这些需求。
类型:8/0 (8) | 代码0 (8) | 校验和 (16) | |
标识符 | 序号 | ||
可选:请求报文发送,回复报文重复 | |||
图表 7 回送请求或回答报文格式
5. ping命令
ping命令用于测试一网络设备是否可达,其本质就是ICMP回送请求或回答报文。
6. ICMP洪水
网络中对于大数据的分片重装存在一定程度的限制,当超过这个限制时,协议栈会直接丢弃这个数据报,如果这个数据报是ICMP数据报,那么源主机将得不到任何回应。
所谓ICMP洪水,就是一台或多台主机源源不断地发送ICMP请求,从而导致网络的带宽被极速消耗,进而导致网络拥塞。
相对应的,处理方法有两种,一是在传输路径上,即在路由器上设置ICMP数据报的贷款限制,这样即使有ICMP攻击,它所占用的带宽也是相当有限的;另一种方法实在传输的末端设置对于ICMP的处理规则。
[1] “协议的堆叠”,即某个应用了多种网络协议的上层软件。