1、概述

ICMP(Internet Control Message Protocol),即 Internet 控制报文协议,属于网络层协议,位于 IP 报文的数据段。它是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

日常使用最多的 ping,就是 ICMP 请求(Type=8)和 ICMP 应答(Type=0),一台主机向一个节点发送一个 Type=8 的 ICMP 报文,如果途中没有异常(例如被路由器丢弃、目标不回应 ICMP 或传输失败),则目标返回 Type=0 的 ICMP 报文,说明这台主机存在。

2、协议详解

ICMP报文主要有两大功能:查询报文和差错报文。回显请求与回显应答是两种 icmp 报文类型,类型号分别是 8 和 0 ,这两种类型下都只有一种代码 0 。这两种 icmp 报文属查询报文,主要用于测试网络中另一台主机是否可达,向欲测试主机发送一份 ICMP 回显请求,并等待返回 ICMP 回显应答,如果能收到,表明该主机可达。这也是网络工具 ping 程序的实现原理。

类型(0或8)

代码(0)

校验和

标识符

序列号

选项数据

类型:占用一个字节,0 代表应答 ICMP 报文;8 代表请求 ICMP 报文;

代码:占用一个字节,类型为 8 ,代码为 0 表示回显请求(ping 请求);类型 0 ,代码为 0 表示回显应答(ping 应答)。类型为 11, 代码为 0 表示超时。

校验和:占用 2  个字节,包括数据在内的整个 ICMP 数据报的检验和,其计算方法和 IP 头部校验和的计算方法一致,详细见 https://t.1yb.co/7cDm。

标识符:占用 2 个字节,一般主机会将发送进程的 ID 号放置在标识符字段,这样即使在主机上运行了多个 ping 程序,ping 程序也可以识别出返回的信息。

序列号:从 0 开始,每发送一次心得回显请求就加 1 。

在抓包过程中,icmp ping 请求包(类型 8 ,代码 0)和响应包(类型 0 ,代码 0)后,发现请求包和响应包的标识符和序号及选项数据完全一致。