ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文)

2023-12-16 05:30

本文主要是介绍ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

ICMP协议

ICMP报文格式

ICMP回显请求/应答报文

ICMP差错报文

ICMP 宿主机不可达差错报文

ICMP 重定向差错报文

ICMP TTL超时差错报文


ICMP协议

ICMP协议的作用

ICMP(Internet Control massage protocol)因特网控制协议,主要用来在网络设备间传递各种差错、控制和查询等消息(在收集网络信息、诊断、排查故障等方面具有重要的作用)

ICMP是网络层协议,协议号为1

为什么需要ICMP差错报文

IP协议的缺点

1、IP协议没有差错报文或差错纠正机制

2、IP协议缺少一种为主机和管理查询的基址

所以ICMP协议就是为了补充IP协议的这两个缺点而设计的,配合IP协议使用

ICMP报文格式

通过Type和Code定义ICMP的报文类型

ICMP报文主要分为查询报文和差错报文两大类

查询报文:主要用于在主机和路由器之间传输控制信息,也用来探测网络连通性和路径等信息

差错报文:用于报告数据传输过程中的错误

Type

Code

描述

 

0

0

回显应答(ping应答)

查询报文

8

请求回显(ping请求)

9

路由器通告

10

路由器请求

13

时间戳请求(目前已不使用)

14

时间戳应答(目前已不使用)

15

信息请求(目前已不使用)

16

信息应答(目前已不使用)

17

地址掩码请求

18

地址掩码应答

3(目的不可达报文)

0

网络不可达

差错报文

1

主机不可达

2

协议不可达

3

端口不可达

6

目的网络不认识

7

目的主机不认识

9

目的网络被强制禁止

10

目的主机被强制隔离

11

由于TOS,网络不可达

12

由于TOS,主机不可达

13

由于过滤,通信被强制禁止

4(源抑制报文)

0

源端被关闭

5(ICMP重定向报文)

0

对网络重定向

1

对主机重定向

2

对服务类型和网络重定向

3

对服务类型和主机重定向

11(TTL为0报文)

0

传输期间生存时间为0

1

在数据报组装期间生存时间为0

12(报文格式问题)

0

坏的IP首部

1

缺少必须的选项

ICMP回显请求/应答报文

作用

通过ping工具发送ICMP回显请求消息探测网络的连通性(对端回应ICMP回显应答请求)

通过tracert工具发送ICMP回显请求来探测去往某目的网路的路径信息(修改ICMP回显请请求的TTL的值,通过对端回应的Type为11的ICMP差错报文来得到路径信息)

报文格式

Type

8为请求

0为应答

Identifier

标识符,标识ICMP该回显应答对应的是哪个回显请求(通过该字段使得请求和应答一一对应)

BE和LE是通过不同的编码格式得到的值,解码后的信息都是一样的

可以理解为BE是针对于windows系统的编码格式,LE是针对于Linux系统的编码格式

Sequence Number

序列号,发送报文的序列号,每次发送序列号就+1

Data

可选,包含要发送的数据(回显应答通常返回与回显请求所收到的数据相同)

ping命令

通过发送Internet控制消息协议(ICMP)验证与其他TCP/IP计算机的IP级连接回显请求消息

Ping的错误提示

无法解析域名(查询不到该域名对应的IP地址)

是否配置DNS服务器地址

检查是否能够该访问DNS服务器

如果是内网的DNS服务器,可能是DNS服务器没有该域名对应的记录(也有可能是该域名不存在)

请求超时(我们的ping报文到达了对端,但是目标没有回应)

目标主机禁止ping服务(可能防火墙将ping服务限制了)

该IP地址不存在

传输失败

可能是我们主机网卡的问题

无法访问目标网络(一般是访问不同网段会出现此情况,表示我们的报文没有发给网关)

本地没有关于网关的ARP表项,检查网关地址是否正确

Ping网关是否能够通信(不能的话再去深入检查)

tracert命令(Windows的命令--Linux对应的命令为traceroute)

tracert是通过试图以最小的TTL发出ICMP探测包,然后监听回应的ICMP的应答,依次来跟踪获取到数据包到达目的主机所经过的网关(发送数据包的大小默认为32字节)

Linux网络配置与网络信息查看讲解(网卡基本配置、网卡会话配置、网卡绑定、主机名配置、路由配置)_linux网卡配置-CSDN博客

