一、ICMP简介(控制报文协议)

  • 为什么要引入ICMP协议:
  • IP协议本身并没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据 包。此外,​IP没有提供直接的方式来获取诊断信息​(例如,哪些路由器在沿途中被使用了或 使用一种方法来估计往返时间)。
  • 为了解决这些不足之处,​将一个特殊的Internet控制报文协议​(Internet Control Message Protocol,ICMP)与IP结合使用,以便​提供与IP协议层配置和IP数据包处置相关的诊断和控制信息
  • ICMP属于那一层?​ICMP通常被认为是IP层的一 部分,它需要在所有IP实现中存在。它使用IP协议进行传输。因此,确切地说,​它既不是 一个网络层协议,也不是一个传输层协议,而是位于两者之间
  • ICMP版本:
  • ICMP分为ICMPv4、ICMPv6(分别对应于IPv4、IPv6)
  • 相较于IPv4中的ICMPv4,ICMPv6在IPv6中发挥更为重要的作用


ICMP的功能

  • ICMP​负责传递可能需要注意的差错和控制报文
  • ICMP报文通常是由IP层本身、上层 的传输协议(例如TCP或者UDP),甚至某些情况下是用户应用触发执行的
  • 请注意,​ICMP并不为IP网络提供可靠性​。相反,​它表明了某些类别的故障和配置信息​。最常见的丢包(路 由器缓冲区溢出)并不会触发任何的ICMP信息。由其他协议如TCP来处理这种情况


二、ICMP在IPv4、IPv6报文中的封装

  • ICMP报文是​在IP数据报内被封装传输​的,如下所示
  • ICMP报文​可能会像其他IP数据报那样被分片​(参见后面IP分片的文章),尽管这并不常见

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_数据


在IPv4中

  • 在IPv4中​,协议(Protocol)字段值为1​表示该报文携带了ICMPv4

在IPv6中

  • 在IPv6中,ICMPv6报文可能​开始于0个或者多个扩展头部之后
  • 位于ICMPv6头部之前的最后一个扩展头部包含了一个值为58的下一个头部(Next Header)字段


三、ICMP的报文格式

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_校验和_02


  • 开头的4个字节在所有的报文中都是固定的,但是其与部分在不同的报文中不用

类型字段

  • 在ICMPv4中,为类型字段​保留了42个不同的值,用于确定特定的报文
  • 但是,大概​只有8个是经常使用的​(在后面介绍)

代码字段

  • 许多类型的ICMP报文也使用不同的代码字段值​进一步指定报文的含义

校验和字段

  • 校验和字段​覆盖整个ICMPv4报文
  • 在ICMPv6中,它将​涵盖一个来自IPv6头部的伪头部​(pseudo-header)
  • 用于计算校验和的算法和前面介绍的Internet校验中用于计算IP头校验和的​算法相同
  • 请注意,这是我们第一个​端到端(end-to-end)的校验和例子​。该校验和从发送方的ICMP报文被一路携带到最终的接收方。相比之下,前面介绍的Internet校验讨论的IPv4头校验和在路由器的每一跳中都会改变。如果一个ICMP实现收到一个校验和错误的ICMP报文,该报文将被丢弃;没有ICMP报文可以表示收到的ICMP报文中的校验和是错误的。回想一下,IP层不能对数据报的有效载荷部分进行保护。如果ICMP不包括校验和, ICMP报文的内容就可能不正确,进而导致错误的系统行为



报文类型种类

  • ICMP可以分为两大类:
  • 有关IP数据报传递的ICMP报文(称为差错报文)
  • 有关信息采集和配置的ICMP报文(称为查询或者信息类报文)


四、ICMPv4报文

  • 对于ICMPv4:
  • 信息类报文包括:​回显请求、回显应答(分比为类型8和0)、以及路由器通告和路由器请求(分贝为类型9和10,同一称为路由器发现)
  • 差错报文包括:​目的不可达(类型3)、重定向(类型5)、超时(类型11)、参数问题(类型12)


  • 下面是ICMPv4的报文类型

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_校验和_03

  • 下面是对每种类型进行逐个细分的表格

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_字段_04


五、ICMPv6报文

  • ICMPv6负责的不仅是差错和信息类报文,还负责大量IPv6路由器和主机的配置:
  • 在下面的表格中,明显看出第一个报文类型集合和第二个报文类型集合之间存在分离(即128以下的报文类型和128及以上的)
  • 在ICMPv6中,与ICMPv4一样,报文​也被分组为信息类的和差错类的
  • 然而,所有ICMPv6的差错报文的类型(Type)字段的高位比特为0。因此,ICMPv6类型​从0到127的都是差错报文​,​类型从128到255的都是信息类报文
  • 许多信息类报文都是请求/应答对
  • 将ICMPv6的标准报文和比较常见的ICMPv4报文进行比较,​我们可以得到结论:
  • 设计 ICMPv6时的一些努力是为了​从原始的规范中去除未使用的报文,同时保留有用的报文。​遵循这个方法,ICMPv6也使用代码(Code)字段,主要是为了完善某些差错报文的含义。在下表中,我们列出了这些标准的ICMPv6报文类型(即目的不可达、超时、参数问题),除0之外还定义了许多代码值
  • 除了定义ICMPv6基本功能的类型和代码字段外,​还支持了大量的标准选项,其中一些是必需的。​这将ICMPv6与ICMPv4中区别开来(ICMPv4没有选项)。当前,标准的ICMPv6选项只为ICMPv6 ND报文(类型为135和136)定义使用,使用了中讨论的选项格式(Option Format)字段。在“IPv6的邻居发现”节详细探讨ND时我们会讨论这些选项0


  • 下面是ICMPv6的报文类型

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_校验和_05

  • 下面是对每种类型进行逐个细分的表格

TCP/IP卷一:44---ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_数据_06


六、ICMP报文的处理

  • 在ICMP中,​对传人报文的处理随着系统的不同而不同:
  • 一般说来,传人的信息类请求将被操作系统自动处理,而差错类报文传递给用户进程或传输层协议,如TCP
  • 进程可以选择对它们采取行动或忽略它们。这个一般规则的例外情况包括重定向报文和目的不可达一需要分片报文。前者将导致主机路由表中的自动更新,而后者用于路径MTU发 现(PMTUD)机制,这一般是由传输层协议来实现的,如TCP
  • 在ICMPv6中对报文的处理在一定程度上将更为严格。​处理传入的ICMPv6报文时将应用以下规则:
  • 未知的ICMPv6差错报文必须传递给上层产生差错报文的进程(如果可能的话)
  • 未知的ICMPv6信息类报文被丢弃
  • ICMPv6差错报文将会尽可能多地包含导致差错的原始( “违规” ) IPv6报文,当然最终的差错报文大小不能超过最小的IPv6 MTU ( 1280字节)
  • 在处理ICMPv6差错报文时,需要提取原始(original)或者“违规”数据包(包含在ICMPv6差错报文体中)中的上层协议类型,用于选择适当的上层进程。如果这是不可能的,在任何IPv6层处理完后将无声地丢弃差错报文
  • 存在处理差错的特殊规则(见后面“ICMP差错报文”的处理文章)
  • IPv6节点必须限制它发送ICMPv6差错报文的速率。有多种方法可以用来实现限速功 能,包括将在后面“ICMP差错报文”提到的令牌桶方法