ICMP协议详解

ICMP协议详解

  • 前言
  • ICMP简介
    • ICMP差错检测
    • ICMP重定向
  • ICMP数据包
  • ICMP应用
    • ping
    • Tracert
  • 拓展
    • IP协议全貌
    • ICMP报文的类型与编码详细关系
    • ICMP差错报文的特点
    • ICMP控制报文
      • 拥塞控制与源站抑制报文
      • 路由控制与重定向报文
    • 请求与应答报文
      • 回送请求与应答报文
      • 时戳请求与应答报文
      • 地址掩码请求与应答报文
    • ICMP安全性

前言

Internet控制报文协议ICMP(Internet Control Message Protocol)是网络层的一个重要协议。

ICMP协议用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息、诊断和排除各种网络故障具有至关重要的作用。使用基于ICMP的应用时,需要对ICMP的工作原理非常熟悉。
在这里插入图片描述

ICMP简介

ICMP用来传递差错、控制、查询等信息。

ICMP是TCP/IP协议簇的核心协议之一,它用于在IP网络设备之间发送控制报文,传递差错、控制、查询等信息。

ICMP差错检测

在这里插入图片描述
ICMP Echo RequestICMP Echo Reply分别用来查询和响应某些信息,进行差错检测。

ICMP Echo消息常用于诊断源和目的之间的网络连通性,还可以提供其他信息,如报文往返时间等。

在这里插入图片描述

ICMP重定向

在这里插入图片描述
ICMP Redirect重定向消息用于支持路由功能。

如图所示,主机A希望发送报文到服务器A,于是根据配置的默认网关地址向网关RTB发送报文。网关RTB收到报文后,检查报文信息,发现报文应该转发到与源主机在同一网段的另一个网关设备RTA,因为此转发路径是更优的路径。所以RTB会向主机发送一个Redirect消息,通知主机直接向另一个网关RTA发送该报文。主机收到Redirect消息后,向RTA发送报文,RTA会将报文转发给服务器A。

ICMP数据包

ICMP定义了各种错误消息,用于诊断网络连接性问题;

根据这些错误消息,源设备可以判断出数据传输失败的原因。

比如,如果网络中发生了环路,导致报文在网络中循环,最终TTL超时,这种情况下网络设备会发送TTL超时消息给发送端设备。

又比如如果目的不可达,则中间的网络设备会发送目的不可达消息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达消息;如果网络设备无法找到目的网络中的目的主机,则发送目的主机不可达消息

在这里插入图片描述
ICMP消息封装在IP报文中。ICMP消息的格式取决于Type和Code字段,其中Type字段为消息类型,Code字段包含该消息类型的具体参数。后面的校验和字段用于检查消息是否完整。消息中包含32比特的可变参数,这个字段一般不使用,通常设置为0。

ICMP Redirect消息中,这个字段用来指定网关IP地址,主机根据这个地址将报文重定向到指定网关。在Echo请求消息中,这个字段包含标识符和序号,源端根据这两个参数将收到的回复消息与本端发送的Echo请求消息进行关联。尤其是当源端向目的端发送了多个Echo请求消息时,需要根据标识符和序号将Echo请求和回复进行一一对应。
在这里插入图片描述
ICMP定义了多种消息类型,用于不同的场景。有些消息不需要Code字段来描述具体类型参数,仅用Type字段表示消息类型。

比如,ICMP Echo回复消息的Type字段设置为0。

有些ICMP消息使用Type字段定义消息大类,用Code字段表示消息的具体类型。

比如,类型为3的消息表示目的不可达,不同的Code值表示不可达的原因,包括目的网络不可达(Code=0)、目的主机不可达(Code=1)、协议不可达(Code=2)、目的TCP/UDP端口不可达(Code=3)
等。(0网、1主、2协、3端不可达)

ICMP应用

ping

在这里插入图片描述
ICMP的一个典型应用是Ping。Ping是检测网络连通性的常用工具,同时也能够收集其他相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP报文,进行Ping测试。

