之前问过很多人(包括一些速成的CCIE)ICMP是什么?
得到的答复基本都是:ICMP不就是ping包吗!嗯,不能说错,只能说很不完全。
ICMP的全称是Internet控制报文协议(Internet Control Message Protocol),既然说到了控制,我们就要明白它到底控制了些什么东西,咱们来看看下面这张图:

这就是ICMP能控制的东西,分成了很多类(type),而一些大类又包含了很多小的分类,这里我们使用不同的代码(code)进行区分,这也就是为什么ICMP数据包头会包含类型和代码两个字段的原因了。
通过对这些类型和代码进行分析,我们大体上可以看出ICMP的功能,其实主要还是两大类:请求和应答。
其中请求又可以细分为:简单的回显请求(ping)、时间戳请求(NTP的基础)、地址掩码请求(BOOTP)等应用,主要是为了满足不同的高层协议需求。
而应答就要丰富得多了,除了简单的回显应答外,仅针对目标不可达这一现象就存在十多种可能的原因(类型3中的代码0到代码15),除此之外,针对时间戳、地址掩码等也都有其特定的应答。这些应答信息会被高层协议(TCP、UDP或者一些特殊的用户进程)获取,并进行下一步的操作,这就是所谓的控制,也就是ICMP的灵魂。
这里还要注意一点,就是上图中的最后两列,分别是查询(Query)和差错(Error),其作用针对不同的处理方式对ICMP报文进行分类,Query报文只是简单的查询,不会做过多的后续处理;而Error报文则需要进行特殊处理,而且对一份差错报文响应时,永远不会生成另一份差错报文,否则会造成死循环。
好了,针对ICMP的细节就说这么多,如果大家想了解再多的内容,可以查看相关的RFC文档(RFC792),也可以查看TCP/IP详解的内容。接下来我们还是通过实验来感受一下ICMP,实验拓扑如下:

R1: f1/0:10.1.1.1/24
R2: f1/0:10.1.1.2/24
DHCPSERVER: f1/0:10.1.1.3/24
CLIENT: f1/0:DHCP
DHCPSERVER和CLIENT也都是路由器,我是为了好看换了个图标,呵呵。
第一步,先看一下最简单的ICMP报文——ping,只需要R1和R2两台设备,配置好IP,在R1的f1/0上用wireshark抓包,当我们在R1上成功的ping通R2后,可以看到以下捕获的数据包:

这是这个典型的Echo请求数据包,我们可以看到它的ICMP类型是8(代表Echo(ping)request),代码是0。

这是一个典型的Echo回应数据包,其ICMP类型是0(代表Echo(ping)reply),代码也是0。
以上只是最典型的ICMP报文,除此之外,我们也会在一些特殊的环境下遇到一些特殊类型的ICMP报文,比如之前我们在介绍TTL的时候,曾经遇到过ICMP类型为11和3的报文等。
下面我们要验证的是两种比较特殊的ICMP报文:类型9的路由器通告和类型10的路由器选择,它们主要用于ICMP路由发现协议(IRDP),卷一上只是说这是一种用于发现本地路由器的协议,让人觉得云里雾里的,呵呵,其实IRDP是一种







发表评论 评论 (2 个评论)
差错和控制