一、ICMP简介
IP协议是一种不可靠无连接的协议,当数据包经过多个网络传输后,可能出现错误、目的主机不响应、包拥塞和包丢失等问题。为了处理这些问题,在IP层引入了另一个协议ICMP(Internet控制信息协议)。ICMP报文有两种类型:差错报文和查询报文。ICMP报文封装在IP报文里传输。ICMP报文可以被IP协议、传输层协议(TCP或UDP)和用户进程使用。ICMP与IP一样,都是不可靠传输,ICMP的信息也可能丢失。为了防止ICMP报文无限制的连续发送,对于ICMP报文在传输中发生的问题,将不再发送ICMP差错报文。
二、ICMP报文格式
ICMP数据包由8字节的首部和可变长度的数据部分组成。如下图所示,第一个字段是ICMP的类型,它定义了报文类型。第二个字段是代码字段,它指明了发送这个特定报文类型的原因。校验和字段为ICMP数据包提供差错校验。对于不同类型的ICMP数据包,首部的最后4个字节的格式是不同的,具体的格式将在下面讨论。
差错报文的数据部分携带引起差错的原始数据。查询报文的数据部分携带了基于查询类型的额外信息。
图4-1 ICMP报文的一般格式
● 类型:8位字段,用于描述特定类型的ICMP报文。 ● 代码:8位字段,进一步描述某些ICMP报文的具体说明。 ● 校验和:16位字段,覆盖这个ICMP报文的校验和。三、ICMP封装
ICMP报文封装在IP数据报中,具体的封装方法如下图所示:
图4-2 ICMP封装
四、ICMP报文类型
ICMP报文可分为两大类:差错报文和查询报文,如下图所示:
图4-3 ICMP报文类型
差错报文报告路由器或主机在处理IP数据报时遇到的问题。 查询报文是成对出现的,它帮助主机或网络管理员从一个路由器或另一个主机得到特定的信息。例如,主机使用ICMP回显请求和回显应答报文发现它们的邻站。下表列出了每一类ICMP报文。
表4-1 ICMP报文
五、ICMP查询报文 ICMP查询报文能够获得特定主机或路由器的信息,能够对某些网络问题进行诊断。ICMP查询报文包括4对不同类型的报文,分别为回显请求和应答报文、时间戳请求和应答报文、地址掩码请求和应答报文以及路由器询问和通告报文,如下图所示。
图4-4 查询报文
1.回显请求和应答
回显请求报文和回显应答报文用来确定了两个节点(主机或路由器)之间是否能够正常通信。用户可以使用这对报文来发现网络问题。 主机或路由器可以发送回显请求报文给另一个主机或路由器。收到回显请求报文的主机或路由器产生回显应答报文,并将其返回给原来的发送端。 回显请求和回显应答报文可用来确定是否在IP这级能够通信。因为ICMP报文被封装在IP数据报中,发送回显请求的主机在收到回显应答报文时,就证明了在发送端和接收端之间能够使用IP数据报进行通信。另外,这还证明了链路中的路由器能够接收、处理和转发数据报。 回显请求和回显应答报文还可以用于检查另一个主机是否可达。用户可以调用数据包因特网搜寻器(ping)命令做到这一点。现在,大多数系统都提供ping命令,它可以产生一连串的回显请求或回显应答报文。 回显请求和回显应答报文也可以用来验证某个节点是否正常工作。可以向被测试的节点发送回显请求报文,该报文的数据字段包含一段信息,如果这段信息被测试的节点在回显应答报文中完全一样地重复,则说明该节点工作正常;否则说明该节点出了问题。下图给出了回显请求和回显应答报文的格式。类型值为8表示回显请求报文,类型值为0表示回显应答报文。标识符和序号字段在协议中没有正式定义,可以由发送端任意使用。
图4-5 ICMP回显请求和应答报文
2.时间戳请求和应答
两个机器(主机或路由器)可使用时间戳请求和时间戳应答报文来确定IP数据报在这两个机器之间传输所需要的时间,也可以用作两个机器时钟的同步。这两个报文的格式如下图所示。其中,类型值为13表示时间戳请求报文,类型值为14表示时间戳应答报文。
图4-6 时间戳请求和应答报文
在报文格式中3个时间戳字段的长度都是32位。每一个字段都保存一个整数,代表从通用时间(格林尼治标准时间)的午夜起测量出的时间,以毫秒为单位。 源节点在时间戳请求报文的原始时间戳字段填入它的时钟所显示的通用时间。其它两个时间戳字段都填入零。 收到时间戳请求报文后,终点将生成时间戳应答报文。终点把请求报文中的原始时间戳字段值复制到应答报文的同一个字段中。然后在接收时间戳字段中填入收到这个请求报文时其时钟所显示的通用时间。最后,终点在应答报文将要发送时在发送时间戳字段中填入其时钟所显示的通用时间。 时间戳请求和时间戳应答报文可以用来计算数据报从源点到终点所需的时间,还可以用于计算数据报再返回到源点所需的时间。3.地址掩码请求和应答 要得到掩码,主机应该向局域网上的路由器发送地址掩码请求报文。若主机知道路由器的地址,它就把请求直接发送给该路由器。若主机不知道路由器的地址,则它就广播地址掩码请求报文。路由器收到地址掩码请求报文后,用地址掩码应答报文进行响应,向主机提供所需的掩码。 地址掩码请求和地址掩码应答报文的格式如下图所示。其中,类型值为17表示地址掩码请求报文,类型值为18表示地址掩码应答报文。在请求报文中,地址掩码字段填入全0。当路由器把地址掩码应答发回给主机时,这个字段就包含真正的掩码。
图4-7 地址掩码请求和应答报文
无盘工作站在启动时是需要地址掩码的,它会使用RARP协议查找完整的IP地址,在收到IP地址以后,无盘工作站就可使用地址掩码请求报文找出地址掩码,从而确定IP地址的哪一部分定义了子网号,哪一部分定义了主机号。4.路由器询问和通告 主机若想把数据发送给另一个网络上的主机,就需要知道连接到该网络上的路由器的地址。此外,这个主机还需要知道这些路由器是否正常工作。路由器询问报文和路由器通告报文可以完成这项工作。主机可把路由器询问报文进行广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通告报文广播其路由选择信息。甚至在没有主机询问时,路由器也可周期性地发送路由器通告报文。路由器发送出通告报文时,它不仅通告了自己的存在,而且也通告了它所知道的所有在这个网络上的路由器。下图给出了路由器询问报文的格式。
图4-8 路由器询问报文
下图给出了路由器通告报文的格式。生存期字段表示这个报文在多长时间内是有效的。在通告报文中每一个路由器的项目有两个字段:路由器地址和地址优先级。地址优先级定义了路由器的等级。优先级用来选择某个路由器作为默认路由器。若地址优先级为零,则这个路由器就被认为是默认路由器。若地址优先级是0x80000000,则这个路由器永远不能被选为默认路由器。
图4-9 路由器通告报文
六、ICMP差错报文
ICMP差错报文用来报告差错。虽然现代的技术已经制造出很可靠的传输媒体,但差错仍然存在,因而必须进行处理。正如在实验三中所讨论的,IP是个不可靠的协议。这就表示IP不考虑差错校验和差错控制。ICMP就是为了补偿这个缺点而设计的。然而ICMP不能纠正差错,它只是报告差错,差错纠正留给高层协议去做。ICMP使用源IP地址把差错报文发送给数据报的源点(发出者)。 一共有5种差错报文:目的端不可达、源点抑制、超时、参数问题以及改变路由,如下图所示。
图4-10 差错报文
差错报文的数据字段包括原始数据报(引起差错的报文)的首部和原始数据报数据部分的前8个字节。包括原始数据报首部的目的是为了向差错报文的原始信源给出关于数据报本身的信息。包括数据的前8个字节是因为这前8个字节提供了关于端口号(UDP和TCP)和序号(TCP)的信息。根据这些信息,源点可以把差错情况通知给上层协议。1.目的端不可达
当路由器不能够为数据报找到路由或主机,就丢弃这个数据报,然后向发出这个数据报的源主机发送目的端不可达报文。下图给出了目的端不可达报文的格式。这种类型的代码字段指明了丢弃该数据报的原因。
图4-11 目的端不可达报文
2.源点抑制 IP协议是无连接协议,因此通信缺乏流量控制。ICMP源点抑制报文就是为了给IP增加一种流量控制而设计的。当路由器或主机因拥塞而丢弃数据报时,它就向数据报的发送端发送源点抑制报文。第一,它通知发送端,数据报已被丢弃。第二,它警告发送端,在路径中的某处出现了拥塞,因而源端必须放慢发送过程。源点抑制报文的格式如下图所示:
图4-12 源点抑制报文
3.超时 超时报文是在以下两种情况下产生的: ● 数据报的生存时间字段值被减为0时,路由器丢弃这个数据报,并向发送端发送超时报文。 ● 当组成报文的所有分段未能在某一时限内到达目的主机时,也要产生超时报文。当第一个分段到达时,目的主机就启动计时器。当计时器的时限到了,目的主机就将所有分段丢弃,并向发送端发送超时报文。超时报文格式如下图所示:
图4-13 超时报文
4.参数问题 当数据报在Internet上传送时,如果路由器或目的主机发现数据报首部中出现了二义性问题,或在数据报的某个字段中缺少某个值,它就丢弃这个数据报,并向发送端发送参数问题报文。下图给出了参数问题报文格式。代码字段指明了丢弃数据报的原因。
图4-14 参数问题报文
● 代码为0时表示在首部的某个字段中有差错或二义性。指针字段值指向有问题的字节。 ● 代码为1时表示缺少所需的选项部分。这种情况下不使用指针。5.重定向 为了提高效率,主机不参与路由选择更新过程,因此,主机可能会把某数据报发送给一个错误的路由器。这时,收到这个数据报的路由器会把数据转发给正确的路由器,同时向主机发送重定向报文,告诉主机正确路由器的地址。下图给出了重定向报文的格式。
图4-15 改变路由报文
七、ICMP校验和 ICMP的校验和的计算覆盖了整个ICMP报文(首部和数据)。1.校验和的计算 发送端按以下步骤使用反码算术运算计算校验和: (1)把校验和字段置为零。 (2)把报文按照16位长度分段,使用反码算术运算计算所有分段之和。 (3)把得到的和求反码,得到校验和。 (4)把校验和存储在校验和字段中。2.校验和的测试 接收端按以下步骤使用反码算术运算来测试校验和的正确性: (1)把报文按照16位长度分段,使用反码算术运算计算所有分段之和。 (2)把得到的和求反码。 (3)若结果是全0,则接受这个报文;否则就拒绝这个报文。
【实验步骤】
练习1 运行Ping命令
各主机打开工具区的"拓扑验证工具",选择相应的网络结构,配置网卡后,进行拓扑验证,如果通过拓扑验证,关闭工具继续进行实验,如果没有通过,请检查网络连接。
本练习将主机A、B、C、D、E、F作为一组进行实验。 实验开始前主机B首先执行命令"staticroute_config"启动静态路由。
1.主机B、E、F启动协议分析器,打开捕获窗口进行数据捕获并设置过滤条件(提取 ICMP协议)。
2.主机A ping 主机E(172.16.0.2)。 主机C ping 主机F(172.16.0.3)。3.主机B、E、F停止捕获数据,察看捕获到的数据,并回答以下问题: ● 捕获的报文对应的"类型"和"代码"字段分别是什么? ● 分析报文中的哪些字段保证了回显请求报文和回显应答报文的一一对应?
练习2 ICMP查询报文
本练习将主机A、B、C、D、E、F作为一组进行实验。
1.主机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层其它字段填充完毕后,计算并填充。 其它字段使用默认值。2.主机C启动协议分析器进行数据捕获,并设置过滤条件(提取ICMP协议)。3.主机A发送已编辑好的数据帧。4.主机C停止捕获数据。察看主机C捕获到的数据,并填写下表:
表4-2 实验结果
【思考问题】
1.能否根据时间戳计算出当前的时间?2.使用时间戳得到的时间比从系统得到的时间有什么好处?
练习3 ICMP差错报文
本练习将主机A、B、C、D、E、F作为一组进行实验。1.目的端不可达 (1)主机A、B、C、D、E、F启动协议分析器捕获数据,并设置过滤条件(提取ICMP)。 (2)主机A、C、D、E、F ping 172.16.2.10(不存在的IP地址)。 (3)主机A、B、C、D、E、F停止捕获数据。察看捕获到的数据,并回答以下问题: ● 捕获到的是哪一种目的端不可达报文?2.超时
(1)主机A、C、D分别启动协议编辑器,编写一个发送给主机F(172.16.0.3)的ICMP数据帧。其中:
MAC层: 目的MAC地址:主机B的MAC地址(172.16.1.1接口的MAC)。 源MAC地址:本机的MAC地址。 协议类型或数据长度:0800。 IP层: 总长度:包含IP层和ICMP层长度。 生存时间(TTL):0。 高层协议类型:1。 校验和:在其它字段填充完毕后,计算并填充。 源IP地址:本机的IP地址。 目的IP地址:F的IP地址。 ICMP层: 类型:8。 代码字段:0。 校验和:在ICMP其它字段填充完毕后,计算并填充。 其它字段使用默认值。
(2)主机E、F分别启动协议编辑器,编写一个发送给主机D(172.16.1.4)的ICMP数据帧。其中:
MAC层: 目的MAC地址:主机B的MAC地址(172.16.0.1接口的MAC)。 源MAC地址:本机的MAC地址。 协议类型或数据长度:0800。 IP层: 总长度:包含IP层和ICMP层长度。 TTL:0。 高层协议类型:1。 校验和:在其它字段填充完毕后,计算并填充。 源IP地址:本机的IP地址。 目的IP地址:D的IP地址。 ICMP层: 类型:8。 代码字段:0。 校验和:在ICMP其它字段填充完毕后,计算并填充。 其它字段使用默认值。
(3)主机B启动协议分析器,网卡b1(172.16.1.1)、网卡b2(172.16.0.1)分别捕获数据,并设置过滤条件(提取ICMP协议)。
(4)主机A、C、D、E、F各自发送已编辑好的数据帧。
(5)主机B停止捕获数据,察看并分析捕获到的数据。
(6)主机B在命令行方式下输入recover_config命令,停止静态路由服务。
【思考问题】
1.为什么要设置TTL字段?2.为什么要限制由失效的ICMP差错报文再产生一个ICMP报文?
3.什么样的ICMP报文是由路由器发送出的?什么样的ICMP报文是由目的主机发送出的?
4.主机A向主机B发送数据报,主机B从未收到该数据报,而主机A也从未收到出问题的通知。试给出可能发生情况的两种不同解释。