• ICMP协议介绍


一、定义

  1. 网际控制报文协议ICMP(Internet Control Message Protocol),是一种面向无连接协议,用于传输出错报告控制信息;
  2. 在TCP/IP协议簇中是一个重要子协议,通常被IP层或者更高层协议(TCP/UDP)使用,属于网络层协议;
  3. 主要用于IP主机和路由器之间传递控制消息,包括网络通不通,主机是否可达,路由是否可用等网络状态。

举例:ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。

二、原因

  1. 由于IP协议数据传输天然存在不可靠无连接等特点,为了解决数据传输出现的问题,引入了ICMP协议;
  2. 这些控制消息并不传输用户数据,但是对于收集各种网络信息、诊断和排除各种网络故障以及用户数据的传递具有直观重要的作用;
  3. 在数据传输的过程中,IP提供尽力而为的服务,为了把数据包发送到目的地址尽最大努力,它并不对目的主机是否收到数据包进行验证,无法进行流量控制和差错控制。因此在数据包传输过程中,产生各种错误在所难免,为了更有效的转发IP数据包,提供数据包交付成功寄回,ICMP应运而生。

思考1:ICMP协议介于传输层和网络层之间,通常被IP层或者更高层协议(TCP/UDP)使用,那为啥属于网络层而不是传输层?

  1. ICMP 报文被封装在IP数据报中,作为IP数据报的数据部分,通过互联网传递
  2. 传输层协议关注从端到端发送数据并确保可靠性,而ICMP目的是确保将数据路由到正确的位置,实际上并不路由数据

三、ICMP数据帧

  • Type (类型):标识ICMP报文的类型;占用1字节
  • Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型;占用1字节
  • Checksum(校验和):对包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错,其计算方法和IP报头中的校验和计算方法一致;占用2字节
  • Header Other(首部其他部分):根据不同的报文类型而有不同的格式,有的是全0,有的则有其他的特殊格式。占用4字节,ICMP始终有8个字节的头部长度
  • Packet Content(数据部分):不同类型和子类型有不同的内容,占用4字节

目前定义类型详见下表,从类型值来看ICMP报文可以分为两大类:第一类是差错报文,第二类是查询报文

TypeCode描述报文类型
0-Echo响应0Echo响应报文查询
3-目的不可达0目标网络不可达报文差错
1目标主机不可达报文差错
2目标协议不可达报文差错
3目标端口不可达报文差错
4要求分段并设置DF flag标志报文差错
5源路由失败报文差错
6未知的目标网络报文差错
7未知的目标主机报文差错
8源主机隔离报文差错
9禁止访问的网络报文差错
10禁止访问的主机报文差错
11对特定的TOS网络不可达报文差错
12对特定的TOS主机不可达报文差错
13由于过滤 网络流量被禁止报文差错
14主机越权报文差错
15优先权终止生效报文差错
5-重定向0重定向网络报文差错
1重定向主机报文差错
2基于TOS的网络重定向报文差错
3基于TOS的主机重定向报文差错
8-Echo请求0Echo请求报文查询
9-路由器通告0路由通告报文查询
10-路由器请求0路由器的发现/选择/请求报文查询
11-ICMP超时0TTL超时报文差错
1分片重组超时报文差错
12-参数问题0IP报首部参数错误报文差错
1丢失必要选项报文差错
2不支持的长度报文差错
13-时间戳请求0时间戳请求报文查询
14-时间戳应答0时间戳应答报文查询
15-信息请求0信息请求报文查询
16-信息应答0信息应答报文查询

四、ICMP请求/应答帧格式

Type(类型):表示ICMP报文类型,8表示Echo(ping)request

0表示Echo(ping)reply

Code(代码):标识对应ICMP报文的代码,它与类型字段一起共同标识了ICMP报文的详细类型

Checksum(校验和):对ICMP报文数据部分在内的整个ICMP数据报的校验和

Identifier(标识符):用于表示ICMP进程,占用2字节(单进程内请求与应答报文Identifier字段保持一致

Sequence Number(序列号):用于关联请求报文和应答报文(对应请求和应答报文的序列号相同),占用2字节

思考2:Identifier和Sequence number为何有BE、LE之分?

wireshark考虑到window系统与Linux系统发出的ping报文(主要指ping应用字段而非包含IP头的ping包)的字节顺序不一样(windows为LE:little-endian byte order,Linux为BE:big-endian),为了体现wireshark的易用性,开发者将其分别显示出来。

Packet Content(数据部分):标识ICMP的相关数据部分