一、ICMP是什么
ICMP( Internet Control Message Protocol)是互联网控制报文协议,其主要功能确认IP包是否成功送达目标地址、报告发送过程中IP包被废弃的原因和改善网络设置等。
在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将由ICMP负责通知。例如:

主机A向主机B发送了数据包,由于某种原因导致路由器2未能发现主机B的存在,这时,路由器2就会向主机A发送一个ICMP目标不可到达数据包,说明发往主机B的包未能成功。ICMP的这种通知消息会使用IP进行发送。
二、ICMP包头格式
ICMP报文是封装在IP包里面,它工作在网络层,是IP协议的助手。

ICMP包头的类型字段,大致分为两大类:
- 查询报文类型:一种用于诊断的查询信息
- 差错报文类型:一类是通知出错原因的错误消息

三、查询报文类型
回送消息是类型0和8,用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping命令就是利用这个消息实现的。

可以向对端主机发送回送请求的消息(类型8),也可以接收对端主机发回来的回送应答消息(类型0)。

相比原生的ICMP,这里多了两个字段:
- 标识符:用以区分是哪个应用程序发ICMP包,比如用进程PID作为标识符;
- 序号:序列号从0开始,每发送一次新的回送请求就会加1,可以用来确认网络包是否有丢失。
四、差错报文类型
- 目标不可达消息---类型3
- 原点抑制消息---类型4
- 重定向消息---类型5
- 超时消息---类型11
IP路由器无法将IP数据包发送给目标地址时,会给发送端主机返回一个目标不可达的ICMP消息,并在这个消息中显示不可达的具体原因,原因记录在ICMP包头的代码字段。



五、ping------查询报文类型的使用

主机A执行ping主机B后,源主机首先构建一个ICMP回送请求消息数据包。ICMP数据包内包含两个字段,最重要的是两个:
- 类型:对于回送请求消息而言该字段为8;
- 序号:主要用去区别连续ping的时候发出的多个数据包。





以上总结如下图:

如果跨网段的话,还会涉及网关的转发、路由器的转发等等。