理论基础
ICMP简介
IP协议是一种不可靠无连接的包传输,当数据包经过多个网络传输后,可能出现错误、目的主机不响应、包拥塞和包丢失等。 为了处理这些问题,在IP层引入了一个子协议ICMP(Internet Control Message Protocol)。 ICMP数据报有两种形式:差错数据报和查询数据报。ICMP数据报封装在IP数据报里传输。 ICMP报文可以被IP协议层、传输层协议(TCP或UDP)和用户进程使用。ICMP与IP一样,都是不可靠传输,ICMP的信息也可能丢失。 为了防止ICMP信息无限制的连续发送,对ICMP数据报传输中问题不能再使用ICMP传输。 查询报文是成对出现的,它帮助主机或网络管理员从一个路由器或另一个主机得到特定的信息。ICMP封装成IP数据报

ICMP报文的两大类型
差错报告报文
IP是不可靠的协议。这就表示IP是不考虑处理检验和差错控制的。ICMP就是为补偿这个缺点而设计的。然而ICMP不能纠正差错; 它只是报告差错。差错纠正留给高层协议去做。差错报文总是发送给原始的数据源,因为在数据报中关于路由惟一可用的信息就是源IP地址和目的IP地址。 ICMP使用源IP地址将差错报文发送给数据报的源端。关于ICMP差错报文有以下的一些要点:对于携带ICMP差错报文的数据报,不再产生ICMP差错报文。
对于分段数据报,如果不是第一个分段,则不产生ICMP差错报文。
对于具有多播地址的数据报,不产生ICMP差错报文。
对于有特殊地址(如127.0.0.0或0.0.0.0)的数据报,不产生ICMP差错报文。
差错报文中的数据部分包括了原始数据报的首部加上原始数据报数据的前8个字节。 原始数据报的首部给出了关于原始数据报本身的信息。原始数据报的前8个字节数据提供了关于端口号和序号等信息。 结构如图:
ICMP总是向原始的数据源报告差错报文。差错报告报文中又可以分为 “目的端不可达”、 “源端抑制”、 “超时”、 “参数问题”和 “改变路由”等。
目的端不可达 :
当路由器不能够给数据报找到路由或主机,就丢弃这个数据报,然后这个路由器或主机就向发出这个数据报的源主机发回目的端不可达报文。下图给出了目的端不可达报文的格式。
源端抑制 :
IP协议是无连接协议,因此通信缺乏流量控制。ICMP源端抑制报文就是为了给IP增加一种流量控制而设计的当路由器或主机因拥塞而丢弃数据报时,它就向数据报的发送站发送源端抑制报文。第一,它通知源端,数据报已被丢弃。第二,它警告源端,在路径中的某处出现了拥塞,因而源端必须放慢发送过程。源端抑制报文的格式如图:
超时
参数问题
改变路由
查询报文
除差错报告外,ICMP还能对某此网络问题进行诊断。这是通过使用由4对不同报文组成的查询报文来完成的。 它们分别是: “回送请求和回答”、 “时间戳请求和回答”、 “地址掩码请求和回答”以及 “路由器询问和通告” (最初还定义了信息求和信息回答报文,但已经被废弃)。回送请求和回答
时间戳请求和回答
地址掩码请求和回答
路由器询问和通告
实验说明
实验目的
1. 掌握ICMP协议的报文格式2. 理解不同类型ICMP报文的具体意义
3. 了解常见的网络故障
实验原理
实验环境配置
实验步骤
主机B启动静态路由服务(方法:在命令行方式下,输入“staticroute_config”)。 按照拓扑结构图连接网络,使用拓扑验证检查连接的正确性。
练习一:运行Ping命令
主机B、E、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取ICMP协议)。
主机A ping主机E(172.16.0.2)。
主机B、E、F停止捕获数据,察看捕获到的数据,并回答以下问题:
捕获的报文对应的“类型”和“代码”字段分别是什么?
分析报文中的哪些字段保证了回送请求报文和回送应答报文的一一对应?
练习二:ICMP查询报文
主机A启动仿真编辑器,编辑一个ICMP时间戳请求数据帧发送给主机C(172.16.1.3)。
MAC层:
目的MAC地址:C的MAC地址。
源MAC地址:A的MAC地址。
协议类型或数据长度:0800。
IP层:
总长度:包含IP层和ICMP层长度。
高层协议类型:1。
校验和:在其他字段填充完毕后计算并填充。
源IP地址:A的IP地址。
目的IP地址:C的IP地址。
ICMP层:
类型:13。
代码字段:0。
校验和:在ICMP层其他字段填充完毕后,计算并填充。
其他字段使用默认值。
主机C启动协议分析器进行数据捕获,并设置过滤条件(提取ICMP协议)。
主机A发送已编辑好的数据帧。
练习三:ICMP差错报文
目的端不可达
主机B、C、E、F启动协议分析器捕获数据,并设置过滤条件(提取ICMP)。
在主机A上ping 172.16.2.10(不存在的IP)。
主机B、C、E、F停止捕获数据。察看捕获到的数据,并回答以下问题:
捕获到的是哪一种目的端不可达报文?
超时
在主机D上启动仿真编辑器,编写一个发送给主机E(172.16.0.2)的ICMP数据帧。其中:
MAC层:
目的MAC地址:主机B的MAC地址(对应于172.16.1.1接口的MAC)。
源MAC地址:D的MAC地址。
协议类型或数据长度:0800。
IP层:
总长度:包含IP层和ICMP层长度。
TTL:0。
高层协议类型:1。
校验和:在其他字段填充完毕后,计算并填充。
源IP地址:D的IP地址。
目的IP地址:E的IP地址。
思考问题
为什么要限制由失效的ICMP差错报文再产生一个ICMP报文?主机A向主机B发送数据报。主机B从未收到该数据报,而主机A也从未收到出问题的通知。试给出可能发生的情况的两种不同解释。
试用表说明,什么样的ICMP报文是由路由器发送出的,什么样的ICMP报文是由非目的主机发送出的,以及什么样的ICMP报文是由目的主机发送出的。