每日一个计算机小知识:ICMP

每日分享一个有趣的计算机小知识,今日话题: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则是客服+导航,负责通知送货结果(丢件/送不到)、确认收货方是否在家,以及指引更优送货路线。

相关推荐
掘金码甲哥6 小时前
🚀糟糕,我实现的k8s informer好像是依托答辩
后端
GoGeekBaird6 小时前
Andrej Karpathy:2025年大模型发展总结
后端·github
uzong7 小时前
听一听技术面试官的心路历程:他们也会有瓶颈,也会表现不如人意
后端
Jimmy7 小时前
年终总结 - 2025 故事集
前端·后端·程序员
吴佳浩 Alben8 小时前
Python入门指南(四)
开发语言·后端·python
倚栏听风雨8 小时前
lombook java: 找不到符号
后端
码财小子9 小时前
记一次服务器大并发下高延迟问题的定位
后端
我是小妖怪,潇洒又自在9 小时前
springcloud alibaba(九)Nacos Config服务配置
后端·spring·spring cloud
Victor3569 小时前
Netty(26)如何实现基于Netty的RPC框架?
后端