当前位置: 首页 > news >正文

计算机网络---ICMP协议(Internet Control Message Protocol,互联网控制消息协议)

ICMP(Internet Control Message Protocol,互联网控制消息协议)是计算机网络网络层的核心控制协议,它不直接传输用户数据,而是通过传递网络状态信息(如差错报告、查询响应)保障IP协议的正常运行,是网络故障诊断、路径探测的关键技术基础。

一、ICMP协议的本质与定位

要理解ICMP,首先需明确其“辅助IP”的核心角色——IP协议是无连接、不可靠的,无法主动反馈数据传输中的问题(如“目标主机不可达”“数据包超时”),而ICMP正是为弥补这一缺陷而生。

ICMP本身不具备独立传输能力,所有ICMP消息必须封装在IP数据报中传输,这是其工作的核心前提,具体逻辑如下:

  1. 封装逻辑:ICMP报文(含首部+数据)作为IP数据报的“数据部分”,外层包裹IP首部;IP首部的“协议字段”需设为1(表示该IP数据报承载的是ICMP协议数据),用于接收方识别并解封装出ICMP报文。
  2. 传输路径:ICMP消息的传输路径与普通IP数据报一致,均遵循IP路由规则——从源主机出发,经路由器转发,最终到达目标主机/路由器,不存在独立的ICMP路由表。
  3. 可靠性限制:因依赖IP协议(无连接、不可靠),ICMP消息可能丢失(如IP数据报丢包),且ICMP自身无重传机制,需依赖上层应用(如ping)通过“超时重发”间接保障可靠性。

1. 协议分层归属

ICMP属于网络层协议,但它不具备独立的传输能力,必须封装在IP数据报中传输(ICMP报文作为IP数据报的“数据部分”)。这一点需与传输层协议(TCP/UDP)区分——TCP/UDP可直接封装应用层数据,而ICMP仅服务于IP协议。

2. 核心功能

ICMP的功能可概括为两大类,覆盖网络通信的“问题反馈”与“状态查询”需求:

  • 差错报告:当IP数据报传输出错时(如目标不可达、超时、参数错误),路由器或目标主机通过ICMP向源主机发送“差错报文”,告知错误原因。
  • 查询请求:源主机主动向目标主机/路由器发送“查询报文”,获取特定信息(如目标是否可达、网络延迟、子网掩码),目标需返回“应答报文”。
差错触发条件

只有满足以下场景,节点才会生成ICMP差错报文,非错误场景(如正常接收IP包)不触发:

  • IP数据报的TTL字段减至0(路由器转发时触发,防止数据包无限循环);
  • 路由表中无到达目标IP的路径(路由器触发,目标不可达);
  • 目标主机无对应传输层端口的服务(如UDP端口未监听,目标主机触发,端口不可达);
  • IP数据报首部字段非法(如版本号错误、校验和无效,接收节点触发,参数问题);
  • 目标主机分片重组超时(未在规定时间内收到所有IP分片,目标主机触发)。

二、ICMP报文结构:固定首部+可变数据

ICMP报文的结构统一,由8字节固定首部可变长度数据部分组成,不同类型的ICMP报文(如差错、查询)仅在“数据部分”的内容上有差异。

1. 固定首部(8字节)

首部包含4个核心字段,是ICMP报文的“身份标识”与“内容说明”,字段含义如下:

字段长度(字节)核心作用
类型(Type)1定义ICMP报文的“大类”,用数字标识(如Type=8表示“回显请求”,Type=0表示“回显应答”)。
代码(Code)1对“类型”的细分,进一步说明具体场景(如Type=3“目的不可达”,Code=0表示“网络不可达”,Code=1表示“主机不可达”)。
校验和(Checksum)2用于校验ICMP报文的完整性(计算范围包括“ICMP首部+ICMP数据”,若传输中数据损坏,接收方会丢弃报文)。
标识符(Identifier)2(可选)仅用于“查询类报文”,区分不同的查询请求(如同一主机同时发起多个ping请求,通过标识符匹配“请求-应答”对)。
序列号(Sequence Number)2(可选)与标识符配合,按顺序标识查询请求(如ping请求的序列号从0递增,确保应答与请求一一对应)。

2. 数据部分(可变长度)

