一、ICMP概述

Internet控制报文协议(Internet Control Message Protocol)是网络层的一个重要协议。ICMP协议用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息、诊断和排除各种网络故障具有至关重要的作用。使用基于ICMP的应用时,需要对ICMP的工作原理非常熟悉。

2.jpg
ICMP是TCP/IP协议簇的核心协议之一,它用于在IP网络设备之间发送控制报文,传递差错,控制,查询等信息
Ping不通的原因有很多种:

  1. 可能数据包就没有发送出去
  2. 可能去往目的的中途给丢了
  3. 接收方给丢了
  4. 接收方不回复
  5. 接收方回复了但中途丢了

1.1 ICMP重定向

3.jpg

  • 当主机和网关和另一网络在同一总线上时,主机去往其它网段的时候,都要把数据交给自己的网关,让网关来转发数据,但是当网关收到这股流量时,发现这个网段在其内网中,所以向主机发送一个ICMP的重定向报文,让主机直接发送流量到10.0.0.200这台路由器,然后主机收到这个重定向报文以后,以后所有去往这个网段的流量都会直接发送给10.0.0.200这台路由器。

1.2 ICMP差错检测

image.png

  • ICMP Echo Request和ICMP Echo Reply分别用来查询和响应某些消息,进行差错控制。
  • ICMP Echo消息常用于诊断源和目的之间的网络连通信,还可以提供其它信息,如报文往返时间等。

1.3 ICMP错误报告

image.png

  • 当网络设备无法访问目标时,会自动发送ICMP目的不可达报文到发送端设备。
  • ICMP定义了各种错误信息,用于诊断网络连接性问题,根据这些错误信息,源设备可以判断数据传输错误的原因。比如,如果网络中发生了环路,导致报文在网络中循环,最终TTL超时,这种情况下网络设备会发送TTL超时报文给发送端设备,又比如如果目的不可达,则中间的网络设备会发送目的不可达信息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达信息,如果网络设备无法找到网络中的目的主机,则发送目的主机不可达信息。

1.4 ICMP数据包格式

image.png

  • 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应用

image.png
ICMP的一个典型应用是Ping。Ping是检测网络连通信的常用工具,同时也能够收集其它相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数,等待回复响应的超时信息等,设备根据配置的参数来构造并发送ICMP报文,进行Ping测试。

image.png
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端口号

image.png
源端(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超时,最后一跳回复端口不可达。