ICMP报文

ICMP报文封装在IP数据报中,ICMP报文可分为两大类:差错报告报文和查询报文。

ICMP报文首部的一般格式如图1.11所示。

ICMP报文_blank

图1.11 ICMP报文首部的一般格式

1.2.1 查询报文

查询报文有多种类型,比较常见的是类型(Type)8和类型(Type)0,它们是成对出现的。类型8表示回送请求(Echo),类型0表示回送应答(Echo Reply)。在《组建与维护企业网络》课程中已经介绍过,这里不再赘述。

1.2.2 差错报告报文

ICMP的主要责任之一就是报告差错,当路由器或目的主机在处理IP数据报遇到问题时,就把差错报文发送给数据报的源点。

差错报告报文共有五种类型。

? 类型3 终点不可达

? 类型4 源点抑制

? 类型5 改变路由

? 类型11 超时

? 类型12 参数问题

本节将介绍三种类型:终点不可达、源点抑制和超时报文类型。

1.终点不可达报文

当中间路由器不能给数据报找到路由或目的主机不能交付数据报时,中间路由器或目的主机就丢弃这个数据报,然后向发出这个数据报的源点发送终点不可达报文。

终点不可达报文的首部格式如图1.12所示。

ICMP报文_style_02

图1.12 ICMP终点不可达报文的首部格式

其中代码字段指明了丢弃数据报的原因,一共有16种。下面将列举并演示其中的两种原因。

? 代码1:Host unreachable(主机不可达)。

? 代码3:Port unreachable(端口不可达)。

首先演示第1种原因,思路为:在Web主机上ping一台未知网络中的主机,然后通过Sniffer抓包分析返回的ICMP报文。

在Web主机上启用Sniffer抓包,然后ping 1.1.1.1,在CMD窗口中运行的命令及结果为:

C:\> ping 1.1.1.1

Reply from 192.168.1.254: Destination host unreachable.

……

这是路由器返回的差错报告:目的主机不可达,因为路由器找不到1.1.1.1的路由。

Sniffer抓包后的解码如图1.13所示。

可以看到,源IP:192.168.1.254(路由器)向目的IP:192.168.1.1(Web主机)返回了差错报告报文,类型(Type)为3,代码(Code)为1:Host unreachable(主机不可达)。

ICMP报文_blank_03

图1.13 ICMP终点不可达报文演示(1)

接着演示第2种原因,思路为:在PC2主机上使用hping向Web主机的一个未开放的UDP端口发送1个UDP报文。因为该UDP端口未开放,那么Web主机将不能交付该UDP报文,就会返回ICMP差错报告报文,可以在Web主机上通过Sniffer抓包分析返回的ICMP报文。

首先在Web主机上启用Sniffer抓包,然后在PC2主机上使用hping向Web主机的UDP端口80(未开放)发送一个UDP报文,命令为:

[root@kkg sbin]# hping 192.168.1.1 -2 -p 80 -c 1

在Web主机上Sniffer抓包后的解码如图1.14所示。

ICMP报文_target_04

图1.14 ICMP终点不可达报文演示(2)

可以看到,源IP:192.168.1.1(Web主机)向目的IP:192.168.2.1(PC2主机)返回了差错报告报文,类型(Type)为3,代码(Code)为3:Port unreachable(端口不可达)。

2.源点抑制报文

在IP协议中没有流量控制机制,这可能会导致在中间路由器或目的主机中产生拥塞现象。路由器或主机中的队列长度(缓存)是有限的,如果数据报的接收速率比它们被转发(对路由器而言)或处理(对主机而言)的速率快得多,队列就会溢出。在这种情况下,路由器或主机只能把某些数据报丢弃。

为了给IP协议增加一种流量控制机制,ICMP的源点抑制报文被设计出来。当路由器或主机因为拥塞而丢弃数据报时,它就向数据报的发送端发送源点抑制报文,通知发送端必须放慢发送速率。要注意的是,对每一个因为拥塞而丢弃的数据报,路由器或主机都应当发送源点抑制报文。

源点抑制报文的首部格式如图1.15所示。

ICMP报文_target_05

图1.15 ICMP源点抑制报文的首部格式

3.超时报文

超时报文的产生有两种情况。

? 中间路由器收到数据报后发现其TTL字段的值为1或0。

? 目的主机在规定时间内没有收到所有的分片。

当发生以上情况时,中间路由器或目的主机就丢弃这个数据报,然后向发出这个数据报的源点发送超时报文。

超时报文的首部格式如图1.16所示。

ICMP报文_style_06

图1.16 ICMP超时报文的首部格式

其中代码0只由路由器使用,代码1只由目的主机使用。

下面将演示超时报文产生的两种情况。

先演示第一种情况,思路为:在PC2主机上使用hping向Web主机发送一个TTL为1的ICMP报文,并伪造源IP为192.168.0.1(PC1主机),这样在PC1主机上通过Sniffer可以捕获到返回的超时报文。

首先在PC1主机上启用Sniffer抓包,然后在PC2主机上使用hping向Web主机发送1个TTL为1的ICMP报文,并伪造源IP为192.168.0.1,命令为:

[root@kkg sbin]# hping 192.168.1.1 -1 -t 1 -c 1 –a 192.168.0.1

在PC1主机上Sniffer抓包后的解码如图1.17所示。

ICMP报文_target_07

图1.17 ICMP超时报文演示(1)

可以看到,源IP:192.168.2.254(路由器)向目的IP:192.168.0.1(PC1主机)返回了超时报文,类型(Type)为11,代码(Code)为0。

接着演示第2种情况,思路为:在PC2主机上使用hping向Web主机只发送一个IP分片,经过一小段时间后,由于没有收到后续的分片,Web主机将返回超时报文。

首先在Web主机上启用Sniffer抓包,然后在PC2主机上使用hping向Web主机发送一个IP分片,命令为:

[root@kkg sbin]# hping 192.168.1.1 -1 -x -d 1000 -N 100 -c 1

等待60秒后,在Web主机上Sniffer抓包后的解码如图1.18所示。

ICMP报文_target_08

图1.18 ICMP超时报文演示(2)

可以看到,源IP:192.168.1.1(Web主机)向目的IP:192.168.2.1(PC2主机)返回了超时报文,类型(Type)为11,代码(Code)为1。

 
  ICMP报文_style_09

ICMP报文_style_10ICMP报文_style_11

意 啦

这里讲的超时报文要与使用ping命令时产生的超时区分开来。例如,Windows 2003的ping命令在发出Echo请求后,如果在2秒(默认)内没有收到Echo应答,就会显示超时(Request timed out)。