数据部分的内容由ICMP报文类型决定,核心作用是“补充上下文信息”:

  • 差错类报文:必须包含“出错的IP数据报首部+该IP数据报的数据部分前8字节”。这样源主机可通过首部信息定位出错的IP连接(如目标IP、协议类型),通过前8字节定位具体的传输层连接(如TCP/UDP端口号)。
  • 查询类报文:内容按需定义,例如“回显请求”(ping)的数据部分包含“时间戳”(记录发送时间),“地址掩码请求”的数据部分可包含“请求的掩码长度”。

三、ICMP报文分类:差错报告与查询请求

ICMP报文按功能分为差错报告报文查询请求报文两大类,每类包含多种具体报文类型,需掌握核心类型的“用途+触发场景”。

1. 差错报告报文(5种核心类型)

差错报文的核心特点是“单向传输”——仅由出错节点(路由器/目标主机)向源主机发送,源主机无需回复。常见类型如下:

  • Type=3:目的不可达(Destination Unreachable)
    • 触发场景:IP数据报无法送达目标(如目标IP不存在、路由表无到达目标的路径、目标主机宕机)。
    • 代码细分:共16种代码,典型如Code=0(网络不可达)、Code=1(主机不可达)、Code=3(端口不可达,常用于UDP无对应端口时)。
  • Type=11:超时(Time Exceeded)
    • 触发场景:IP数据报的TTL(生存时间)字段减至0(防止数据包在网络中无限循环),或分片重组超时(目标主机未收到所有分片)。
    • 代码细分:Code=0(TTL超时,路由器发送)、Code=1(分片重组超时,目标主机发送)。
  • Type=12:参数问题(Parameter Problem)
    • 触发场景:IP数据报首部存在错误(如字段值非法、选项格式错误),接收方无法处理。
  • Type=4:源抑制(Source Quench)
    • 触发场景:路由器/目标主机接收能力不足(如缓存满),需通知源主机降低发送速率。
    • 注意:该类型已逐渐被TCP流量控制替代,目前很少使用。
  • Type=5:重定向(Redirect)
    • 触发场景:源主机发送的数据包经过“非最优路由器”,该路由器会告知源主机“更优的下一跳路由器”,避免网络资源浪费。

2. 差错报文构造规则

为让源主机精准定位出错的IP连接,ICMP差错报文的“数据部分”必须包含特定信息,不可随意构造:

  • 必须携带“出错IP数据报的首部”(20字节,含源IP、目标IP、协议类型等关键信息);
  • 必须携带“出错IP数据报的数据部分前8字节”(用于定位传输层连接,如TCP/UDP的端口号、序列号);
  • ICMP首部的“类型(Type)”和“代码(Code)”需精准匹配错误类型(如Type=3表示目标不可达,Code=1表示主机不可达)。

差错报文完整传输与处理流程(以“目标主机不可达”为例)

以源主机A向目标主机B发送IP数据报,路由器R1无到达B的路由为例,流程拆解如下:

  1. 源主机发送IP包:A构造承载用户数据的IP数据报(源IP=A,目标IP=B,协议字段=6表示TCP),发送至网关路由器R1。
  2. 路由器触发差错:R1查询路由表,发现无到达B的路径,判定“目标主机不可达”,触发ICMP差错报文生成。
  3. 构造ICMP差错报文:R1生成ICMP报文——首部(Type=3,Code=1,校验和=计算值),数据部分(A发送的IP首部+TCP首部前8字节)。
  4. 封装为IP包转发:R1将ICMP报文封装为新IP数据报(源IP=R1,目标IP=A,协议字段=1),按路由规则发送回A。
  5. 源主机处理差错:A接收IP包后,解封装出ICMP报文,通过Type=3、Code=1识别“目标主机不可达”,并结合数据部分的IP/TCP信息,定位到出错的连接(如目标IP=B,TCP端口=80),最终向上层应用反馈错误(如浏览器显示“无法访问目标网站”)。

2. 查询请求报文(3种核心类型)