ICMP差错报文

ICMP差错报文都有一个的字段(IP头部+原始数据包的前64 bits)

该字段的内容包含出错数据包的IP头部以及出错数据包的前64位数据(端口号、序列号、其它协议报文头部等)

该字段的作用就是将产生该错误的报文附带在差错报文中,当管理员看到差错报文时知道是什么原因产生的错误,有利于排查错误

以下情况不会产生ICMP差错报文

1、对于携带ICMP差错报文的数据包,不会在产生ICMP差错报文

2、对于分片的数据包,如果不是第一个分片,则不会产生ICMP差错报文

3、对于具有组播地址的数据报文,不会产生ICMP差错报文

4、对于具有特殊地址的数据报文(如127.0.0.0和0.0.0.0),不会产生ICMP差错报文

ICMP 宿主机不可达差错报文

一般是本地没有去往报文目的IP地址的路由,就会向报文的源IP地址回应ICMP差错报文(宿主机不可达)

网络不可达差错报文(当路由器上没有去往目的网段的路由时就会发送网络不可达差错报文)

从数据包中可以看出来

  1. 当ICMP Echo Request报文到达192.168.10.254这台设备时
  2. 这台设备(10.254)发现自己没有去往该报文目的地址100.0.0.1的路由
  3. 此时这台设备(10.254)就发送ICMP差错报文-网络不可达消息给ICMP Echo Request报文的源IP地址(10.129)

端口不可达IP报文(一般在tracert跟踪路由场景下会出现此差错报文)

Tracert主要是用来跟踪路径,在跟踪路径的过程中如果某个路由器或目标主机上的应用程序没有在相应的端口上监听,此时收到ICMP回显请求时会回应端口不可达的ICMP差错报文、或者当网络管理员阻止了ICMP回显请求时也会发送端口不可达的ICMP差错报文(端口不可达信息不止因为Tracert产生,还会因为其它操作产生,只是Tracert是比较常见的)

从数据包中可以看出来

  1. 当172.22.105.211访问172.22.105.254的137端口时
  2. 这台设备(105.254)发现自己并没有开启该端口的监听(或者拒绝接收ICMP回显请求)
  3. 此时这台设备(105.254)就发送ICMP差错报文-端口不可达消息给172.22.105.211

ICMP 重定向差错报文

产生重定向报文的场景

1、从一个接口接收到的报文再从同一个接口发出去,一般就会产生ICMP重定向(不一定是环路)

2、当设备从某个接口收到发往远程网络的数据时,发现源IP地址与下一跳属于同一网段时也会产生ICMP重定向

ICMP重定向报文的作用

当主机收到ICMP重定向差错报文后,会将自己去往目的IP地址(该目的IP地址为ICMP差错报文中携带的IP头部的目的IP地址)的网关设置为该地址

即ICMP重定向报文会通知该主机修改自身的路由表(将去往目的IP地址的下一跳修改为ICMP重定向报文携带的最佳下一跳的IP地址)

报文格式

从数据包中可以看出来

  1. 当192.168.10.129这台设备去访问192.168.10.1时,将此数据包发给了192.168.10.254
  2. 此时192.168.10.254发现自身去往192.168.10.1的下一跳接口为自己接收此报文的入接口,并且也发现源IP10.129与目的IP10.1为同一网段
  3. 此时10.254这台设备就认为10.129可以直接去往10.1
  4. 于是10.254就向10.129发送ICMP重定向报文(Gateway字段设置为10.1),让10.129访问10.1可以直接将报文交给10.1,不需要再交给自己

ICMP TTL超时差错报文

当IP数据包在传输过程,在还没有到达目的IP地址的时候IP层的TTL变为0(路由器收到时为1的报文就会认为TTL超时),此时该路由器就会发送ICMP差错超时报文(Tracert就是通过差错报文来跟踪路径的)

报文格式

从数据包中可以看出来

  1. 当172.22.105.211这台设备去访问1.1.1.1,封装数据包
  2. 当172.22.105.254收到该数据包是发现该报文的TTL为1,但是本设备又不是报文的目的地址
  3. 于是105.254就向105.211发送ICMP TTL超时报文,让其增加TTL值

这篇关于ICMP协议以及报文讲解(ICMP查询报文、ICMP差错报文)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499267

相关文章

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、