ICMP报文
ICMP报文封装在IP数据报中,ICMP报文可分为两大类:差错报告报文和查询报文。
ICMP报文首部的一般格式如图1.11所示。
图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所示。
图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(主机不可达)。
图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所示。
图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所示。
图1.15 ICMP源点抑制报文的首部格式
3.超时报文
超时报文的产生有两种情况。
? 中间路由器收到数据报后发现其TTL字段的值为1或0。
? 目的主机在规定时间内没有收到所有的分片。
当发生以上情况时,中间路由器或目的主机就丢弃这个数据报,然后向发出这个数据报的源点发送超时报文。
超时报文的首部格式如图1.16所示。
图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所示。
图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所示。
图1.18 ICMP超时报文演示(2)
可以看到,源IP:192.168.1.1(Web主机)向目的IP:192.168.2.1(PC2主机)返回了超时报文,类型(Type)为11,代码(Code)为1。
意 啦 | 这里讲的超时报文要与使用ping命令时产生的超时区分开来。例如,Windows 2003的ping命令在发出Echo请求后,如果在2秒(默认)内没有收到Echo应答,就会显示超时(Request timed out)。 |