查询报文的核心特点是“双向交互”——源主机发“请求”,目标必须回“应答”,常用于网络诊断。

  • Type=8(请求)/Type=0(应答):回显请求/应答(Echo Request/Reply)
    • 用途:判断目标主机是否可达,测量网络往返延迟(RTT),即“ping命令”的底层实现。
    • 工作流程:源主机发送Type=8报文(含标识符、序列号、时间戳)→ 目标主机接收后,原样返回Type=0报文 → 源主机计算发送与接收的时间差,即为RTT。
  • Type=13(请求)/Type=14(应答):时间戳请求/应答(Timestamp Request/Reply)
    • 用途:同步源主机与目标主机的时间,或测量网络延迟(比ping更精确,可记录“发送时间”“接收时间”“应答发送时间”三个时间戳)。
  • Type=17(请求)/Type=18(应答):地址掩码请求/应答(Address Mask Request/Reply)
    • 用途:源主机(如无DHCP的主机)向网关路由器请求“子网掩码”,以确定本地网络的地址范围。
查询请求报文完整传输与处理流程见ICMP的典型应用ping

四、ICMP的典型应用:ping与traceroute

ICMP协议的价值主要通过实际工具体现,其中pingtraceroute(Windows下为tracert)是最常用的网络诊断工具,需掌握其底层原理。

1. ping:目标可达性与延迟测试

ping是基于ICMP“回显请求/应答”(Type=8/0)实现的工具,核心功能是“验证目标是否在线”和“测量网络延迟”。
源主机A通过ping检测目标主机B是否可达,流程如下:

  1. 构造ICMP回显请求报文:A生成ICMP报文——首部(Type=8表示回显请求,Code=0,标识符=随机值(如12345),序列号=0(递增),校验和=计算值),数据部分(包含当前时间戳T1,用于后续计算延迟)。
  2. 封装IP包发送:A将ICMP请求报文封装为IP数据报(源IP=A,目标IP=B,协议字段=1),发送至B。
  3. 目标主机生成应答:B接收IP包后,解封装出ICMP请求报文,确认Type=8(回显请求),随即生成“回显应答报文”——首部(Type=0表示回显应答,Code=0,标识符/序列号与请求一致,确保匹配),数据部分(原样携带请求中的时间戳T1)。
  4. 应答报文回传:B将ICMP应答报文封装为IP数据报(源IP=B,目标IP=A,协议字段=1),发送回A。
  5. 源主机计算结果:A接收应答后,记录当前时间戳T2,计算往返延迟RTT=T2-T1;同时通过“标识符+序列号”匹配请求与应答,统计“丢包率”(未收到应答的请求数/总请求数),最终向用户展示结果(如ping显示“来自B的回复:字节=32,时间=15ms,TTL=64”)。
  • 关键细节:部分主机/路由器会禁用ICMP回显功能(出于安全考虑),此时ping会显示“请求超时”,但不代表目标一定不可达(可能是ICMP被屏蔽)。

2. traceroute:网络路径追踪

traceroute用于追踪“源主机到目标主机的所有路由器节点”,底层依赖ICMP“超时报文”(Type=11)和“目的不可达报文”(Type=3)。

  • 工作原理(以Linux traceroute为例):
    1. 源主机向目标发送UDP数据包(端口号大于30000,目标通常无对应服务),并将第一个数据包的TTL设为1。
    2. 第一个路由器收到数据包后,TTL减1变为0,触发“超时”,向源主机发送ICMP超时报文(Type=11),源主机记录该路由器的IP。
    3. 源主机发送第二个数据包,TTL设为2,第二个路由器会返回超时报文,以此类推,直到数据包到达目标主机。
    4. 目标主机收到UDP数据包后,因无对应端口服务,会发送ICMP“端口不可达”报文(Type=3,Code=3),源主机确认已到达目标,停止追踪。
  • 差异说明:Windows的tracert直接使用ICMP回显请求报文(而非UDP),通过递增TTL实现路径追踪,核心逻辑与Linux一致。

五、ICMP协议的特点与限制

1. 核心特点

  • 无连接、不可靠:ICMP不建立连接,报文通过IP传输,若IP数据报丢失,ICMP报文也会丢失,且无重传机制。
  • 仅服务于IP:ICMP的报文内容均围绕IP数据报展开(如差错报文需携带IP首部),不直接处理应用层数据。
  • 不转发差错报文:为避免“差错报文风暴”,路由器不会转发收到的ICMP差错报文(仅源主机可接收差错报文)。

