本节书摘来自异步社区《Wireshark数据包分析实战(第2版)》一书中的第6章6.5节互联网控制消息协议,作者【美】Chris Sanders,更多章节内容可以访问云栖社区“异步社区”公众号查看。
6.5 互联网控制消息协议
互联网控制消息协议(Internet Control Message Protocol, ICMP)是TCP/IP协议族中的一个效用协议,负责提供在TCP/IP网络上设备、服务以及路由器可用性的信息。大多数网络检修技巧和工具都是基于常用的ICMP消息类型。ICMP在RFC792中定义。
6.5.1 ICMP头
ICMP是IP的一部分并依赖IP来传递消息。ICMP头相对较小并根据用途而改变。如图6-29所示,ICMP头包含了以下几个域。
![414ac8dead6f3fd21f56a6467102942fc421db6d](https://i-blog.csdnimg.cn/blog_migrate/afefecff2c5be10ac30f8c88c5ae21c2.png)
类型(Type):ICMP消息基于RFC规范的类型或分类。
代码(Code):ICMP消息基于RFC规范的子类型。
校验和(Checksum):用来保证ICMP头和数据在抵达目的地时的完整性。
可变域(Variable):依赖于类型和代码域的部分。
6.5.2 ICMP类型和消息
正如刚才所说,ICMP数据包的结构取决于它由Type和Code域中的值所定义的用途。
你可以将ICMP的类型域作为数据包的分类,而Code域作为它的子类。举例来说,Type域的值为3时意味着“目标不可达”。但只有这个信息可能不足以发现问题,当如果数据包在Code域中指明值为3,也就是“端口不可达”时,你就可以知道这应该是你试图进行通信的端口的问题。
注意
如果想要浏览所有可用的ICMP类型和代码,可以访问http://www.iana.org/assignments/icmp-parameters。
6.5.3 Echo请求与响应
ICMP因为其ping功能而声名大噪。ping用来检测一个设备的可连接性。大多数信息技术专家都会对ping很熟悉。
在命令行中输入ping ,其中将替换为你网络上的一个实际IP地址,就可以使用ping了。如果目标设备在线,你的计算机有到达目标的通路,并且没有防火墙隔离通信的话,你将能够看到对ping命令的响应。
在图6-30所示的例子中,给出了4个成功显示了大小、RTT和TTL的响应。Windows还会提供一个总结信息,告诉你有多少数据包被发送、接收或者丢失。如果通信失败,你会看到一条告诉你原因的信息。
![ba192764656669543ff48d6dd7c598a2455784d1](https://i-blog.csdnimg.cn/blog_migrate/23a082e8924d45d6e51786b126b160e8.png)
基本上来说,ping命令每次向一个设备发送一个数据包,并等待回复,以确定设备是否可连接,如图6-31所示。
![6b80091b39af5f33998076c7f4bdb5e23326f58f](https://i-blog.csdnimg.cn/blog_migrate/4eacdbfa8f401302b25a39e09e0c3816.png)
注意
尽管ping对于IT业必不可少,但当部署了基于主机的防火墙时,它的结果就可能具有欺骗性了。现在很多的防火墙都限制了设备去响应ICMP数据包。这样对于安全性是有帮助的,因为潜在的攻击者可能会使用ping来判断主机是否可达,从而放弃进一步的行动。但这样查找问题时也变得困难起来——当你知道你可以和一台设备通信时,使用ping检测连接却收不到任何响应会让你很抓狂。
ping功能在实际中是很好的简单ICMP通信的例子。文件icmp_echo.pcap 中的数据包会告诉你在运行ping时都发生了什么。
第一个数据包(如图6-32所示)显示了主机192.168.100.138在给192.168.100.1发送数据包图标1。当你展开这个数据包的ICMP区段时,你可以通过查看类型和代码域判断ICMP数据包的类型。在这个例子中,数据包的类型是8图标2,代码是0图标3,意味着这是一个echo请求(Wireshark会告诉你所显示的类型/代码究竟是什么意思)。这个echo(ping)请求是整个过程的前一半。这是一个简单的ICMP数据
![276cbd4ea38f5635cde8fcf84f4868da814fca1d](https://i-blog.csdnimg.cn/blog_migrate/fc698ba4006183e9d8790c24cc8c6ff3.png)
包,使用IP发送,包含了很少的数据。除了指定的类型、代码以及校验和,我们还会有一个序列号用来匹配请求和响应,还有在ICMP数据包可变域中的一串随机文本字符。
注意
echo和ping经常会被混淆,但记住ping实际上是一个工具的名字。ping工具用于发送ICMP echo请求数据包。
这个序列的第二个数据包是对我们请求的响应(如图6-33所示)。这个数据包的ICMP区段类型是0图标1,代码是0图标2,表示这是一个echo响应。由于第二个数据包的序列号与第一个的相匹配图标3,我们就知道这个echo响应与之前数据包的echo请求匹配。这个响应数据包中有着和初始请求中传输的32位字符串一样的内容图标4。在这第二个数据包被192.168.100.138成功接收到之后,ping就会报告成功(如图6-34所示)。
![dfd7054b671691ada1ab64b7aa7ddb195c9ed32c](https://i-blog.csdnimg.cn/blog_migrate/9ab572d89619edd6a20f3de99f8f82d2.png)
你还可以使用ping的选项,增加它的数据填充,这样在检测不同类型网络时,强制将数据包分片。这在你检测分片较小的网络时会用到。
注意
ICMP的echo请求使用的随机文本可能会引起潜在攻击者的兴趣。攻击者可能会用这段填充的内容来推测设备所使用的操作系统。并且攻击者可能在这个域中放置一些数据位作为反向连接的手段。
6.5.4 路由跟踪
路由跟踪功能用来识别一个设备到另一个设备的网络路径。在一个简单的网络上,这个网络路径可能只经过一个路由器,甚至一个都不经过。但在复杂的网络中,数据包可能会经过数十个路由器才会到达最终目的地。这就是为什么确定数据包从一个目的地到另一个的实际路径对于通信检修十分重要。
通过使用ICMP(在IP的一些帮助下),路由跟踪可以画出数据包的路径。举例来说,文件icmp_traceroute.pcap中的第一个数据包,和我们在上一节中看到的echo请求(如图6-34所示)很类似。
![d7991224010fad9e66057abc46b68f3567106049](https://i-blog.csdnimg.cn/blog_migrate/797d310fc432e35bbdf38a3a87000346.png)
乍看起来,这个数据包就是一个从192.168.100.138到4.2.2.1图标2的简单echo请求图标1,并且ICMP中的每一部分都与echo请求数据包相同。但是当你展开这个数据包的IP头时,你可以注意到一个奇怪的数字。这个数据包的TTL被设为了1图标3,也就意味着这个数据包会在它遇到的第一个路由器处被丢掉。因为目标地址4.2.2.1是一个互联网地址,我们就会知道源设备和目的设备之前至少会有一个路由器,所以这个数据包不会到达目的地。这对我们来说是个好事,因为路由跟踪正是需要这个数据包只到达它传输的第一个路由器。
第二个数据包正如所期望的那样,是前往目的地路径上第一个路由器发回的响应(如图6-35所示)。这个数据包到达192.168.100.1这个设备后,它的TTL减为0,所以它不能继续传输,于是路由器回复了一个ICMP响应。这个数据包的类型是11图标1,代码是0图标2,也就是告诉我们由于数据包的TTL在传输过程中超时,所以目的不可达。
![a447f1a6dd7231c7088ca511522ca8f0c56af249](https://i-blog.csdnimg.cn/blog_migrate/78b735359d4fa33a2d6ea33dfbd4d983.png)
这个ICMP数据包有时候被叫做双头包,因为这个ICMP的结尾部分包含了原先echo请求的IP头图标3和ICMP数据图标4的拷贝。这个信息被证明在检修的时候非常有用。
在第7个数据包前,这样发送TTL自增数据包的过程又出现了两次。这次的过程与你在第1个数据包中看到的过程不同,IP头的TTL值被设为了2,从而保证这个数据包会在被丢弃前到达第二跳路由。和我们所期望的一样,我们从下一跳的路由12.180.241.1接到了一个有着同样ICMP目的不可达和TTL超时消息的响应。这个将TTL自加1的过程一直持续直到到达目的地4.2.2.1。
总体来说,路由跟踪要与路径上的每一个路由器进行通信,从而画出前往目的地的路由图,如图6-36所示。
![e76ce9bd87926b3b3fcc5ef035840a589376852d](https://i-blog.csdnimg.cn/blog_migrate/b94466f203a30f289b05cdd195df2235.png)
注意
我们这里所讨论的路由跟踪主要是基于Windows,因为只有它在使用ICMP。Linux上的路由跟踪更复杂一些,并使用了其他的协议来进行路由路径的跟踪。
你会在整本书中看到ICMP有着不同的功能。在我们分析更多场景的时候,我们会更频繁地使用ICMP。
这一章主要向你介绍了数据包分析过程中会经常看到的最重要的几种协议。IP、TCP、UDP和ICMP是所有网络通信的基础,并且对于你每天要进行的工作至关重要。在下一章中,我们将会学习一些常用的应用层协议。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。