🦄 个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁
🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁
感谢点赞和关注 ,每天进步一点点!加油!
目录
一、ICMP协议简介
二、ICMP报文
2.1 ICMP 的主要功能
2.2 报文类型
2.2 差错报文
2.2.1 终点不可达
2.2.2 改变路由(重定向)
2.2.3 超时
2.2.4 参数问题
2.3 查询/信息类报文
2.3.1 回显请求/应答(ping)
2.3.2 时间戳请求和应答
2.4 ICMP报文应用——ping请求测试
2.4.3 ICMP请求和应答
2.4.4 ICMP差错报告报文
一、ICMP协议简介
IP协议本身并没有终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,且没有提供直接的方式来获取诊断信息。为了更有效地转发IP数据报和提高交付成功的机会,在网络层使用了网际控制报文协议ICMP,Internet控制报文协议(Intemet Control Message Protocol, ICMP)是IP协议的一种补充,它与IP协议结合使用,以便提供与IP协议层配置和IP数据包处理相关的诊断和控制信息(IP协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,也没有提供直接的方式来获取诊断信息。)
ICMP通常被认为是IP层的一部分,它是在IP数据报内被封装传输的。
如图所示,在IPv4中,ICMP报文属于IP子协议,协议(Protocal)字段值为1表示该报文携带了ICMPv4。
如图所示,为ICMPv4的报文格式。所有的ICMP报文都以8位的类型(Type)和代码(Code)字段开始,其后的16位校验和(CheckSum)字段涵盖了整个报文。
其中各字段的含义如下:
- 类型(Type):指定 ICMP 报文的类型,占 1 个字节。常见类型有:回显应答(Echo Reply:0)、回显请求(Echo Request:8)等。
- 代码(Code):指定 ICMP 报文的代码,占 1 个字节。用于进一步描述 ICMP 报文,与 Type 字段组合使用。
- 校验和(Checksum):校验和,用于检查 ICMP 报文是否有损坏,占 2 个字节。
- 数据(Data):数据,可变长度。可以是任意数据,长度由具体的 ICMP 报文类型和代码决定。
二、ICMP报文
2.1 ICMP 的主要功能
对于 ICMP 的功能,主要分为两个:
- ICMP 的第一个功能是确认 IP 包是否能够成功到达目标地址,当两个设备进行互联时,其中一个设备发送给另一个设备的 IP 包如果没有到达,就会生成 ICMP 数据包发送给设备共享。
- ICMP 的第二个功能是进行网络诊断,经常使用 ICMP 数据包的两个终端程序是 ping 和 traceroute,traceroute 程序用于显示两台互联网设备之间可能的路径并测量数据包在 IP 网络上的时延。ping 程序是 traceroute 的简化版本,我们经常使用 ping 命令来测试两台设备之间网络是否正常,ping 还可以显示两台设备之间的延迟情况,并准确报告数据包到达目的地并返回后所花费的时间。
参考文章:【Linux】ping命令详解_开着拖拉机回家的博客-CSDN博客
【网络】抓包工具Wireshark下载安装和基本使用教程-CSDN博客
2.2 报文类型
ICMP报文可以分为两大类:
- 差错报文:有关IP数据报传递的ICMP报文(差错报告报文)
- 查询报文:有关信息采集和配置的ICMP报文(询问报文)
常用的ICMP报文类型如下表所示,其中*表示最常见的类型:
在ICMP中,对传入报文的处理随着系统的不同而不同。一般来说,传入的信息类请求将被操作系统自动处理,而差错类报文传递给用户进程或传输层协议。常见的ICMP报文类型:
- Echo Reply(回显应答):用于回复Echo Request(回显请求)报文,通常用于测试网络连接是否正常。
- Echo Request(回显请求):用于测试测试网络连接是否正常。
- Destination Unreachable(目的地不可达):用于指示主机或路由器无法到达目的地或某个网络服务不可用。
- Source Quench(源站抑制):当接收方无法处理所有传入的数据报时,源站抑制报文会发送到发送方,以通知其减慢数据传输速度(一般不被使用)。
- Redirect(重定向):用于通知发送方,其正在使用的路由不再是最佳路由,建议使用另一条路由
- Time Exceeded(时间超时):用于指示一个数据包在传输过程中被丢弃,原因是数据包在经过路由器时超过了其生存时间。
- Parameter Problem(参数问题):用于指示数据包头部中存在错误的参数或选项,导致数据包无法被识别或处理。
- Timestamp Request/Reply(时间戳请求/应答):用于向另一个主机请求当前时间戳,并将其返回给请求方。
- Information Request/Reply(信息请求/应答):用于向另一个主机请求特定信息,并将其返回给请求方。
- Address Mask Request/Reply(地址掩码请求/应答):用于请求另一个主机的网络掩码,并将其返回给请求方。
2.3 差错报文
限制生成ICMP差错报文的原因是限制生成所谓的广播风暴,在这种情况下生成少数的报文就会造成不想要的流量喷流(例如,无限的为响应差错报文而生成差错报文)。
以下情况下不会响应产生ICMPv4差错报文:
- ICMPv4差错报文(但是,响应ICMPv4查询报文可能会产生ICMPv4差错报文)
- 目的地址是IPv4广播地址或IPv4组播地址的数据报
- 作为链路层广播的数据报
- 不是第一个分片的其他分片
- 源地址不是单个主机的数据报。即源地址不能为零地址、环回地址、广播地址或组播地址
ICMP差错报文共有四种,即:
- 终点不可达
- 时间超时
- 参数问题
- 重定向(改变路由)
2.3.1 终点不可达
这种类型的报文用来表示数据报无法送达目的地,由主机或其入站网关生成,用于通知客户端由于某种原因目的地不可达。常用的代码有4个,包括:
- 主机不可达(代码1)
- 端口不可达(代码3)
- 需要分片/指定不用分片(代码4)
- 管理禁止通信(代码13)
ICMPv4目的不可达报文格式如图所示:
具体的细节如下:
- 主机不可达(代码1):这种形式的目的不可达报文是由路由器或者主机产生的,出现在当它被要求是由直接交付方法发送一个IP数据报到一个主机,但由于某些原因无法到达目的地时。
- 管理禁止通信(代码13):这种目的不可达报文能够表明一个管理禁令正阻止到目的地的成功通信。这通常是由一个防火墙故意丢弃流量导致的。
- 端口不可达(代码3):当传入的数据报的目的应用程序还没准备好接受它时,就会生成一个端口不可达报文。
- 需要分片/指定不用分片(代码4):如果一个IPv4路由器收到一个打算转发的数据报,如果数据报大于选定的传出网络接口的最大传输单元(Maximum Transmission Unit,MTU),则数据报需要分片。如果到达的数据报在IP头部中设置了不分片位字段,那么它会被丢弃而不是转发,此时将产生ICMPv4目的不可达(PTB)报文。
2.3.2 改变路由(重定向)
假如一个路由器收到一个来自主机的数据报,并确定自身并不是主机将数据报投递到目的地的对应下一跳,则该路由器发送一个重定向报文到主机并将该报文发送到正确的路由器(或主机),这个ICMP 重定向消息包含了最合适的路由信息和源数据。也就是说,如果它能够确定给定的数据报存在一个比自己更好的下一跳路由,它就向主机发送重定向报文使其更新转发表,这样以后目的地一样的流量就会被定向到新的节点中。
ICMPv4重定向报文格式如图所示:
路由器会通过这样的 ICMP 消息给发送端主机一个更合适的发送路由。
主机 Host 的 IP 地址为 10.0.0.100。主机的路由表中有一个默认路由条目,指向路由器 G1 的 IP 地址 10.0.0.1 作为默认网关。路由器 G1 在将数据包转发到目的网络 X 时,会使用路由器 G2 的 IP 地址 10.0.0.2 作为下一跳。
当主机向目的网络 X 发送数据包时,会发生以下情况:
- IP 地址为 10.0.0.1 的网关 G1 在其所连接的网络上接收来自 10.0.0.100 的数据包。
- 网关 G1 检查其路由表,并在通往数据包目的网络 X 的路由中获取下一个网关 G2 的 IP 地址 10.0.0.2。
- 如果 G2 和 IP 数据包的源地址标识的主机位于同一网络中(也就是 Host 主机),那么 G1 会向主机发送 ICMP 重定向消息。ICMP 重定向消息建议主机直接将发送到网络 X 的数据包发送至 G2,因为 Host - G2 这是通往目的地的较短路径。
- 网关 G1 将原始数据包转发到其目的地。
当然,根据主机的配置,Host 主机也可以选择忽略 G1 给它发送的 ICMP 重定向消息。但是,这样就享受不到 ICMP 重定向带来的两大好处,即
- 优化数据在网络中的转发路径;流量更快到达目的地
- 降低网络资源利用率,例如带宽和路由器 CPU 负载
如果 Host 主机采用了 ICMP 提供的重定向路径的话,那么 Host 就会直接把数据包发送至网络 X,如下图所示:
在主机为 G2 作为下一跳的网络 X 创建路由缓存条目后,这些优势在网络中可见:
- 交换机和路由器 G1 之间链路的带宽利用率在两个方向上都会降低。
- 由于从主机到网络 X 的流量不再流经此节点,因此路由器 G1 的 CPU 使用率降低。
- 主机和网络 X 之间的端到端网络延迟得到改善。(引用)
2.3.3 超时
每个IPv4数据报在头部中都有一个生存周期(TTL)字段,当由于TTL或跳数限制字段值太小(即到达值为1或0,且必须转发)致使路由器丢弃报文时,会产生ICMP超时(代码0)报文。
推荐一款比较好用的追踪超时消息的工具 traceroute
2.3.4 参数问题
当一个主机或者路由器接收到一个IP数据报,其IP头部存在不可修复的问题时便会产生一个ICMP参数问题报文。在ICMPv4中,当头部中某个字段超过可接受范围导致了一个错误时,一个特殊的ICMP差错报文指针(Pointer)字段指示了错误字段相对于出错IP头部的偏移值。
例如,指针字段值为1表示一个错误的IPv4 DS字段或ECN字段或者ToS字段。
代码0时ICMP参数问题报文最为常见的变体,可用于IPv4头部中出现的任何问题。代码1以前被用于指示数据包中缺少例如安全标志之类的选项,目前已经不使用了。代码2用来指示存在一个损坏了的IHL或者总长度字段值。
2.4 查询/信息类报文
尽管ICMP定义了一定数量的查询报文,但是许多功能都已经被其他特殊目的的协议所替代。唯一保存下来的广泛使用的ICMP查询/信息类报文是回显请求/应答报文,通常称为ping,以及路由器发现报文。
2.4.1 回显请求/应答(ping)
一种最为常用的ICMP报文对就是回显请求和回显应答。在ICMPv4中,其类型分别是8和0。ICMP的回显请求报文大小几乎是任意的(受限于最终封装的IP数据报的大小)。收到ICMP回显请求报文后,ICMP的实现要求将任何接收到的数据返回给发送者。即使涉及多个IP分片。其报文格式如下:
与其他ICMP查询/信息类报文一样,服务器必须在回复中包含标识符和序列号字段。
在ping的实现中将ICMP报文的标识符字段设置为某个数,发送主机能够利用它来分离返回的应答。在基于UNIX的系统中,例如,发送进程的进程ID通常被放置在标识符字段。如果由多个ping在同一台主机同时运行的话,这样将允许ping应用程序识别返回的应答,因为ICMP协议不像传输层协议那样有端口号。当涉及防火墙行为时,这个字段通常被称为查询标识符字段。
当一个新的ping实例运行时,序列号字段从0开始,并且每发送一个回显请求报文便增加1。ping打印出每个返回的数据包的序列号,方便用户查看数据包是否丢失、重排或者重复了。
2.4.2 时间戳请求和应答
ICMP时间戳请求报文是请求某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1990年1月1日起到当前时刻一共有多少秒。时间戳请求和回答可用于时钟同步和时间测量。在ICMPv4中,其类型分别是13和14。
2.4 ICMP报文应用——ping请求测试
参考文章:【Linux】ping命令详解_开着拖拉机回家的博客-CSDN博客
【网络】抓包工具Wireshark下载安装和基本使用教程-CSDN博客
2.4.3 ICMP请求和应答
在 Wireshark 的数据包界面中输入显示过滤器并执行,我们选择 ping 百度:
用户可以在框框中输入显示过滤器,进行数据查找,也可以根据协议过滤数据包,我输入 ip.addr == 110.242.68.3,然后开始捕获,在开始ping 百度,输出如下捕获到的信息:
ICMP回显请求报文
ICMP回显请求报文
Linux 使用tcpdump命令也可以抓取到 icmp协议 ping的请求
2.4.4 ICMP差错报告报文
TTL过期差错报告报文
命令指定TTL值为5,也就是通过5个路由器后,TTL会变成0,数据包丢弃,路由器发送ICMP TTL过期报文给源主机。
ping www.baidu.com -i 5 -t
ICMP TTL过期报文
TCP/IP详解卷:协议 第八章简要总结 - buguoliujibugaiming - 博客园
网络ICMP 协议详解_icmp协议_白话机器学习的博客-CSDN博客
【网络】抓包工具Wireshark下载安装和基本使用教程-CSDN博客