1. ICMP协议
在学习ICMP协议之前,我们先来回顾下IP协议。
IP协议的缺点: 无差错报告和差错纠正机制,缺少一种为主机管理查询的机制。
数据在网络中传输必须要封装成IP数据报格式,而IP协议的特点是面向无连接,且不可靠的,可靠性由上层协议来保证,因为IP协议对于数据是尽最大努力传输到目的地的,所以对于数据在网络传输过程中出现了故障时,出错的问题定位和排除非常困难,因为IP协议对于数据的错误的处理不进行任何报告和纠正,缺少对错误的管理,也就是不会把错误进行查询并把错误发回给发送端。
而ICMP协议正好解决了这个问题,ICMP协议就是针对IP协议的这种缺点产生的,那么ICMP是一个什么协议呢?
ICMP协议(英文:Internet Control Message Protocol,ICMP)是一个网络控制消息协议,用于实现ip网络层及上层协议的数据链路连通性和追踪的差错报告,即在计算机,路由器之间传递控制消息。
控制消息是指网络连通性,主机是否可达,路由是否可用等网络本身的消息
。
源发送者或上层应用程序根据返回的ICMP错误信息,执行下一步动作,比如常用的ping程序和tracert程序都是基于ICMP协议进行开发的。
ICMP协议传输过程如图所示:

上图中展示了ICMP协议是属于网络层,因为从网络的角度来说,ICMP协议服务于IP协议,主要用于实现数据在网络链路传输的消息报告。也就是说ICMP协议的数据报文往下传输到网络接口层(数据链路层)需要进行封装成IP的数据报文。

首先ICMP数据报文封装到IP数据报文的数据部分里,然后加上IP的首部形成一个完整的IP数据报文再往下进行传输,到数据链路层,IP数据报文再加上帧头和帧尾,封装成数据帧格式。
2. ICMP封装过程
说了这么多,现在我们通过wireshark软件来抓一个ICMP协议的包来验证ICMP的传输过程中数据是怎么封装的。
上图来看,在IP数据报文中确实封装了ICMP报文。
前面我们说过,ICMP数据报在往下传输时,必须封装成IP数据报文的形式,我们打开IP数据报文查看发现,在IP数据报文中的Protocol(协议)字段的值为1就表示携带的协议是ICMP协议,上图中确实也验证了这一点。