Internet控制报文协议

Created at 2018-04-10 Updated at 2018-06-04 Category Study Tag TCP/IP

首先,我们必须先清楚,IP协议本身没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,并且IP没有提供直接的方式来获取诊断信息,那么我们的故事来了。

Internet控制报文协议(ICMP)腾空而出,与IP结合使用,提供了与IP协议层配置和IP数据包处置相关的诊断和控制信息,即它负责传递可能需要注意的差错和控制报文。ICMP表明了某些类别的故障和配置信息,但是并不为IP网络提供可靠性。

注意:我们常见的丢包(路由器缓冲区溢出)并不会触发任何的ICMP信息。


在IPv4和IPv6中的封装

ICMP报文是在IP数据包内被封装传输的。

如图所示:

ICMP报文封装在IPv4和IPv6的内部,即在其头部后面。ICMP头部包含了整个ICMP数据段的校验和。

下图表示了报文的格式

我们可以了解到:

  • 类型字段长8位,ICMPv4为其保留42个值,但是只有8个常用,下文会提到。
  • 代码字段长8位,每个类型有不同的代码,代表不同的含义
  • 校验和长16位,涵盖了整个报文

如果一个ICMP报文校验和错误,显然是要被丢弃的;

同时这边给出中文版一个蹩脚的翻译 :没有ICMP报文可以表示收到的ICMP报文中的校验和是错误的。 原版本的翻译是: there is no ICMP message to indicate a bad checksum in a received ICMP message,较为顺口的翻译应该是,在收到的ICMP报文中没有指示校验和错误的ICMP报文,即ICMP的报文不会去指错另一个ICMP的报文。

ICMP报文

ICMP报文可以分为两大类:

  • 有关IP数据包传递的ICMP报文(差错报文
  • 有关信息采集和配置的ICMP报文(查询或信息类报文

信息类报文包括回显请求和回显应答,以及路由器通告和路由器请求。

最常见的差错报文类型包括目的不可达,重定向,超时,和参数问题。

关于类型字段以及类型所使用的代码号表格在书本250页均有,这边不再强调

下面进一步讨论差错报文常用的类型:

目的不可达(ICMPv4类型3,ICMPv6类型1)和数据包太大(ICMPv6类型2)

目的不可这种类型的报文用来表示数据包无法送达目的地,其主要可细分成:

  • 主机不可达(ICMPv4代码1)和地址不可达(ICMPv6代码3)
    • 由路由器或主机产生,直接交付的时候由于某种原因无法到达目的地,例如主机关闭
  • 目的无路由(ICMPv6代码0)
    • 出现在到达数据包不必采用直接交付的方式来转发,但没有路由条目指定下一跳路由地址
  • 管理禁止通信(ICMPv4代码3)和目的管理禁止通信(ICMPv6代码1)
    • 通常是防火墙故意丢弃流量导致
  • 端口不可达(ICMPv4代码3)和端口不可达(ICMPv6代码4)
    • 当传入数据报的目的应用程序还没有准备好接收,就生成端口不可达报文

数据包太大(PTB):

如果一个IPv4路由器收到一个数据报大于选定的传出网络接口的MTU, 则其需要分片,但如果IP头部设置了不分片位字段,则其被丢弃。同时,产生ICMPv4目的不可达(PTB)报文,该报文能将下一跳的MTU包含在其中。

而在ICMPv6中,因为IPv6只有数据包的发送者才能执行数据包分片,所以只产生ICMPv6目的不可达(PTB)报文,该报文能将下一跳的MTU包含在其中。


重定向(ICMPv4类型5,ICMPv6类型137)

当路由器收到一个来自主机的不是给自己的数据报时,转发数据报到下一跳更好的路由,同时,路由器发送一个重定位报文到主机,使其更新路由表,这样下一次数据报直接就会到新定义的节点上。如图所示:

重定向报文包含了数据报下一跳正确路由器的IPv4地址。如图

超时(ICMPv4类型11,ICMPv6类型3)

当由于TTL或跳数限制字段值调小致使路由器丢弃报文时,产生ICMP超时报文

一个工具:traceroute工具,被用于确定发送者到目的地路径上的路由器。

工作方式:

  1. TTL置1
  2. 发送数据报,接收路由器的ICMP超时报文,如果该路由为最终路由则停止。
  3. TTL+=1
  4. 转回第二步

参数问题(ICMPv4类型12,ICMPv6类型4)

当一个主机或者路由器接收到一个IP数据报,其IP头部存在不可修复的问题时就会产生一个ICMP参数问题报文。一个特殊的参数报文指针字段只是了错误字段相对于出错的IP头部的偏移值。


下面进一步讨论信息类报文常用的类型:

回显请求/应答(ping)(ICMPv4类型0/8,ICMPv6类型129/128)

原理,收到ICMP回显请求报文后,ICMP要求将任何接收到的数据返回给发送方。报文格式如下

其中,标识符字段可以让发送主机利用,借此分离返回的应答。

当一个ping实例运行的时候,序列号从0开始,每发送一个回显请求报文便加1.
ping打印出每个返回的数据报的序列号,方便用户查看数据报是否丢失等。

路由器发现:路由器请求RS和通告RA(ICMPv4类型9,10)

首先定期使用TTL=1,对本地网络的所有主机组播(224.0.0.1)。使用RS报文发送到所有路由器组播地址(224.0.0.2),路由器发现的主要目的是让一台主机学习到它所在本地子网中的所有路由器,这样让他选好出一个默认的路由。


处理ICMP报文

传入的信息类请求将被操作系统自动处理,而差错类报文传递给用户进程或传输层协议

特例:重定向报文将导致主机路由表中的自动更新,目的不可达报文用于路径MTU发现机制(PMTUD)。这一般由传输层协议来实现。

ICMP差错报文

限制生成的ICMP差错报文的元婴是限制生成所谓的广播风暴,ICMPv4有以下情况:

  • ICMPv4差错报文
  • 目的地址是IPv4广播或组播地址
  • 作为链路层的广播数据报
  • 不是第一个分片的其他分片
  • 源地址为环回地址,广播或组播地址,零地址。

ICMPv6有以下情况:

  • ICMPv6差错报文
  • ICMPv6重定向报文
  • 目的地址是IPv6的组播地址数据报(除PTB和参数问题报文)
  • 链路层广播组播的数据包
  • 源地址为未指定或组播地址,或者任意为发送者所致的选播地址

限制ICMP报文数据的方法是使用令牌桶
每个桶保留最大数量的令牌,每个令牌允许一定数量的报文被发送。桶定期被新的令牌填充。每发送一个报文就减一,

一个概念:当发送一个ICMP差错报文的时候,它包含了一个完整的源自“违规”或者“原始”数据包的IP头部副本,再加上原始数据报的IP有效载荷区中的任何其他数据。

愿你是你所期待的样子

愿你还是你所期待的样子

Hide