1、ICMP简介

ICMP<Internet Control Message Protocol,互联网控制信息协议>,用于实现IP网络层的连通性测试和差错报告。常用的Ping程序和Tracert程序便是基于ICMP协议进行开发的。

2、ICMP分组

ICMP协议根据类型值和代码值的组合,有非常多的分组类型,常用的ICMP分组有请求回显、回显应答、网络不可达、端口不可达、生存时间超时等。不同的ICMP分组应用在不同的环境,例如当采用Ping程序测试连通性时,则调用请求回显和回显应答分组,当采用Tracert程序时,则调用生存时间超时或端口不可达分组。
3、Ping原理

Ping程序是应用非常广泛,用于实现连通性测试的工具,以下图示解释了Ping的工作原理,如图=>

 

从上图可以看到,PC1在测试本地到PC2的连通性,所以向PC2发送ICMP的请求回显分组,PC2收到请求之后,向PC1发送回显应答分组,此时PC1便可以得知PC2“在那里”。若PC1没有收到回显应答分组,则说明PC1与PC2链路有故障,如图=>

4、Tracert原理

Tracert程序也是应用非常广泛,用于实现链路追踪的工具,可以用来探测链路中的某个节点是否有问题,也可以用来分析网络拓扑结构。以下图示解释了Tracert的工作原理,如图=>

从上图可以看到,PC1要追踪本地到目的服务器8.8.8.8的沿途路径,所以向外发送追踪包。追踪包是一个UDP分组,目的IP为8.8.8.8,目的端口为55555<目的端口随机生成,但是数值非常高,大部分服务器没有提供此服务>,TTL从1开始不断递增。沿途的路由器收到追踪包之后,发现数据包不是给自己的,便开始查找路由表准备向外转发,当TTL减去1并且为0时,意味着此追踪包失效,路由器便需要返回一个ICMP TTL超时信息给源发送者;当数据包刚好到达目的服务器时,服务器不再将TTL减去1,而是解封装到传输层,此时便看到UDP的高端口,本地没有这个端口服务时,则返回源通告者ICMP端口不可达信息。PC1便可以根据返回的IP地址,收集到沿途设备的IP列表,得知大概的网络拓扑结构。


【ICMP实验步骤】

1、根据以上实验拓扑搭建实验环境(R1-R2-R3),初始化实验设备,开启接口并配置IP地址,如下:

R1(config)#int f0/0

R1(config-if)#no shutdown

R1(config-if)#ip address 12.1.1.1 255.255.255.0

R2(config)#int f0/0

R2(config-if)#no shutdown

R2(config-if)#ip add 12.1.1.2 255.255.255.0

R2(config)#int f1/0

R2(config-if)#no shutdown

R2(config-if)#ip address 23.1.1.2 255.255.255.0

R3(config)#int f0/0

R3(config-if)#no shutdown

R3(config-if)#ip address 23.1.1.3 255.255.255.0

R3(config)#int loopback 1

R3(config-if)#ip address 8.8.8.8 255.255.255.255

R3(config-if)#exit

3、在R1和R2链路上开启wireshark抓包,并且在R1上Ping R2,如下:

R1#ping 12.1.1.2

Type escape sequence to abort.

Sending 5, 100-byte ICMP Echos to 12.1.1.2, timeout is 2 seconds:

.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 32/38/44 ms

4、在wireshark软件界面中观察ICMP数据包,如下:
从上图可以看到,R1向R2发送ICMP echo requtest即回显请求分组,R2向R1返回ICMP echo reply即回显应答分组,默认一次Ping有5个请求回复过程。

以下表格详细解读了ICMP请求回应分组的字段=>

字段

解释

Type

类型值,标识ICMP分组类型

Code

代码值,标识ICMP分组类型的某一种具体分组

Checksum

校验和,用于检验数据包是否完整或是否被修改

Identifier

标识符,标识本进程。当同时与多个目的通信时,通过本字段来区分

Sequence Number

序列号,标识本地到目的的数据包序号,一般从序号1开始

(2)点击此图中的ICMP回显应答分组,可以得到以下分组界面

可以看到,回显应答与回显请求除了类型值不同外,其他字段基本一样,另外,两种分组在报文尾部也夹带了时间戳信息,可以用于判断链路的来回延迟时间。

5、在R1、R2、R3上部署RIPv2路由协议,保证全网连通性,如下:<路由协议的部署在后续路由章节有更详细解读>

R1(config)#router rip

R1(config-router)#version 2

R1(config-router)#no auto-summary

R1(config-router)#network 12.0.0.0


R2(config)#router rip

R2(config-router)#version 2

R2(config-router)#no auto-summary

R2(config-router)#network 12.0.0.0

R2(config-router)#network 23.0.0.0


R3(config)#router rip

R3(config-router)#version 2

R3(config-router)#no auto-summary

R3(config-router)#network 23.0.0.0

R3(config-router)#network 8.0.0.0

6、查看R1上的路由表,如下:

R1#show ip route 

Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP

       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area

       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2

       E1 - OSPF external type 1, E2 - OSPF external type 2

       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2

       ia - IS-IS inter area, * - candidate default, U - per-user static route

       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     23.0.0.0/24 is subnetted, 1 subnets

R       23.1.1.0 [120/1] via 12.1.1.2, 00:00:12, FastEthernet0/0

     8.0.0.0/32 is subnetted, 1 subnets

R       8.8.8.8 [120/2] via 12.1.1.2, 00:00:12, FastEthernet0/0

     12.0.0.0/24 is subnetted, 1 subnets

C       12.1.1.0 is directly connected, FastEthernet0/0

可以看到,R1已经具有全网的路由。

7、在R1和R2开启抓包,在R1上追踪8.8.8.8,如下:

R1#traceroute 8.8.8.8

Type escape sequence to abort.

Tracing the route to 8.8.8.8

  1 12.1.1.2 40 msec 36 msec 24 msec

  2 23.1.1.3 36 msec 60 msec 40 msec

通过追踪8.8.8.8,可以得到沿途路由器的IP地址。此时打开wireshark界面,如下:

从上图可以看出,路由器每一跳发送3个UDP数据包,目的端口为高端口号,从33435开始;沿途设备12.1.1.2向源发生者12.1.1.1发送TTL超时信息,最终设备向源发生者返回ICMP端口不可达信息。
(1)打开UDP数据包,分组界面如下:


(2)打开ICMP TTL超时包,分组界面如下:

(3)打开ICMP端口不可达包,分组界面如下:

可以看到,追踪程序便是根据ICMP返回的数据包源IP地址,来获得网络的拓扑信息。此实验完成。