今天是数通面试第四篇,我尝试开始使用md的文件来编写我的博客,今天我们来详细的聊一聊ICMP,其实大部分人觉得ICMP就是一个ping命令,没什么细究的,但其实内容十分的丰富就比如说在windows环境下,ping出错有好多回显,今天来我们用抓包的方式深入了解一下ICMP
来自1.1.1.1的回复:无法访问目标主机?
来自2.2.2.2的回复:无法访问目标网络?
来自1.1.1.1的回复:无法访问目标端口?
请求超时?
传输超时?
PING:传输故障。常见故障?
这些常见的错误类型你都知晓原因吗,他们之间的区别是什么呢?
(这些都是基于windows场景下,linux和交换机比如华为的vrp系统的ping命令没有这么细节的报错,并且很多设备配置了不回复ICMP错误)
首先我们来看一下ICMP的位置,他其实是基于IP的,被封装在IP数据包当中
所以通常来讲,我们认为ICMP是一个网络层协议,在IP报头的协议号字段中数值为1,这个协议号通常是用来标识上层协议的,在ip层标识了上层协议icmp,但icmp还是一个网络层协议,这是很容易引起混淆的事情,很多人会把icmp当做4层来看待,这其实是错误的,ICMP消息是作为IP数据报的数据部分发送的,这意味着它们被IP层封装和处理。尽管ICMP用“协议”字段来指示,但它并不是一个传输层协议,因为它不提供两个端系统之间的端到端通信。相反,它用于IP层的错误处理和诊断信息。
总结一下:ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现
ICMP报文其实很简单我们主要关心的就是Type和Code ,他俩共同组合成各种错误信息 ,
这些使我们常见的几个组合,实际上有很多这里不一一列举(实际面试场景中可以会问到,有几种icmp类型,这里tyep+code组合就是一种,比如00类型80类型)。
其中最常见的就是我们的80和00,一个为请求一个为回复,说白了这俩在一起就是ping通了
这说明我们的数据在ICMP层面是可达的,这是我们大家最常用到的ping,但是要注意能ping通就等于网络是通的吗?不一定,能ping通单纯是icmp协议可达不代表其他网络层面可达。我们下面会重点讨论Type为3的错误类型,type等于11的传输超时,以及ICMP重定向type为5的类型
我们都知道IP协议中有一个TTL字段,来声明数据包在网络中传递的最大跳数。每经过一个路由器,数据包的TTL值就减少1。当TTL值减少到0时,该路由器会丢弃该数据包
tracert我们常用的路由跟踪技术就是利用了这个原理ICMP结合TTL,TTL递增1->2->3->4…这样就可以精准的获取每一跳的信息,但是你们日常或者工作过程中去尝试跟踪一个网址,比如百度或者京东,会发现经常再中途会显示超时***这又是为什么呢
其实很简单,就是骨干网设备配置了不回复这个icmp,这种情况下就是传输超时了,具体到设备的命令就是icmp ttl-exceeded drop 来开启这个功能,丢弃ttl=1的报文。
在上面提到了tracert的本质就是ttl递增对于每一台设备来说收到的报文ttl都是1,所以直接丢弃不回复,我们在cmd中看到的现象就是***,同时他也不影响后续报文的转发,因为你需要访问这台设备后面的设备时,此时ttl=2 是不会被丢弃而是正常转发下一跳,同时ttl减1,下一台设备收到时候ttl又等于1了。
总结一下:如果在cmd中看到传输超时的字样一般来说就是TTL为0这种情况 , ICMP的超时错误通告报文的类型字段的值是11,它的code有两种一个是0代表它是TTL超时,另一个是1,代表的是分片重组超时
首先我们明确一个概念 这4个不可达是ICMP层面的组合描述,明确收到设备给我们的回复为30/31/32/33等等,(比如领导让你去做一件事对他来说你无法完成事情有2种情况:
一种就是你明确告知了因为什么失败 这就是有回复Type3消息,另外一种就是领导把任务给你,你直接没反应了石沉大海,这种情况就是请求超时,发送80没有收到任何消息,现网很多骨干网运营商设备都是第二种情况,天命打工人对领导爱答不理,但是领导肯定是希望就算失败了你也得告诉我为什么,当然ICMP也一样)
所以说tyep的信息这和我们在cmd(windows)上看到的信息内容并不完全一致!(可以理解为收到的ICMP的信息类型和CMD回显内容不相关)
我尝试ping一个不再存在的IP,显示无法访问目标主机,但这不是收到了ICMP31主机不可达类型报文,他甚至都没有发送ICMP报文!我后续会详细说明这个现象。
我们继续来聊3类不可达信息,比如说网络不可达30,这种回复通常是中间设备回复的,比如说abc3台设备,a访问c需要经过b,但是b没有c的路由,当a的数据发送到b的时候,b就会回复一个30给a,除了网络,另外主机不可达,端口不可达 都是类似场景,有设备具体给出了回应。
当然这个并不是所有设备都这么好心会告诉你,大部分设备当他发现没有路由时就直接丢包了,此时我们收不到任何回复,这就是请求超时。
所以我们得出一个结论,收到的任何的错误类型都是需要有这个设备存在并回复给我们的,用于告知其遇到了哪些问题的 。那我为什么说cmd的无法访问目标主机其实压根就没有icmp参与呢?
我们来看一下这个现象,windows我本地配置的ipv4地址为3.44
当我去访问2个不存在的地址时为什么cmd回显结果都不一样?因为是2个不存在的地址所以按理说都不会收到任何的回复,2个都是请求超时才是正确的。
因为3.44本机去访问3.99 , 他俩是同网段地址有源mac 源ip目标ip ,少了目标mac ,此时就会触发arp机制,去询问3.99的mac, 但是这个ip是不存在的 压根就没有这个设备,也就是说ICMP压根就没有发送出去,在二层数据链路层时就遇到了问题(缺失目标MAC无法二层封装)
这就是CMD回显, 来自xxxx的回复无法访问目标主机的细节 可以看到压根就没有ICMP的报文
我们再来看看4.99是什么情况,和3.99不同,192.168.4/24明显和3网段不在一起。那么此时就不需要arp了吗? 需要的,3.99此时直接去询问网关的MAC(一般来说都有记录),把包扔给网关,所以说跨网段去ping一个不存在的人,icmp的包是可以发送出去的,这就是为什么一个是请求超时一个是无法访问目标主机的本质原因。
source 3.44 --> dest 4.99 类型一定是80,但是没有人回应00 ,CMD回显就是请求超时
总结一下: 传统的ICMP不可达报文都是设备中间主动回复,有回包。但是windows场景下无法访问目标主机一般就是同网段icmp但是没有arp的情况,请求超时就是ping其他网段但是没有收到回复,这个没有收到回复有很多很多很多种的原因,我下面详细分析一下。
大致类型分三种情况 1.去的路上丢了 2.收到了遇到某些问题而且不想回复你 3.回来的路上丢了
说白了就是只有请求没有回复,但是要注意这个请求超时和不可达完全是2种情况。不可达有回复告知你去不了的,且有个隐藏条件,那就是有路由这个路由指的是windows的路由表
那你可能要说了,windows路由表不都是一条默认路由出去的吗0.0.0.0 /0 什么情况下都会有路由表匹配的呀,但其实不一定,如果你把网卡卸载了或者底层什么原因 网卡挂了 忘记配置网关了(windows网关=默认路由),这种情况下CMD回显就是文章开头的PING:传输故障。常见故障(还有一种情况你ping 的地址就是有问题的比如e类地址,或者0.0.0.0)
我们继续来讨论请求超时可能性
这里提一嘴windwos的防火墙,为什么要把icmp的内容取名字叫文件和打印机共享???
5类型一共有2种分别是针对网络重定向和针对主机重定向
让我们来分析一下这个拓扑的关键,首先pc1的网关一定是1.254 ,1.1访问2.2一定是需要转发给网关去处理的。此时R1发现一个问题我是这个接口收到的,又要从这个接口发出去,这就是设备如何发现非最优路径的背景:同一个端口 同收同发 ,此时他就会给pc1发送一个51类型的icmp重定向报文
明确告知PC1 你直接去找1.253好了 我也是去访问这个地址的,但pc1改不改呢?那得看设备,脾气倔的pc都不会鸟你
再来简单看一下50和51的区别
这两种消息的区别在于它们的应用范围。网络重定向适用于发送到整个网络的所有数据包,而主机重定向只适用于发送到单个主机的数据包。在实际中,现代网络很少使用ICMP重定向消息,因为现代路由协议(如OSPF或BGP)能够动态地管理路由,并且在大多数情况下,主机配置为默认发送所有外部流量到一个默认网关,而不是根据目的地网络或主机来变化其路由。