幽映每白日,清辉照衣裳。这篇文章主要讲述网络世界中的侦察兵----ICMP相关的知识,希望能为你提供帮助。
作者:一天
首发公众号:网络之路博客(ID:NetworkBlog)
?
前言
学习了IP协议后,都知道IP协议本身是不提供可靠性保障的,那么数据包在这么复杂的互联网环境中传输,总会遇到问题,如果遇到问题后,被丢弃、无回应,可能作为工程师的我们来说都不知道发生了什么事,更别提普通用户了,所以数据包发送出去如果被丢弃、或者某些原因造成的不可达,需要一种协议来进行通知原因,这个协议就是这篇要讲解的ICMP。
?
ICMP有啥功能
ICMP全称叫做Internet Control Message Protocol (互联网控制报文协议),主要功能用于确认IP包是否成功抵达目的地、如果中途出现意外,进行报告通知发送者,好让维护人员根据原因得到解决办法。比如IP数据包由于某种原因未能抵达目的地,由于什么原因导致的由ICMP负责通知,这也我们在实际中排错跟测试最常用到的一个协议。
?
?(1)ICMP包格式
1、类型:表示ICMP报文的种类,ICMP的类型有很多
2、代码:在同一个类型中可能有多个组合,用代码来详细区分
3、校验和:校验ICMP的包是否有错误
4、根据类型和代码组合最终的数据内容。
ICMP类型字段,主要分为两大类
由于类型比较多,这里了解几个实际中经常用到的ICMP类型。
查询报文类型回送消息主要用于通信的主机或者网络设备之间,用于判断所发送的数据包是否成功抵达对方的一种消息,我们上一篇用到Ping命令就是使用的这个消息来实现,这里来详细了解下Ping的原理。
用模拟器搭建一个这样的环境(已经用过几次了,这个基本的连线,拖设备应该都会了哈),然后各个PC设置好地址,接入到交换机,全部启动。
开启对应的抓包,来看看icmp的报文的内容
使用PC1去ping一下PC2。
通过过滤只看ICMP的包,发现总共有10个,5个Request ,5个Replay,先来关键字段的内容。
模拟器中PC存在一个小问题,发送的ping是独立的,等于一个包一个独立的标识符,所以抓包看到的有5个不同的标识符,但是在Windows系统里面,一个窗口进程Ping的话,都是相同的标识符的
大家有兴趣的话可以自己电脑用wireshark抓取网卡,然后Ping下看看,上图是博主ping百度,抓包得到的,可以看出来id都是为0x0001,序列号每一组(去跟回都是相同的,每发出一个+1),从窗口回显的内容中还可以得到几个有用的信息
博主经验分享:这个时间怎么去根据数值来判断当前网络的好坏呢?
差错报文类型:(介绍相对比较重要的)目标不可达消息(类型为3)、超时消息(类型为11),这些在排错篇会有详细的演示。
(1)目标不可达消息(Destiantion Unreachable Message)类型3
这个在排错中非常有用,所以这里详细介绍下几个常见的类型,在网络中,发送的数据包有可能中途设备由于策略或者路由等问题无法将IP发送给目的地址,这个时候中途处理的设备会给发送者主机返回一个目标不可达的ICMP消息,这个消息中包含了具体的原因,通过ICMP的不同代码字段来表示。所以,最终发送者主机也可以根据这些代码知道不可达的具体原因,然后呈现在程序对应的窗口中回显出来,提供给管理者人员。
网络不可达代码 0
这个不常用,因为这个代码是在IP分为A、B、C类的时候,路由器通过类别来区分网络号,如果路由表中没有,就以ICMP协议,通告网络不可达(NetworkUnreachable)告诉主机,后面打破了网络分类后,这个代码就很少见了。
主机不可达代码 1
当一个数据包经过三层设备时,通过查询路由表中发现没有该主机的信息(或者主机没有连接到网络),那么会通过ICMP协议,通告主机不可达(HostUnreachable)告诉主机原因。
协议不可达代码 2
某个终端使用TCP协议访问对端主机时,数据包已经抵达目的端了,但是由于目的主机的防火墙禁止了该TCP协议的访问,则目标主机会以ICMP协议,通告协议不可达的原因告诉发送者。
端口不可达代码 3
某个终端访问对端主机的9999端口号访问时,数据包已经抵达目的端了,防火墙也没有限制,但是可能对端主机没有开启对应端口号的服务,所以进程没有去监听这个9999端口号,那么该主机会通过ICMP协议,通告端口不可达来告诉发送者原因。
需要分片,但设置了不分片位代码4
某个终端发送了一个IP数据包,将IP位的分片DF位变成1,如果数据包超过了中途设备能够传输的大小时,由于标志位置一,不能处理则直接丢弃,并且通过ICMP协议通告一个不可达消息类型,代码为4,告诉发送终端。
上面这些就是在实际中经常会遇到的一些报错,可以通过这些代码进行区分,可能目前看着有点不太明白,这个没事,在后续的内容中会多次遇到,当遇到后,我会在提及,这样印象会更加深刻。
?
(2)超时消息(ICMP Time exceeded Message)--类型11在学习IP协议字段的时候,其中一个字段叫做TTL(Time to Live,生存周期),它的值经过一个三层设备就会减1,直到变成0后被丢弃,丢弃的设备会发送一个ICMP超时消息来通知主机,告知该包已经被丢弃。
这个实验有电脑的都可以操作,在CMD里面,ping www.baidu.com -i 1,这个的意思是访问百度TTL设置成1,中间就被丢弃了,因为TTL经过一个三层设备会减去1,这里为1,过了一台就变成0了,可以看到这个值是192.168.255.254返回告诉TTL 传输中过期,这个就是ICMP的超时消息,只是电脑的进程收到以后,把结果回显在了窗口里面。
(3)traceroute在ICMP中除了Ping程序以外,还有一个程序使用率非常频繁,就是traceroute(Linux中是这个命令,在wind中叫做tracert,不同网络设备厂家上面也有点差异),那这个有什么作用呢?
探测经过了哪些设备,记录下地址。
比如博主这台电脑,通过本地抵达百度服务器中间经过的所有设备的IP,这个在实际用处很大,比如A去往B不通,通过tracerroute看是不是走的对应的路径,有可能由于中间设备配置错误,导致它走了其他的线路出去了,这样就判断出来问题了。
它的原理就是利用IP包的生存期限,如上面主机tracertwww.baidu.com的时候主机会发送一个UDP的报文,目标端口号为高端口号(3000以上),并且把IP头部的TTL值改成1,遇到第一个网络设备的时候,变为0了,就会被丢弃,第一个网络设备会返回一个ICMP差错报文,类型是时间超时,比如图上的192.168.255.254就是出口的路由器,这样发送主机就得到了第一台设备的IP地址(入口的)
接下来主机继续发送TTL=2的数据包,这样在经过第二个三层设备的时候就会被丢弃,同时也会返回ICMP的差错报文,主机就知道了第二个路由器的地址,如图上的192.168.1.1,如此的重复,直到到达目的主机。
在图上会发现有请求超时的,这就是中途设备为了安全性关闭了ICMP报文的差错返回信息,这样就得不到信息了。
那么UDP的报文是干嘛用的呢,TTL值已经能够获取到中间设备的地址信息了,这个数据包最终是会抵达目的主机的,当目标主机收到这个UDP的包时,由于自己没有对应的服务,会返回一个端口不可达的ICMP差错报文信息,所以当发送者收到一个端口不可达这样的差错报文时,就知道这个数据包已经抵达目的主机了,否则发送方无法判断是否抵达了目的主机,会一直发送这个包,这样就失去了该功能的作用了。
在Windows主机中实用的命令
可能有的朋友还不知道在Windows中如何使用Ping命令与tracert命令,其实很简单
Ping命令
在CMD里面直接输入ping,其实会显示很多参数
除了经常使用ping ccieh3c.com来测试目标主机是不是可通的,另外一个就是ping ccieh3c.com -t,-t的意思是持续Ping,通常在测试网络稳定性的时候会用到。
Tracert命令
建议使用trcert -d ccieh3c.com, -d的作用是不解析地址的主机名,否则你会发现解析起来非常的慢。
【网络世界中的侦察兵----ICMP】
作者:一天,公众号:网络之路博客(ID:NetworkBlog)。让你的网络之路不在孤单,一起学习,一起成长。
推荐阅读
- DNS域名解析
- VMware中安装Kali一步解决(7z格式)
- 一不小心又踩了feign的坑
- 第三周练习
- dart系列之:还在为编码解码而烦恼吗?用dart试试
- Bootstrap实战 - 瀑布流布局
- Redis | Redis常用命令及示例总结(API)
- disk_lvm.sh
- 简单介绍redis分布式锁解决表单重复提交的问题