日常工作中,我们经常需要判断网络是否连通,相信大家都会使用ping这个命令,其实ping命令是基于 ICMP 协议来实现的,那么什么是 ICMP 协议呢?ICMP是 Internet Control Message Protocol 的缩写,即互联网控制消息协议。它用于TCP/IP网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,使网络管理者可以对所发生的问题作出诊断,然后采取适当的措施解决问题。本文就来介绍一下ICMP协议的工作原理。

ping和icmp的关系(深入了解Ping命令后的工作原理)(1)

ICMP报文格式

从ICMP的报文格式来说,ICMP是IP的上层协议,但是ICMP是分担了IP的一部分功能。所以,ICMP也被认为是与IP同层的协议,工作在网络层,是IP协议的助手。如下图所示,ICMP封装在IP报进行传输,ICMP报文本身被封装在IP数据报的数据区中,而这个IP数据报又被封装在帧数据中。在IP数据报报头中的协议(Protocol)字段设置成1,表示该数据是ICMP报文。关于IP报文格式介绍详见《计算机网络传输中IP数据报文格式详解并结合Wireshark深入分析》。

ping和icmp的关系(深入了解Ping命令后的工作原理)(2)

ICMP报文格式如下图所示,ICMP报文的前4个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关,然后是数据部分,长度也取决于类型。

ping和icmp的关系(深入了解Ping命令后的工作原理)(3)

ICMP报文类型

ICMP报文主要分为两大类:查询报文和差错报文。所有ICMP 用来交流错误通知和信息询问的报文,都是由类型和代码的组合来表示的。ICMP报文由类型来表达它的大概意义,一共定义了15种类型,需要传递细小的信息时由代码再来进行分类。

ping和icmp的关系(深入了解Ping命令后的工作原理)(4)

ICMP实现之ping命令

通过上面的叙述,我们了解了 ICMP 协议的内容,那么下面我们来看一下ICMP 的具体实现与应用吧。正如前面所说ICMP报文类型其实有好多种,用以反馈网络通信中的各种情形,而我们最最常用的情形是可以通过ping命令可以用来在网络层次上调查与指定机器是否连通。为了实现这个功能,ping命令使用了两个ICMP 报文:ICMP回送请求(类型是8,代码是0)和ICMP回送应答(类型是0,代码是0)。

ping和icmp的关系(深入了解Ping命令后的工作原理)(5)

首先,源主机向目标主机执行ping命令,源主机会构建一个ICMP回送请求消息数据包,在这个回送请求数据包中,相比与原生的ICMP除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是16位的字段,比如将进程号PID填写在标识符里,用以区分是哪个应用程序发ICMP包。对于序号,每送出一个数据包数值就增加1。另外该ICMP报文的选项数据部分还会存放发送请求的时间值,来计算往返时间。

我们在IP地址为192.168.0.102主机上执行ping 192.168.0.1的命令,并通过 WireShark 抓包可以看出,源主机会构建一个ICMP回送请求消息数据包如下图所示。可以看到该ICMP报文的类型(Type)为8,对应代码(Code)为0,表示Echo(ping) request——ping回送请求,后面还有检验和(Checksum)等字段,检验ICMP报文结构。

ping和icmp的关系(深入了解Ping命令后的工作原理)(6)

当源主机送出的回送请求到达目标主机后,目标主机回答这一请求,发送一个ICMP回送应答数据包。这个ICMP 回送应答报文在IP层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目标IP 地址字段被交换了,类型字段里填入了表示回送应答的0。

通过 WireShark 抓包如下图所示,可以看到该ICMP报文的类型(Type)为0,对应代码(Code)为0,表示Echo(ping) Reply——ping回显应答。

ping和icmp的关系(深入了解Ping命令后的工作原理)(7)

如果目的主机可以接收到回送应答数据包,那我们就认为目标主机是正常工作着的。进一步,记住发送回送请求数据包的时间,与接收到回送应答数据包的时间差,就能计算出数据包一去一回所需要的时间。但是,收到的回送应答报文里写的只是类型和代码的话,发送方主机将无法判断它是否是自己发出去请求的回答。因此,前面说到的标识符和序号字段就有它的意义了。将这两个值与回送应答报文中的相同字段值一比较,送行方主机就能够简单地检测回送应答是否正确了。执行ping 命令而调查的结果没什么问题的话,就将目标主机的IP 地址,数据大小,往复花费的时间打印到屏幕上。

ping和icmp的关系(深入了解Ping命令后的工作原理)(8)

,