前言
ICMP位于网络层中,在其网络层中子层等级高于IP协议,所以在进行数据封装的时候,先进行ICMP封装再进行IP封装。
ICMP协议的功能
ICMP包含了两种消息,ICMP echo request(ICMP回显请求)和ICMP echo Reply(ICMP回显应答)和包含了两种功能,一种是我们熟悉的Ping功能,还有一种就是Tracert功能。
Ping功能
对于Ping功能来说,主要是利用了ICMP协议的两种消息进行对目标主机之间的连通性进行测试,以及通过不同不同消息回复来判断在连通路径上哪里出现问题。
基本流程
可以通信
源主机会向目的主机发送一个ICMP echo request消息,默认情况下会发送5个消息,但这个次数可以通过ping命令进行修改,如果到达目的主机是可达的,那么在接受到ICMP echo request消息后会回复一个ICMP echo reply消息,其中identifier标识符和sequence number是一模一样的。
源主机收到ICMP echo reply消息后,会显示出目的设备的IP地址,identifier和sequence number,以及time值(从发送到接收总共用的时间),TTL值(回应设备到源主机的值)
不可以通信
如果说,消息报文不可达或者是等待超时了,都会显示ICMP错误信息。
典型的有以下几种
第一种,输入的目标IP是不合法的IP地址(如输入IP不全),会显示Host Unreachable(主机不可达)
第二种,输入的目标IP地址找不到,会显示destination host unknown(目的主机未知)
第三种,路由不可达,会显示network unreachable(网络不可达)
第四种,没有在规定时间内收到ICMP echo reply就会显示request timedout(请求超时)
我们就可以通过对应的反馈信息,知道是什么问题。进行故障排查
Tracert功能
该功能利用IP报文中的TTL值超时会发送ICMP echo Reply 错我消息的特点,在IP报文中将TTL值从1开始设置,向目的报文发送一个ICMP echo Request消息,当到达某一挑由于TTl值超时,不会向下继续传输,所以就会给主机发送一个time-to-live execeeded“ICMP echo reply”错误消息,如果没有收到某一跳的ICMP echo reply消息,说明这一跳和上一跳是不可达的,就会用*来标示。管理员就可以找到对应的故障点了,默认情况下每一跳会进行3次测试。
实验
第一步,配置环境
按照图片配置好环境,3台路由器,2台pc主机
第二步,配置两台主机
这里两台主机的IP地址可以随便配,但是要和网关在同一个网段下。
第三步,配置路由器
首先,配置AR1
system-view
sysname AR1
interface gigabitethernet 0/0/0
ip address 192.168.1.1 24
interface gigabitethernet 0/0/1
ip address 10.1.1.1 30
ip route-static 192.168.10.1 24 10.1.1.2
quit
第二,配置AR2
system-view
sysname AR2
interface gigabitethernet 0/0/0
ip address 10.1.1.2 30
interface gigabitethernet 0/0/1
ip address 10.1.2.1 30
ip route-static 192.168.1.1 24 10.1.1.1
ip route-static 192.168.10.1 24 10.1.2.2
第三,配置AR3
system-view
sysname AR3
interface gigabitethernet 0/0/0
ip address 10.1.2.2 30
interface gigabitethernet 0/0/1
ip address 192.168.10.1 24
ip route-static 192.168.1.1 24 10.1.2.1
Ping实验分析
准备工作
主机A向主机B发送ICMP报文的时候,由于是第一个进行通信,所以在主机和路由器以及路由器之间会进行先进行ARP协议获取对方的MAC地址,然后再进行ICMP报文的发送。
这是主机A和路由器AR1之间的ARP请求通信。
这是路由器AR1和AR2之间的ARP请求通信。
其他的设备之间也一样,这里就不多进行截图了。
正式发送ICMP包
ping超时
由图片我们可以看到,在ping实验的前3次中,都显示的是request timeout,响应超时,而后面两次ping又成功了。
原因是在第一次ping的时候,各台设备之间都不知道对方的MAC地址。
所以当主机A先发送ARP报文询问到AR1的MAC地址后,就立马发送一个ICMP的ping包,但是对于AR1来说,他也同时需要发送ARP请求给AR2询问mac地址,AR2又要向AR3询问,AR3向主机B询问,这样一来一回都需要时间,最后就会导致前3次ping超时。
对于超时的,wireshark来说就会显示No response seen(没有见到响应)
ping成功的包
我们可以看到,发送出去的ping包中Identifer和sequence Number中两个字段的值是一模一样,且回应包中会有time值,这个值是包含了发出去和接收这一整个过程所花费的时间。
我们可以看到在响应包中的type和code的值是0,可以判断出这是一个ICMP echo reply包。
响应包
ping错误的地址
当我们ping的是网络中不存在的地址时
我们可以看到显示的是,目标主机不可达。
ping非法ip
我们会看到显示主机 xxxxx 不可达。
ping路由不通的IP
我们会看到请求超时,
超时的原因也很简单,因为192.168.10.15是在192.168.10.1这个网段下的,但是这个网段下只有192.168.10.1和192.168.10.10这两个ip没有15的存在,所以当AR3收到这个报文后就会泛洪出去,因为没有这个地址,所以这个消息就会被忽略没有回应,就会导致超时。
Tracert功能
我们从命令行中,可以看到从主机a一直到主机b之间每一跳的IP地址以及每一次测试的回应时间,可以看到在第四次有一次超时。
分析数据包
我们可以看到这是第一跳,访问AR1路由器的包,可以看到在ip报文中TTL值为1,在ICMP报文中显示没有收到回应,这是因为TTL值为1,在被AR1路由器收到后,TTL值减一,当TTL值变为0的时候,这个报文就失去意义,所以没有回应报文。