ICMP协议是什么?ICMP协议的作用是什么?

Table of Contents

1、ICMP的定义

全称Internet Control Message Protocol,就是互联网控制报文协议。

这里的关键词是”控制“,下面我将介绍它是如何控制的

2、ICMP的由来

由于复杂的网络环境,数据包在网络中传输常常会发生各种问题。当遇到问题时,我们不想让数据包“死得不明不白”。为了知道产生问题的原因,我们需要构造一种新的数据包来传回消息。

其实,上面提到这种情况和我们在电视上看到的古代作战很像,在开始作战之前,主帅都要派出“侦察兵”来检查敌方的兵力状况,以调整作战策略。

3、ICMP的报文

ICMP它是一个3层网络协议,工作在网络层。由于数据包的传输是需要源地址和目的地址,所以被封装在IP中。它的数据包结构非常简单,因为一个“侦察兵”要“轻装上阵”,不能携带太多的包袱。

3.1、报文结构

目前类型字段有8位,可以有256种类型,但是我们实际常用的只有3种,分别是0,3,8,具体会在下面提到

3.2、报文分类

分为两类:查询和差错报文

3.2.1、查询报文

分为两类:回显请求和回显应答报文。

在这里代码字段,我们只用到了0,还有255个代码没有用,具体会在下面讲到

3.2.1.1、 回显请求

类型字段为8,代码字段为0

3.2.1.2、 回显应答

类型字段为0,代码字段为0

3.2.1.3、 Ping应用

ping发的包就符合ICMP协议的格式,只不过它在自己的数据字段增加了自己的格式。比原生的ICMP多了两个字段,一个是标识符,用来标识ping发出去的“侦察兵”的具体的任务是什么,比如“查找水源”;另一个是序号,用来给每个侦察兵编号,比如,“1号查找水源的侦察兵”。在数据字段中,ping还会存放发生请求的时间,用来计算往返的时间。

下图的ping的过程示意图

3.2.2、 差错报文

分为4种:终点不可达,源站抑制,时间超时和路由重定向

3.2.2.1、 终点不可达

网络不可达(代码0),主机不可达(代码1),协议不可达(代码2),端口不可达(代码3),需要进行分片但设置了不分片位代码(代码4)

3.2.2.2、 源站抑制

就是让源站放慢发送速度。小兵:报告主公,您粮草送的太多了吃不完。

3.2.2.3、 时间超时

就是超过网络包的生存时间还是没到。小兵:报告主公,送粮草的人,自己把粮草吃完了,还没找到地方,已经饿死啦。

3.2.2.4、 路由重定向

就是让下次发给另一个路由器。小兵:报告主公,上次送粮草的人本来只要走一站地铁,非得从五环绕,下次别这样了啊。

差错报文的结构相对复杂一些。除了前面还是 IP,ICMP 的前 8 字节不变,后面则跟上出错的那个 IP 包 的IP 头IP 正文的前 8 个字节

而且这类侦查兵特别恪尽职守,不但自己返回来报信,还把一部分遗物也带回来。
* 侦察兵:报告主公,张将军已经战死沙场,这是张将军的印信和佩剑。
* 主公:神马?张将军是怎么死的(可以查看 ICMP 的前 8 字节)?没错,这是张将军的剑,是他的剑 (IP 数据包的头及正文前 8 字节)。

3.2.2.5、 Traceroute应用

Traceroute是一个“大骗子”,它使用ICMP的差错报文的规则,去制造一些错误场景,已获得想到的答案。接下来我将一一说明:

3.2.2.5.1、 第一个作用:获得到达目的地的路径

第一场景:故意设置特殊的TTL(Time to Live),来追踪去往目的地时沿途经过的路由器。比如,他会发生一个TTL为1的UDP数据包,一旦到达下一个路由器,就会由于数据包“死亡”返回一个时间超时的ICMP数据包。这样它就知道了下一条路由器的IP地址了。接着,又把TTL设置为2,有获得了下一条路由器的地址了。以此类推,就获得了到达目的地的整条路的IP地址了。

但是,第一个场景里面存在一个缺陷,比如,最后一个UDP数据包已经可以到目的地了,他就不会返回ICMP差错报文,那么我怎么知道最后一个UDP数据包到底到目的地了吗?这样就有了第二个场景。

第二个场景:故意选择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报到达时,将使目的主机的 UDP 模块 产生一份“端口不可达”错误 ICMP 报文。

这就相当于故意派人去西天如来那里去请一本《道德经》,结果人家信佛不信道,消息就会被打出来。 被打的消息传回来,你就知道西天是能够到达的。为什么不去取《心经》呢?因为 UDP 是无连接的。也就是说这人一派出去,你就得不到任何音信。你无法区别到底是半路走丢了,还是真的信佛遁入空门了,只有让人家打出来,你才会得到消息。

3.2.2.5.2、 第二个作用:确定路径的MTU

Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度正好与出口 MTU 相等。如果中间遇到窄的关口会被卡 住,会发送 ICMP 网络差错包,类型为“需要进行分片但设置了不分片位”。其实,这是人家故意的好吧,每次收到 ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。

4、 总结

  • ICMP 相当于网络世界的侦察兵。我讲了两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文。
  • Ping 使用查询报文,Traceroute 使用差错报文。