一、ICMP概述
Internet控制报文协议(Internet Control Message Protocol)是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息、诊断和排除各种网络故障具有至关重要的作用。使用基于ICMP的应用时,需要对ICMP的工作原理非常熟悉。
ICMP是TCP/IP协议簇的核心协议之一,它用于在IP网络设备之间发送控制报文,传递差错,控制,查询等信息
Ping不通的原因有很多种:
- 可能数据包就没有发送出去
- 可能去往目的的中途给丢了
- 接收方给丢了
- 接收方不回复
- 接收方回复了但中途丢了
1.1 ICMP重定向
- 当主机和网关和另一网络在同一总线上时,主机去往其它网段的时候,都要把数据交给自己的网关,让网关来转发数据,但是当网关收到这股流量时,发现这个网段在其内网中,所以向主机发送一个ICMP的重定向报文,让主机直接发送流量到10.0.0.200这台路由器,然后主机收到这个重定向报文以后,以后所有去往这个网段的流量都会直接发送给10.0.0.200这台路由器。
1.2 ICMP差错检测
- ICMP Echo Request和ICMP Echo Reply分别用来查询和响应某些消息,进行差错控制。
- ICMP Echo消息常用于诊断源和目的之间的网络连通信,还可以提供其它信息,如报文往返时间等。
1.3 ICMP错误报告
- 当网络设备无法访问目标时,会自动发送ICMP目的不可达报文到发送端设备。
- ICMP定义了各种错误信息,用于诊断网络连接性问题,根据这些错误信息,源设备可以判断数据传输错误的原因。比如,如果网络中发生了环路,导致报文在网络中循环,最终TTL超时,这种情况下网络设备会发送TTL超时报文给发送端设备,又比如如果目的不可达,则中间的网络设备会发送目的不可达信息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达信息,如果网络设备无法找到网络中的目的主机,则发送目的主机不可达信息。
1.4 ICMP数据包格式
- Type是ICMP报文类型,Code是编码,Checksum是校验和。
ICMP消息封装在IP报文中。ICMP消息的格式取决于Type和Code字段,其中Type字段为消息类型,Code字段包含该消息类型的具体参数。后面的校验和字段用于检查信息是否完整。消息中包含32比特的可变参数,这个字段一般不使用,通常设置为0。在ICMP Redirect消息中,这个字段用来指定网关IP地址,主机根据这个地址将报文重定向到指定网关。在Echo请求消息中,这个字段包含标识符和序号,源端根据这两个参数将收到的回复消息与本端发送的Echo请求消息进行关联。尤其是当源端向目的端发送了多个Echo请求消息时,需要根据标识符和序号将Echo请求和回复进行一一对应。
1.5 ICMP消息类型和编码类型
类型 | 编码 | 描述 |
---|---|---|
0 | 0 | Echo Reply |
3 | 目的地不可达 | |
0 | 网络不可达 | |
1 | 主机不可达 | |
2 | 协议不可达 | |
3 | 端口不可达 | |
4 | 需要分段和不需要分段标记置位 | |
5 | 源路由失败 | |
6 | 目的网络未知 | |
7 | 目的主机未知 | |
8 | 源主机被隔离 | |
9 | 与目的网络的通信被禁止 | |
10 | 目的主机的通信被禁止 | |
11 | 对请求的服务类型,目的网络不可达 | |
12 | 对请求的服务类型,目的主机不可达 | |
4 | 0 | 源抑制(source quench) |
5 | 重定向 | |
0 | 为网络(子网)重定向数据报 | |
1 | 为主机重定向数据报 | |
2 | 为网络和服务类型重定向数据报 | |
3 | 为主机和服务类型重定向数据报 | |
6 | 0 | 选择主机地址 |
8 | 0 | Echo Request |
9 | 0 | 路由器通告 |
10 | 0 | 路由器选择 |
11 | 超时 | |
0 | 传输中超过TTL | |
1 | 超出分段重组时间 | |
12 | 参数问题 | |
0 | 指定错误的指针 | |
1 | 缺少需要的选项 | |
2 | 错误长度 | |
13 | 0 | 时间戳 |
14 | 0 | 时间戳回复 |
15 | 0 | 信息请求(废弃) |
16 | 0 | 信息回复(废弃) |
17 | 0 | 地址掩码请求(即将废弃) |
18 | 0 | 地址掩码回复(即将废弃) |
30 | - | 路由追踪 |
ICMP定义了多种消息类型,用于不同的场景。有些消息不需要Code字段来描述具体类型参数,仅用Type字段表示消息类型。比如,ICMP Echo回复消息的Type字段设置为0。
有些ICMP消息使用Type字段定义消息大类,用Code字段表示消息的具体类型。比如类型为3的消息表示目的不可达,不同的Code值表示不可达的原因,包括目的网络不可达(Code=0)、目标主机不可达(Code=1)、协议不可达(Code=2)、目的TCP/UDP端口不可达(Code=3)等。
1.6 ICMP应用
ICMP的一个典型应用是Ping。Ping是检测网络连通信的常用工具,同时也能够收集其它相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数,等待回复响应的超时信息等,设备根据配置的参数来构造并发送ICMP报文,进行Ping测试。
ICMP的另一个典型应用是Tracert。Tracert基于报文头中的TTL值来逐跳跟踪报文的转发路径。为了跟踪到达某特定目的地址的路径,源端首先将报文的TTL值设置为1。该报文到达第一个节点后,TTL超时,于是该节点向源端发送TTL超时信息,信息中携带时间戳。然后源端将报文的TTL值设置为2,报文到达第二个节点后超时,该节点同样返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。Tracert是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。
Tracert常用的配置参数说明如下:
- -a source-ip-address指定Tracert报文的源地址
- -f first-ttl指定初始TTL。缺省值是1
- -m max-ttl指定最大TTL,缺省值是30
- -name使能显示每一跳的主机名
- -p port指定目的主机的UDP端口号
源端(RTA)向目的端(主机B)发送一个UDP报文,TTL值为1,目的UDP端口号是大于30000一个数,因为在大多数情况下,大于30000的UDP端口号是任何一个应用程序都不可能使用的端口号。
第一跳(RTB)收到源端发出的UDP报文后,判断出报文的目的IP地址不是本机IP地址,将TTL值减1后,判断出TTL值等于0,则丢弃报文并向源端发送一个ICMP超时(Time Exceeded)报文(该报文中含有第一跳的IP地址10.0.0.2),这样源端就得到了RTB的地址。
源端收到RTB的ICMP超时报文后,再次向目的端发送一个UDP报文,TTL值为2.
第二跳(RTC)收到源端发出的UDP报文后,回应一个ICMP超时报文,这样源端就得到了RTC的地址。
以上过程不断进行,直到目的端收到源端发送的UDP报文后,判断出目的IP地址是本机IP地址,则处理此报文。根据报文中的目的UDP端口号寻找占用此端口号的上层协议,因目的端没有应用程序使用该UDP端口号,则向源端返回一个ICMP端口不可达(Destination Unreachable)报文。
源端收到ICMP端口不可达报文后,判断出UDP报文已经到达目的端,则停止Tracert程序,从而得到数据报文从源端到目的端所经历的路径(10.0.0.2、20.0.0.2、30.0.0.2)。
华为、Cisco的网络设备采用这种方式,发送的不是ICMP报文,是UDP报文,正常每一跳会回复TTL超时,最后一跳回复端口不可达。