每日分享一个有趣的计算机小知识,今日话题:ICMP
ICMP是Internet Control Message Protocol 的缩写,互联网控制消息协议 。它是TCP/IP协议族的一个子协议,用于在IP主机和路由器之间传递差错报告、网络拥塞控制和诊断信息。
1981年4月,美国人乔恩·波斯特尔Jon Postel(互联网发展初期的关键人物之一,编写了大量的RFC文档,在互联网协议的制定和标准化方面发挥了至关重要的作用),编写了ICMP的第一个标准草案RFC 777,初步提出了ICMP的基本概念和功能框架。同年9月,由Jon Postel编写的RFC 792正式发布,对ICMP协议的基本框架进行了定义,确立了其作为TCP/IP协议族中网络层控制协议的地位。
1983年,美国人迈克尔·穆伊斯Mike Muuss开发了基于ICMP协议的网络诊断工具Ping,用于测试网络连接和测量网络延迟。我们在开发中经常会用Ping命令来检查网络通不通(Linux和Windows中均支持),这个Ping的过程实际上就是ICMP协议的工作过程(除了Ping还有跟踪路由的Tracert命令也是基于ICMP协议的)。
Ping命令的核心原理就是利用ICMP协议的Echo Request(请求)和Echo Reply(应答)报文,通过"发送请求-接收应答"的简单交互,测试两台主机间的网络连通性、延迟和丢包率。其执行过程可分为如下6步:
1. 输入ping命令
用户在终端输入ping 目的设备的IP地址,操作系统接触发ICMP协议模块工作。
2. 构造Echo Request报文
ICMP模块生成Echo Request报文,报文中会包含两个关键字段:请求标识符和序列号。
3. 封装成IP数据包
ICMP请求报文本身无法直接传输,需被封装到IP数据包中。IP数据包的源IP设为当前用户的IP,目标IP设为目的设备的IP,且会将IP首部的协议字段设为1(表示该IP包承载的是ICMP协议数据)。
4. 网络层转发
发送Echo Request报文的数量可以设置,缺省时默认发送5个,封装好的IP数据包通过网关(如家用路由器)进入网络,路由器根据目标IP查询路由表,逐层转发数据包,最终送达目的设备。
5. 回复Echo Reply报文
目的设备的IP层收到数据包后,根据协议字段为1识别为ICMP协议,ICMP模块根据Echo Request请求生成对应的Echo Reply应答报文,再将应答报文封装成IP数据包,按原路径反向回复给用户。
6. 用户端接收应答
用户电脑收到Echo Reply数据包后交给ICMP模块,计算请求发送到应答接收的时间(即延迟),同时统计成功收到的应答数与发送的请求数,得出丢包率,然后终端会显示每一次请求的延迟、TTL(生存时间)等信息。如果网络不通(如路由故障、目的设备禁用ICMP等)用户电脑会超时未收到应答,终端就会显示Request timed out请求超时。
ICMP属于网络层协议,是同属网络层的IP协议的重要辅助协议,它有自己独立的协议规范和功能,只是借助IP协议的传输能力来实现自身功能(ICMP报文需要封装在IP数据报中传输),其协议逻辑和功能实现是独立的。它和传输层的UDP协议一样是无连接协议,无确认和重传机制,所以是不可靠的,不过ICMP并不用于传输数据。
IP协议的核心作用是在不同网络之间路由数据包,实现端到端的数据包传输,但是IP协议并不提供可靠传输,如果IP数据包因目标不可达、超时等原因丢失,IP协议并不能通知源主机是否丢包以及丢包的原因,也无法探测网络连通性、无法调节网络拥塞、无法引导路由优化...这些问题就需要ICMP协议来解决。
形象点比喻:IP是负责送货的快递员,只负责把包裹送出去,ICMP则是客服+导航,负责通知送货结果(丢件/送不到)、确认收货方是否在家,以及指引更优送货路线。