2. 关键限制

为防止ICMP消息引发网络风暴或无限循环,其工作过程需严格遵循以下规则,这些规则是保障ICMP正常运行的“安全边界”:

  1. 不转发ICMP差错报文:路由器仅会向源主机发送自己生成的差错报文,不会转发从其他节点收到的差错报文(如R1收到R2发的差错报文,不会再转发给A),避免多节点转发导致的“差错风暴”。
  2. 不生成自身差错的ICMP报文:若ICMP消息(如差错报文、查询请求)自身在传输中出错(如IP包丢包),不会再生成新的ICMP差错报文,防止“差错→生成差错→再生成差错”的无限循环。
  3. 不报告广播/组播报文差错:对IP广播(如255.255.255.255)或组播(如224.0.0.1)报文,即使传输出错,也不会生成ICMP差错报文,避免大量广播差错报文占用网络带宽。
  4. 查询报文必须成对交互:目标节点收到ICMP查询请求后,若未被配置禁止(如防火墙屏蔽),必须返回对应的应答报文(如收到Type=8请求,必须回Type=0应答),否则源主机无法判断目标状态(会显示“请求超时”)。

总结

ICMP是IP协议的“辅助工具”,通过差错报告保障网络通信的“问题可感知”,通过查询请求实现网络状态的“主动诊断”。其核心价值在于——没有ICMP,管理员无法通过ping判断主机是否在线,无法通过traceroute定位路由故障,IP网络的运维与排错将变得几乎不可能。


ICMPv4报文类型与代码对应表

一、差错报告报文(单向传输,由出错节点发送给源主机)

TypeCode名称描述典型应用场景备注
30网络不可达路由器无到达目标网络的路由条目源主机发送数据包到不存在的网络(如192.168.100.0/24,而路由器路由表无此条目)-
31主机不可达路由器有目标网络路由,但目标主机无响应(如主机宕机、防火墙阻断)发送到目标主机的ICMP请求超时(如ping 192.168.1.100超时)-
32协议不可达目标主机不支持IP数据报中的协议字段(如协议号为51,但主机未安装对应协议)发送GRE封装的IP包到不支持GRE的主机-
33端口不可达目标主机端口未监听(常用于UDP)向未运行DNS服务的主机发送UDP 53端口查询-
34需要分片但DF位已设置数据包大小超过路径MTU且设置了“不分片”标志发送1500字节的IP包到MTU为1492的链路(如PPPoE)-
35源站选路失败源主机指定的源路由不可用(如路由条目不存在)使用严格源路由选项发送数据包,路径中某路由器无法匹配-
36目的网络未知目标网络未在路由表中注册(通常由管理员配置错误导致)发送到AS100的专用网络(如100.64.0.0/10),但全球路由表无此条目-
37目的主机未知目标网络存在,但目标主机IP未分配或未注册(如DHCP未分配)发送到动态IP地址池中的未分配地址(如192.168.1.200未被租用)-
313通信被强制禁止目标网络/主机因策略(如防火墙、ACL)禁止通信访问被防火墙标记为“拒绝”的IP地址或端口-
110TTL超时IP数据报的TTL字段减至0(路由器发送)Traceroute工具通过递增TTL追踪路径,每跳TTL减1触发超时-
111分片重组超时目标主机未在规定时间内收到所有分片发送大文件分片后,部分分片丢失导致重组失败-
120IP首部错误IP数据报首部字段非法(如版本号非4、校验和错误)收到伪造的IP包(如版本号为5)-
121缺少必需选项IP首部缺少必要选项(如严格源路由选项缺失)要求严格源路由但未提供选项的数据包-
40源抑制(已过时)路由器/主机因拥塞请求源主机降低发送速率早期网络中缓解拥塞,现被TCP流量控制替代已被RFC 1122废弃
50网络重定向路由器告知源主机更优的目标网络下一跳主机通过非最优网关发送数据包,路由器返回更优路径-
51主机重定向路由器告知源主机更优的目标主机下一跳主机访问本地网络另一主机时,通过非直连网关转发-
52TOS网络重定向基于服务类型(TOS)的网络重定向高优先级流量被重定向到低延迟链路-
53TOS主机重定向基于服务类型(TOS)的主机重定向高优先级流量被重定向到低延迟路径的目标主机-

