ICMP协议分析

发布时间 2024-01-03 11:27:40作者: 奶茶加盐

一、ICMP概述

1.ICMP应用场景

Ping

Ping程序是最常见的用于检测IPv4和IPv6网络设备是否可达的调试手段,它使用ICMP的echo信息来确定:

  • 远程设备是否可达;
  • 与远程主机通信的来回旅程(round-trip)的延迟;
  • 报文包的丢失情况。

Tracert

Tracert程序主要用于查看数据包从源端到目的端的路径信息,从而检查网络连接是否可用。当网络出现故障时,用户可以使用该命令定位故障点。

Tracert利用ICMP超时信息和目的不可达信息来确定从一个主机到网络上其他主机的路由,并显示IP网络中每一跳的延迟(这里的延迟是指:分组从信息源发送到目的地所需的时间,延迟也分为许多的种类——传播延迟、传输延迟、处理延迟、排队延迟等)。

2.ICMP报文格式

ICMP没有一个统一的报文格式,而是根据类型和代码字段来区分不同类型的ICMP报文,不同类型和代码对应有不同的内容。

尽管不同类型的报文字段不相同,但ICMP报文在首部内容上是一致的,即前4个字节的类型代码校验和三个字段是统一的。

Snipaste_2023-10-18_10-52-26

image-20231018112641614

image-20231018105152902

3.ICMP报文类型

ICMP报文分为两大类:差错报告查询报文

image-20231018112917512

image-20231018112937629

二、ICMP差错报告

1.ICMP差错报告的特点

  • 只报告差错,但不负责纠正错误,纠错工作留给高层协议去处理。

  • 发现出错的设备只向信源报告差错。

  • 差错报告作为一般数据传输,不享受特别优先权和可靠性。

  • 产生ICMP差错报告的同时,会丢弃出错的IP数据报。

需要注意的是,下列情况下将不会产生ICMP 差错报文。

  • 在 对ICMP差错报文进行响应时,永远不会生成另一份ICMP 差错报文(也就是差错报文出现差错时不会再产生一份差错报文)。但ICMP查询报文可以产生ICMP差错。

  • 广播或多播的IP数据报。

  • 作为链路层广播的数据报。

  • 不是IP分片的第一片。ICMP 差错报文只针对数据报的第一个分片 , 后续分片就不发送 ICMP 差错报告报文了 。

  • 源地址是零、环回地址、广播或多播地址。(就是无法根据源地址确定源主机吧?)

2.ICMP 差错报文的形成

当发送一份ICMP 差错报文时,报文始终包含产生ICMP差错的IP报文的首部和IP报文中数据的前8个字节。这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议 (根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在IP 数据报前8个字节 中的TCP 或 UDP 报文首部中的TCP 或 UDP 端口号来判断)联系起来,进而可以进行针对性的处理。

① 取出 IP 数据报内容 : 取出IP 数据报首部 , 以及数据部分的前8字节 ;

② ICMP 差错报文 组成 : ICMP 前 8 88 个字节 + IP数据报首部 + IP数据报数据部分前8字节 ;

③ 组装 IP 数据报 : 将 ICMP数据报装入IP数据报数据部分 ;

其实这里的IP数据报的前8个字节就是出错的ICMP数据报的首部部分。

image-20231022214613558

3.ICMP 五种差错报告报文

① 目的不可达报文 : 路由器 /主机不能交付数据报时 , 就会向源点发送目的不可达报文 ;

② 源点抑制报文 : 路由器 / 主机 拥塞 , 丢弃 IP 数据报 , 向源点发送源点抑制报文 , 让源点降低发送速率 ;

③ 时间超过报文 :

生存周期为0: 路由器 生存周期 TTL = 0 00 时 , 丢弃该报文 , 同时向源点发送 时间超过报文 ;
分组丢失 : 终点 在预定时间内 没有收到 数据报的全部数据分组时 , 就会将已收到的数据分组全部丢弃 , 向源点发送时间超过报文 ;
④ 参数问题报文 : 路由器 / 主机 收到的 数据报 首部 字段由错误值 , 丢弃该数据报 , 向源点发送 参数问题报文 ;