Ping常用的配置参数说明如下:

  1. -a source-ip-address 指定发送ICMP ECHO-REQUEST报文的源IP地址。如果不指定源IP地址,将采用出接口的IP地址作为ICMP ECHO-REQUEST报文发送的源地址。(指定源或者接口)
  2. -c count指定发送ICMP ECHO-REQUEST报文次数。缺省情况下发送5个ICMP ECHO-REQUEST报文。
  3. -h ttl-value指定TTL的值。缺省值是255。
  4. -t timeout指定发送完ICMP ECHO-REQUEST后,等待ICMP ECHO-REPLY的超时时间。(长ping)
    在这里插入图片描述

Ping命令的输出信息中包括目的地址、ICMP报文长度、序号、TTL值、以及往返时间

序号是包含在Echo回复消息(Type=0)中的可变参数字段,TTL和往返时间包含在消息的IP头中。

Tracert

在这里插入图片描述
ICMP的另一个典型应用是TracertTracert基于报文头中的TTL值来逐跳跟踪报文的转发路径

为了跟踪到达某特定目的地址的路径,源端首先将报文的TTL值设置为1。该报文到达第一个节点后,TTL超时,于是该节点向源端发送TTL超时消息,消息中携带时间戳。然后源端将报文的TTL值设置为2,报文到达第二个节点后超时,该节点同样返回TTL超时消息,以此类推,直到报文到达目的地。这样,源端根据返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。

Tracert是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。

Tracert常用的配置参数说明如下:

  1. -a source-ip-address指定tracert报文的源地址。
  2. -f first-ttl指定初始TTL。缺省值是1。
  3. -m max-ttl指定最大TTL。缺省值是30。
  4. -name使能显示每一跳的主机名。
  5. -p port指定目的主机的UDP端口号。
    在这里插入图片描述

Tracert显示数据包在网络传输过程中所经过的每一跳。

  1. 源端(RTA)向目的端(主机B)发送一个UDP报文,TTL值为1,目的UDP端口号是大于30000的一个数,因为在大多数情况下,大于30000的UDP端口号是任何一个应用程序都不可能使用的端口号
  2. 第一跳(RTB)收到源端发出的UDP报文后,判断出报文的目的IP地址不是本机IP地址,将TTL值减1后,判断出TTL值等于0,则丢弃报文并向源端发送一个ICMP超时(Time Exceeded)报文(该报文中含有第一跳的IP地址10.0.0.2),这样源端就得到了RTB的地址。
  3. 源端收到RTB的ICMP超时报文后,再次向目的端发送一个UDP报文,TTL值为2。
  4. 第二跳(RTC)收到源端发出的UDP报文后,回应一个ICMP超时报文,这样源端就得到了RTC的地址(20.0.0.2)。
  5. 以上过程不断进行,直到目的端收到源端发送的UDP报文后,判断出目的IP地址是本机IP地址,则处理此报文。根据报文中的目的UDP端口号寻找占用此端口号的上层协议,因目的端没有应用程序使用该UDP端口号,则向源端返回一个ICMP端口不可达(Destination Unreachable)报文。
  6. 源端收到ICMP端口不可达报文后,判断出UDP报文已经到达目的端,则停止Tracert程序,从而得到数据报文从源端到目的端所经历的路径(10.0.0.2;20.0.0.2;30.0.0.2)

拓展

IP协议全貌

在这里插入图片描述

ICMP报文的类型与编码详细关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ICMP差错报文的特点

报告IP数据报在传输中的差错是ICMP报文最基本的功能,ICMP差错报文有如下特点

(1) ICMP差错报文都是由路由器发送到源主机的,因为IP数据报中含有源主机的IP地址,报告给源主机是最可行的方案,另外,发出IP数据报的源主机最需要知道数据是否到达目标主机。

(2) ICMP差错报文只提供IP数据报在传输过程中的差错报告,**并不规定对各类差错应采取什么样的处理措施。**具体对差错的处理,由收到ICMP差错报文的源主机将相应的差错与应用程序联系起来才能进行相应的差错处理。

(3) ICMP差错报文不享受任何优先权,也没有特别的可靠性保证措施,与普通的IP数据报一样进行传输,传输过程中可能被丢失、损坏,甚至被抛弃。

(4) ICMP差错报文是伴随着抛弃出错的IP数据报而产生的。

(5) 当路由器发送一份参数错误等的ICMP差错报文时,ICMP报文数据区始终包含产生ICMP差错报文的IP数据报的头部和其数据区的前8个字节(64位)。

(6) 在有些情况下,为了防止在网络中产生大量的ICMP差错报文(广播风暴),影响网络的正常工作,即使发生差错,也不会产生ICMP差错报文,这些情况包括:

ICMP报文发生差错。这是为了避免差错报文无休止产生而规定的(但ICMP查询报文可能会产生ICMP差错报文)。
● 目的地址是广播地址或多播地址(D类地址)的IP数据报
作为链路层广播的数据报
不是IP分片的第一片
● 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、回送地址、广播地址或多播地址。

ICMP控制报文

拥塞控制与源站抑制报文

当一个路由器接收IP数据报的速度比其处理IP数据报的速度快,或一个路由器传入数据报的速率大于传出数据报的速率时,就会产生拥塞(Congestion)现象。

这时路由器可以通过发送源站抑制(Source Quench)报文来抑制源主机发送IP数据报的速率,避免可能产生的差错。

源站抑制报文的类型字段为4,代码字段只能为0。源站抑制技术进行拥塞控制的方法如下:

  1. 当路由器发生拥塞时,便发出ICMP源站抑制报文。拥塞的判别可以用三种方法:一是检查路由器缓存区是否已满;二是给缓存区输出队列设置一个阈值,判断队列中数据报的个数是否超过阈值;三是检测某输入线路的传输率是否过高。
  2. 源主机收到抑制报文后,按一定的速率降低发往目标主机的数据报传输率。
  3. 如果在一定的时间间隔内源主机没有收到抑制报文,便认为拥塞已解除,源主机可以逐渐恢复到原来数据报的流量。

路由控制与重定向报文

在这里插入图片描述

请求与应答报文

回送请求与应答报文

1)目的:测试信宿机或路由器是否可以到达;
2)报文格式
在这里插入图片描述

  1. 标识符与序号用来确定是哪一台主机发出的回应请求;
  2. 回应请求与应答报文以IP数据报方式在互连网中传输,如果成功接收到应答报文的话,则说明数据传输系统、 IP与 ICMP软件工作正常,信宿机可以到达;
  3. TCP/IP实现中,用户的ping命令就是利用回应请求与应答报文测试信宿机是否可以到达;

时戳请求与应答报文

  1. 目的:同步互连网中各个主机的时钟;
  2. 方法
    a) 首先利用该报文从其它主机处获得其时钟的当前时间,
    b) 根据时戳请求与应答报文接收的时间,计算出两地的往返延迟,
    c) 以此数据来同步时钟,因此这种时钟同步能力是有限的;
  3. 时戳请求与应答报文的格式:
    在这里插入图片描述

地址掩码请求与应答报文

  1. 用于无盘系统在引导过程中获取自己的子网掩码。
  2. 主机启动时,会广播一个地址掩码请求报文。路由器收到地址掩码请求报文后,回送一个包含本网使用的32位地址掩码的应答报文。

ICMP安全性

ICMP协议对于网络安全具有极其重要的意义。

ICMP协议本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。

例如,在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中,其防火墙遭受到的ICMP攻击达334050次之多,占整个攻击总数的90%以上!可见,ICMP的重要性绝不可以忽视!

在这里插入图片描述
应对措施

• 对于“Ping of Death”攻击,可以采取两种方法进行防范:

第一种方法是在路由器上对ICMP数据包进行带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;

第二种方法就是在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。
在这里插入图片描述
在这里插入图片描述
应对措施

配置防火墙以预防攻击,用户应该配置一个合理的安全策略。以下是被普遍认可的防火墙安全配置惯例,可供管理员在系统安全性和易用性之间作出权衡。

防火墙应该强制执行一个缺省的拒绝策略。除了出站的ICMP Echo Request、出站的ICMP Source Quench、进站的TTL Exceeded和进站的ICMP Destination Unreachable(两出两进)之外,所有的ICMP消息类型都应该被阻止。

  • 持续更新

    各位观看学习交流的小伙伴们,如果还没看爽的话,点开我的头像,有更多关于计算机网络的详细资料,以及更多惊喜等着你来赏析!

    如果大家觉得有帮助的话,可以动动你们的金手指点个赞或者是转发到空间、朋友圈里,让更多和你一样优秀的人看见欧!!!

  • 给未来自己的三行情书

    笔耕不断,夜以继日!
    生命不息,奋斗不止!!
    只有度过了一段连自己都被感动的日子,才会变成那个最好的自己!!!

你们说呢?

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注