🦄?个人主页——🎐开着拖拉机回家_Linux,大数据运维-CSDN博客?🎐?🍁
🪁🍁🪁🍁🪁🍁🪁🍁?🪁🍁🪁🍁🪁🍁🪁?🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁
感谢点赞和关注 ,每天进步一点点!加油!
目录
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)字段涵盖了整个报文。
其中各字段的含义如下:
对于 ICMP 的功能,主要分为两个:
参考文章:【Linux】ping命令详解_开着拖拉机回家的博客-CSDN博客
【网络】抓包工具Wireshark下载安装和基本使用教程-CSDN博客
ICMP报文可以分为两大类:
常用的ICMP报文类型如下表所示,其中*表示最常见的类型:
在ICMP中,对传入报文的处理随着系统的不同而不同。一般来说,传入的信息类请求将被操作系统自动处理,而差错类报文传递给用户进程或传输层协议。常见的ICMP报文类型:
限制生成ICMP差错报文的原因是限制生成所谓的广播风暴,在这种情况下生成少数的报文就会造成不想要的流量喷流(例如,无限的为响应差错报文而生成差错报文)。
以下情况下不会响应产生ICMPv4差错报文:
ICMP差错报文共有四种,即:
这种类型的报文用来表示数据报无法送达目的地,由主机或其入站网关生成,用于通知客户端由于某种原因目的地不可达。常用的代码有4个,包括:
ICMPv4目的不可达报文格式如图所示:
具体的细节如下:
假如一个路由器收到一个来自主机的数据报,并确定自身并不是主机将数据报投递到目的地的对应下一跳,则该路由器发送一个重定向报文到主机并将该报文发送到正确的路由器(或主机),这个ICMP 重定向消息包含了最合适的路由信息和源数据。也就是说,如果它能够确定给定的数据报存在一个比自己更好的下一跳路由,它就向主机发送重定向报文使其更新转发表,这样以后目的地一样的流量就会被定向到新的节点中。
ICMPv4重定向报文格式如图所示:
路由器会通过这样的 ICMP 消息给发送端主机一个更合适的发送路由。
主机 Host 的 IP 地址为 10.0.0.100。主机的路由表中有一个默认路由条目,指向路由器 G1 的 IP 地址 10.0.0.1 作为默认网关。路由器 G1 在将数据包转发到目的网络 X 时,会使用路由器 G2 的 IP 地址 10.0.0.2 作为下一跳。
当主机向目的网络 X 发送数据包时,会发生以下情况:
当然,根据主机的配置,Host 主机也可以选择忽略 G1 给它发送的 ICMP 重定向消息。但是,这样就享受不到 ICMP 重定向带来的两大好处,即
如果 Host 主机采用了 ICMP 提供的重定向路径的话,那么 Host 就会直接把数据包发送至网络 X,如下图所示:
在主机为 G2 作为下一跳的网络 X 创建路由缓存条目后,这些优势在网络中可见:
每个IPv4数据报在头部中都有一个生存周期(TTL)字段,当由于TTL或跳数限制字段值太小(即到达值为1或0,且必须转发)致使路由器丢弃报文时,会产生ICMP超时(代码0)报文。
推荐一款比较好用的追踪超时消息的工具 traceroute
当一个主机或者路由器接收到一个IP数据报,其IP头部存在不可修复的问题时便会产生一个ICMP参数问题报文。在ICMPv4中,当头部中某个字段超过可接受范围导致了一个错误时,一个特殊的ICMP差错报文指针(Pointer)字段指示了错误字段相对于出错IP头部的偏移值。
例如,指针字段值为1表示一个错误的IPv4 DS字段或ECN字段或者ToS字段。
代码0时ICMP参数问题报文最为常见的变体,可用于IPv4头部中出现的任何问题。代码1以前被用于指示数据包中缺少例如安全标志之类的选项,目前已经不使用了。代码2用来指示存在一个损坏了的IHL或者总长度字段值。
尽管ICMP定义了一定数量的查询报文,但是许多功能都已经被其他特殊目的的协议所替代。唯一保存下来的广泛使用的ICMP查询/信息类报文是回显请求/应答报文,通常称为ping,以及路由器发现报文。
一种最为常用的ICMP报文对就是回显请求和回显应答。在ICMPv4中,其类型分别是8和0。ICMP的回显请求报文大小几乎是任意的(受限于最终封装的IP数据报的大小)。收到ICMP回显请求报文后,ICMP的实现要求将任何接收到的数据返回给发送者。即使涉及多个IP分片。其报文格式如下:
与其他ICMP查询/信息类报文一样,服务器必须在回复中包含标识符和序列号字段。
在ping的实现中将ICMP报文的标识符字段设置为某个数,发送主机能够利用它来分离返回的应答。在基于UNIX的系统中,例如,发送进程的进程ID通常被放置在标识符字段。如果由多个ping在同一台主机同时运行的话,这样将允许ping应用程序识别返回的应答,因为ICMP协议不像传输层协议那样有端口号。当涉及防火墙行为时,这个字段通常被称为查询标识符字段。
当一个新的ping实例运行时,序列号字段从0开始,并且每发送一个回显请求报文便增加1。ping打印出每个返回的数据包的序列号,方便用户查看数据包是否丢失、重排或者重复了。
ICMP时间戳请求报文是请求某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1990年1月1日起到当前时刻一共有多少秒。时间戳请求和回答可用于时钟同步和时间测量。在ICMPv4中,其类型分别是13和14。
参考文章:【Linux】ping命令详解_开着拖拉机回家的博客-CSDN博客
【网络】抓包工具Wireshark下载安装和基本使用教程-CSDN博客
在 Wireshark 的数据包界面中输入显示过滤器并执行,我们选择 ping 百度:
用户可以在框框中输入显示过滤器,进行数据查找,也可以根据协议过滤数据包,我输入 ip.addr == 110.242.68.3,然后开始捕获,在开始ping 百度,输出如下捕获到的信息:
ICMP回显请求报文
ICMP回显请求报文
Linux 使用tcpdump命令也可以抓取到 icmp协议 ping的请求
TTL过期差错报告报文
命令指定TTL值为5,也就是通过5个路由器后,TTL会变成0,数据包丢弃,路由器发送ICMP TTL过期报文给源主机。
ping www.baidu.com -i 5 -t
ICMP TTL过期报文
TCP/IP详解卷:协议 第八章简要总结 - buguoliujibugaiming - 博客园