ICMP 是“Internet Control Message Protocol”(因特网控制报文协议)的缩写。
ICMP 报文是承载在 IP 数据报中的。

为什么需要ICMP

如在 IP 数据报生存时间 TTL 为 0 的时候,路由器不再对数据报进行转发操作,而是会直接丢弃这个数据报,并且返回一个 ICMP 报文,告诉源主机:你的数据报生存时间到了,还是没有送到目标主机那里,你可以选择重发或者放弃。

ICMP 出现的目的不是为上层应用程序提供服务,只是在 IP 层传递差错的报文,依赖于 IP 协议进行传输。


ICMP 报文结构

image.png

ICMP首部片段 长度
/bit
解释
类型 8 表示产生这种类型 ICMP 报文的原因
代码(Code)字段 8 它进一步描述了产生这种类型 ICMP 报文的具体原因。
因为每种类型的报文都可能有多个,比如目的不可达报文,产生这种原因可能有主机不可达、协议不可达、端口不可达等多个原因。
校验和字段 16 用于记录包括 ICMP 报文数据部分在内的整个ICMP 数据报的校验和,以检验报文在传输过程中是否出现了差错,
数据区域 装载 IP 数据报首部及 IP 数据报的数据区域前 8 字节(为 IP 数据报的数据区域前 8 个字节刚好覆盖了传输层协议中的端口号字段,而 IP 数据报首部就拥有目标 IP 地址与源 IP 地址。
当源主机收到这样子的ICMP 报文后,它能根据 ICMP 报文的数据区域判断出是哪个数据包出现问题,并且 IP 层能够根据端口号将报文传递给对应的上层协议处理)

ICMP 报文类型

image.png

ping 命令,它的本质就是一个 ICMP 查询报文。


ICMP报文不能纠正错误,会将信息传递给上层协议,由上层协议进行处理。

报文类型.xmind