ICMP协议原理与实践
ICMP协议原理与实践
ICMP(Internet Control Message Protocol)是互联网控制信息协议,主要用于实现IP网络层的连通性测试和差错报告。本文将深入探讨ICMP协议的基本原理,并通过Ping和Tracert工具的具体应用,帮助读者理解ICMP协议在实际网络环境中的工作方式。
ICMP简介
ICMP(Internet Control Message Protocol),用于实现IP网络层的连通性测试和差错报告。常用的Ping程序和Tracert程序便是基于ICMP协议进行开发的。
ICMP分组
ICMP协议根据类型值和代码值的组合,有非常多的分组类型,常用的ICMP分组有请求回显、回显应答、网络不可达、端口不可达、生存时间超时等。不同的ICMP分组应用在不同的环境,例如当采用Ping程序测试连通性时,则调用请求回显和回显应答分组,当采用Tracert程序时,则调用生存时间超时或端口不可达分组。
Ping原理
Ping程序是应用非常广泛,用于实现连通性测试的工具,以下图示解释了Ping的工作原理:
从上图可以看到,PC1在测试本地到PC2的连通性,所以向PC2发送ICMP的请求回显分组,PC2收到请求之后,向PC1发送回显应答分组,此时PC1便可以得知PC2“在那里”。若PC1没有收到回显应答分组,则说明PC1与PC2链路有故障。
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开始 |
点击此图中的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地址,来获得网络的拓扑信息。此实验完成。