二、查询请求报文(双向交互,源主机请求,目标主机/路由器应答)

TypeCode名称描述典型应用场景备注
80回显请求(Ping请求)源主机发送请求,目标主机返回应答,用于检测可达性和延迟Ping命令(如ping www.baidu.com)-
00回显应答(Ping应答)目标主机响应回显请求,返回时间戳等信息正常情况下,Ping命令收到的回复-
130时间戳请求(已过时)源主机请求目标主机返回当前时间戳,用于时间同步早期网络时间同步,现被NTP替代已被RFC 1305废弃
140时间戳应答(已过时)目标主机响应时间戳请求,返回发送/接收/应答时间戳同上已被RFC 1305废弃
170地址掩码请求源主机请求目标路由器返回子网掩码(如无DHCP时)无盘工作站启动时获取子网掩码已被DHCP取代
180地址掩码应答路由器响应地址掩码请求,返回子网掩码同上已被DHCP取代
90路由器通告路由器周期性广播自身存在及路由信息,用于无状态地址自动配置IPv6中广泛使用,IPv4中较少-
100路由器请求主机主动请求路由器发送通告,获取路由信息主机启动后快速获取路由信息-

三、关键说明

  1. 差错报文数据部分:所有差错报文的数据部分必须包含出错IP数据报的首部数据部分前8字节,以便源主机定位错误的IP连接(如源IP、目标IP、协议类型)和传输层连接(如TCP/UDP端口号)。
  2. 代码细分规则
    • Type=3(目的不可达)的Code值最多,共16种(0-15),覆盖网络、主机、协议、端口等多种不可达场景。
    • Type=5(重定向)的Code值区分网络、主机及服务类型(TOS),指导源主机更新路由表。
  3. 过时类型
    • Type=4(源抑制)、Type=13/14(时间戳请求/应答)、Type=15/16(信息请求/应答)因技术演进已废弃,实际网络中极少使用。
  4. ICMPv6差异
    • ICMPv6的Type范围更明确(0-127为差错报文,128-255为信息报文),且新增“数据包太大”(Type=2)、“邻居请求/通告”(Type=135/136)等类型,用于IPv6的路径MTU发现和邻居发现。
  5. 安全限制
    • 路由器不会转发ICMP差错报文,避免“差错风暴”。
    • 对广播/组播IP包、非首片分片、ICMP差错报文本身的错误,不会生成新的ICMP差错报文。
http://www.dtcms.com/a/561389.html

相关文章:

  • 网站如何做淘宝客网站做要钱
  • 做公司网站需要什么资料开源手机网站系统
  • 成都网站优化公司哪家好南京哪家网络公司做网站优化好
  • Java 通配符
  • java-learn(9):常见算法,collection框架
  • 海口网站建设维护网校 039 网站建设多少钱
  • 网站建设的频道是什么济南企业网站制作费用
  • 外卖餐饮小程序带商城系统餐桌预定点餐寄存排队等待在线点单程序
  • 广州市公司网站建设价格wordpress播放音乐
  • Onnxruntime源码解析
  • Typescript - type 类型别名(通俗易懂教程)
  • 专业建站lhznkj挂机宝做网站
  • 单位网站建设 管理制度wordpress中文视频插件下载
  • 【ComfyUI】混元3D 2.0 Turbo 多视图生成模型
  • 【SAM】eval_coco.py说明
  • 阜宁网站制作具体报价手机端网页设计尺寸规范
  • 青岛做网站和小程序的公司大连长建个人主页
  • [MySQL] JDBC
  • 从零开始学习Redis(六):Redis最佳实践(使用经验总结)
  • 秦皇岛建设网站西安百度seo代理
  • 备案 几个网站职业生涯规划
  • Ruby CGI Cookie 使用指南
  • 网站建设重要意义西部数码做跳转网站
  • X-plore安卓版(安卓手机文件管理器)
  • 【自然语言处理】基于生成式语言模型GPT
  • 广州网站建设方案案例用ps做网站画布一般建多大
  • 兰州网站搜索排名中国苏州网站
  • 【第二十周】自然语言处理的学习笔记05
  • 集成测试的分类
  • 上海网站建设百度推广公司wordpress 暂停前台访问