⑤ 改变路由报文 : 路由器将改变路由报文发送给主机 , 让主机下次将数据报发送给另外的路由器 ; 又称为 “重定向报文” ;

(1)目的不可达

目的不可达的类型为3,代码字段含义如下:

image-20231022220331341

(2)时间超时

在 Internet网络中,为了防止出现路由循环,TCP/IP 采取了两个措施, 一个是每个 IP 数据报的报头设置 TTL(Time To Live,生存时间)域,第二是对分片数据报采用定时器计数。

一旦报文的定时时间到,网关或信宿机都 要立即抛弃本数据报并向信源机发送 ICMP 时间超时报告,网络上所有的路由器都不会转 发超时的报文。

时间超时的类型为11。代码为0时代表TTL超时错误,代码为1时代表分片重组超时

(3)参数问题

参数问题主要是用于指示在入站数据包的IP 首部的数据或者 IP 选项的数据发生了某 些问题,网关或主机不得不抛弃数据报时,将会向源主机发送参数错误的ICMP 报文。

不过ICMP 参数问题差错报文的功能很弱,仅能够指出报文首部中引起故障的字节,对 一些模糊的问题进行表述,一般都还需要进一步的处理。

(4)源站抑制

也叫源抑制,是指通过向相应的信源发送ICMP源抑制报文,信源根据收到的源抑制报 文中所带的先前发出的 IP 数据报的首部信息,决定对去往某一特定信宿的信息流进行抑制,通常是减缓信源发出数据报的速率,以实现拥塞控制。

当网关检测草某条线路发生拥塞事,立即想相应的信源发送ICMP源抑制报文;信源收到源抑制报文后 ,就会降低发往某信宿的数据报速率。拥塞解除后,主机自行恢复数据传输速率,与ICMP无关。

源抑制报文类型为4,码值只有一个为0。

(5)路由重定向

路由重定向差错是指通过路由器发送重定向报文,网络上主机中的路由表也可以得到更新。

当主机的下一跳收到数据报时,会根据自己的路由表判断本路由器是否是去往信宿的最佳路由,若不是,则仍然将数据转发给信宿,同时向主句发送ICMP重定向报文,通知信源主机更改它的路由表。重定向报文给是如下图:

image-20231022225607793

报文中目的路由器的IP地址就是去往信宿的最佳下一跳路由器的IP地址。

ICMP 重定向报文类型为5,代码有4个可选值,即0~3,其中0和2与网络重定向有关,1表示主机重定向,3表示对服务类型和主机重定向。

五、ICMP查询报文

什么是可靠协议与不可靠协议

序号:如果一个协议有序号字段,说明它具有成为可靠协议的潜力。

可靠协议:本协议出错,本协议负责纠错。

不可靠协议:本协议出错,自己不负责纠错。

ICMP实验

1.ICMP回显查询报文

(1)产生数据

先打开Wireshark捕捉器捕捉数据包,然后使用ping命令测试主机与www.baidu.com的连通性。

image-20231023081813288

(2)分析捕获结果

在Wireshark软件中将捕获结果中的ICMP数据包过滤出来。

image-20231023082057591

请求报文:

image-20231023083658432

应答报文:

image-20231023084227778

一对请求与应答报文,它们的序号是相同的。

2.ICMP差错报文

(1)产生数据

先打开捕捉器捕捉数据包,再使用tracert命令追踪一个分组从源点到终点的路径。

image-20231023085935270

(2)分析捕获结果

超时的请求报文:序号为2377

image-20231023091240947

时间超时报文:

这个报文是对上面的那个序号为2377的请求报文的差错报文。

结合各字段含义可以知道:序号2377的报文因为TTL超时(代码为0),所以产生了这个差错报告报文像源主机报告。

image-20231023092213374

目的不可达报文:

image-20231023093519400

需要学习的内容

交换机路由表的建立

tracert命令实验

每个路由器发三次ICMP,有三个时延