ICMPv4 和 ICMPv6:Internet Control Message Protocol

8. ICMPv4 和 ICMPv6:Internet Control Message Protocol

8.1 介绍

IP 协议没有为终端系统提供直接地方法来了解没有到达目的地的 IP packet 的命运。此外,IP 也没有提供一个直接的方法来获取诊断信息 (e.g.,哪个路由器在延路径使用或一种用于评估 round-trip 时间方法)。为了解决这些缺陷,Internet Control Message Protocol(ICMP) 和 IP 一起结合使用以提供与 IP 协议层的配置和 IP packets 的配置相关的诊断和控制信息。ICMP 通常被认为是 IP 层本身的一部分,它应该存在于任何 IP 层的实现。它使用 IP 协议进行传输。所以,准确地说,它既不是网络层协议也不是传输层协议,而是在二者之间的协议。

ICMP 用于递交错误和控制消息。ICMP 消息通常被 IP 层本身,被更高层的传输层协议 (e.g.,TCP 或 UDP) 处理,一些情况下由用户应用处理。注意 ICMP 因为使用 IP 它不提供可靠性。相反,它指示某类失败和配置信息。包丢失最常见的原因(路由缓冲溢出) 不会列出任何 ICMP 信息。其他协议,例如 TCP,则能处理这种情况。

因为 ICMP 能影响重要的系统功能的运行以及获取配置信息,黑客在大量的攻击中使用 ICMP 消息。出于对此类攻击的担忧,网络管理员通常会设置防火墙来阻止 ICMP 消息,特别是 border routers。然而,如果 ICMP 被阻断,常用的诊断工具 (e.g.,ping,traceroute) 就不能正常工作了。

8.1.1 IPv4 和 IPv6 中的封装

ICMP 消息被封装在 IP datagrams 中进行传输,如图 8-1 所示:

在这里插入图片描述

在 IPv4 中,Protocol 字段值为1 表示 datagram 携带 ICMPv4。在 IPv6 中,ICMP 消息可能起始于 0 个或多个拓展 headers。ICMPv6 header 之前的最后的拓展 header 包含的 Next Header 字段值为 58。ICMP 消息可能如同其他 IP datagrams 一样被分片,虽然这并不常见。

在这里插入图片描述
在 ICMPv4 中,42 个不同的值为 Type 字段保留,它们标识特定的消息。然而,它们之中只有 8 个是常用的。很多类型的 ICMP 消息也使用不同的 Code 字段的值以进一步指定消息的含义。 Checksum 字段覆盖整个 ICMPv4 消息;在 ICMPv6 中它也覆盖继承自 IPv6 header 部分的 pseudo-header 。用于计算 checksum 的算法与第 5 章 IP header checksum 的算法相同。注意这是我们的第一个 end-to-end 检验和的例子。从 ICMP 消息的发送方到它的最终接收方,一直都会携带这个检验和。相反,第 5 章中讨论的 IPv4 header checksum 每一个 router hop 都会改变。如果一个 ICMP 实现接收接收到一个具有错误的检验和的 ICMP 消息,该消息被丢弃;没有 ICMP 消息用于表示接收到的 ICMP 消息具有错误的检验和。回想一下,IP 层对 datagram 的 payload 部分没有保护。如果 ICMP 不包含检验和,ICMP 消息的内容可能不正确,导致不正确的系统行为。

8.2 ICMP Message

现在我们来看一看常见的 ICMP 消息,并详细地看下其中最常用的一些。ICMP 消息被分为两大类:与递交 IP datagram 的错误相关的消息 (称为 error messages),和与信息收集和配置相关的消息 (称为 queryinformational message)。

8.2.1 ICMPv4 消息

对于 ICMPv4,信息消息包括 Echo Request 和 Echo Reply (分别是类型 8 和 0),和 Router Advertisement 和 Router Solicitation (分别为类型 9 和 10,它们一起被称为 Router Discovery)。最常见的错误类型是 Destination Unreachable (类型 3),Redirect (类型 5),Time Exceeded (类型 11),和 Parademeter Problem (类型 12)。表 8-1 列出标准 ICMPv4 定义的消息类型。

在这里插入图片描述

对于最常用的消息 (表 8-1 中类型号旁边具有 * 的),会使用表 8-2 中展示的 code number。一些消息能够携带拓展信息 [RFC4884] (在表 8-1 中标注了 + 号)。

ICMP 消息类型的官方列表由 IANA 维护。
在这里插入图片描述在这里插入图片描述

8.2.2 ICMPv6 消息

表 8-3 展现了为 ICMPv6 定义的消息类型。注意 ICMPv6 不仅仅负责错误消息和信息消息,还负责处理 IPv6 路由和主机配置。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在 ICMPv6 中,如同在 ICMPv4 中一样,消息被分为信息类和错误类。在 ICMPv6 中,所有的错误消息的 Type 字段的高位都是 0。因此 ICMPv6 的类型 0 到 127 都是错误,类型 128 到 255 都是信息。很多的信息消息都是 request/reply 对。

在这里插入图片描述

8.2.3 Processing of ICMP Message

在 ICMP 中,对到来信息的处理因系统而异。通常来说,到来的信息消息由操作系统自动处理错误信息被递交到用户进程或传输协议,例如 TCP [RFC5461]。进程能选择处理它们或忽略它们。这一通用规则的例外情况包括 Redirect 消息和 Destination Unreachable – Fragmentation Required 消息。前者导致主机的路由表自动更新,后者被用于 path MTU discovery (PMTUD) 机制,它通常由传输层协议实现,例如 TCP。在 ICMPv6 中,消息的处理有所加强。当处理到来的 ICMPv6 消息时,应用下列规则 [RFC 4443]:

  1. 未知的 ICMPv6 错误消息必须被递交到产生导致该错误的 datagram 的上层进程 (如果可能)。
  2. 未知的 ICMPv6 信息消息被丢弃。
  3. ICMPv6 错误消息包括尽可能多造成该错误的原始 IPv6 datagram,只要错误信息的 datagram 不超过最小的 IPv6 MTU (1280 字节)。
  4. 当处理 ICMPv6 错误消息时,上层协议类型从 original 的 packet (包含于 ICMPv6 错误消息的 body 中) 中提取出来。如果这不可能,错误消息在任何IPv6 层处理后被静默地丢弃。
  5. 有处理错误的特殊规则 (见 Section 8.3)。
  6. IPv6 节点必须限制它发送的 ICMPv6 错误消息的发送率。有很多不同的实现发送率限制的方法,包括 Section 8.3 提到的 token bucket 方法。

8.3 ICMP 错误消息

先前章节中提到的 ICMP 消息错误类与信息类之间的区别十分重要,因为 [RFC1812] 对生成 ICMPv4 错误消息施加了某些限制,[RFC4443] 对生成 ICMPv6 错误消息施加了某些限制,这些限制并不应用于查询。尤其是,ICMP 错误消息不作为对任何下述消息的响应发送:另一个 ICMP 错误消息,header 错误的 datagram (比如错误的 checksum),IP 层的 broadcast/multicast datagrams,封装于链接层 broadcast 或 multicast frames 中的 datagrams,具有非法的或 network zero 源地址的 datagram,任何非第一个的 fragment。对 ICMP 错误的生成施加这些约束的理由是限制所谓的 broadcast storms 的出现,在这种情况下少量消息的生成不想要的 traffic cascade (e.g.,无限地对错误响应响应一个错误响应)。这些规则能被总结如下:

不会生成 ICMPv4 错误消息以响应:

  • 一个 ICMPv4 错误消息。(然而,一个 ICMPv4 错误消息可能会作为对一个 ICMPv4 查询消息的响应。)
  • 目的地位 IPv4 broadcast 地址或 IPv4 multicast 地址 (通常被称为 D 类地址) 的 datagram。
  • 作物链接层 broadcast 发送的 datagram。
  • 不是第一个的 fragment。
  • 源地址没有定义位一个单独的主机的 datagram。这意味着源地址不能为 zero 地址,环回地址,broadcast 地址,或 multicast 地址。

ICMPv6 也类似。不会生成 ICMPv6 错误消息以响应:

  • ICMPv6 错误消息
  • ICMPv6 Redirect 消息
  • 目的地为 IPv6 multicast 地址的 packet,有两个例外:
    • Packet Too Big (PTB) 消息
    • Parameter Problem 消息 (code 2)
  • 作为链接层 multicast 发送的 packet (上述例外除外)
  • 作为链接层 broadcast 发送的 packet (上述例外除外)
  • 源地址没有唯一标识单个节点的 packet。这意味着源地址不能为一个未指定的地址,一个 IPv6 multicast 地址,或发送方已知的 anycast 地址。

除了管理 ICMP 消息生成条件的规则外,也有限制单个发送方的 ICMP 流量开销的限制。在 [RFC4443] 中, 推荐使用 token bucket 限制 ICMP 消息发送率。使用 token bucket 时,“bucket” 持有最大数量 (B) 的 “tokens”,每个 “token” 允许发送特定数量的消息。bucket 周期性的填上新的 tokens (以速率 N),且每发送一条消息就消耗 1 个。因此,token bucket (或 token bucket filter) 由参数 (B, N) 表征。对于小型或中型设备,[RFC4443] 提供一个示例 token bucket,使用参数 (10, 10)。Token bucket 是一种常见的用于在协议实现中限制带宽的机制,在很多情况下 B 和 N 是以字节为单位而非消息为单位。

当发送一个 ICMP 错误消息时,它包含一个完整的来自 “original” datagram 的 IP header (i.e.,造成该错误的 datagram 的 IP header,包含任何 IP 选项),加上任何来自源 datagram 的 IP payload 区域的数据,生成的 IP/ICMP datagram 的大小不能超过一个特定值。对于 IPv4 来说这个值是 576 字节,对于 IPv6 来说它是 IPv 最小的 MTU,至少是 1280 字节。包含部分来自源 IP datagram 的 payload 使接收 ICMP 模块将使用特定协议 (e.g.,TCP 或 UDP) 的消息与一个特定的用户进程关联起来,协议由 IP header 的 ProtocolNext header 字段确定,用户程序使用的端口由 TCP 或 UDP header 中的前 8 位确定,即 IP datagram 的 payload 区域的前 8 位。

在发布 [RFC 1812] 前,ICMP 仅需要包含源 IP datagram 的前 8 个字节 (因为这对确定 UDP 和 TCP 的端口号来说已经足够了;见第 10 章和第 12 章),但是更复杂的协议层流行起来了 (比如 IP 被封装进 IP 内),需要额外的信息来有效地诊断问题。另外,有几个错误信息可能包含extension。我们先简单的讨论下拓展方法,然后讨论更重要的 ICMP 错误消息。

8.3.1 拓展的 ICMP 和多部分消息

在这里插入图片描述
拓展结构可能被用于 ICMPv4 Destination Unreachable,Time Exeeded,和 Parameter Problem 消息和 ICMPv6 Destination Unreachable 和 Time Exceeded 消息。我们将在下面的章节查看这些细节。

8.3.2 Destination Unreachable (ICMPv4 Type 3, ICMPv6 Type 1) 和 Packet Too Big (ICMPv6 Type 2)

Destination Unreachable 类型的错误消息表示该 datagram 在所有路径上都不能递交给目的地,要么是因为传输过程中出现问题,要么是因为没有对其感兴趣的接收方。虽然在 ICMPv4 中为该消息定义了 16 个不同的 codes,只有 4 个是常用的。包括 Host Unreachable (code 1),Port Unreachable (code 3),Fragmentation Required/Don't-Fragment Specified (code 4),和 Communication Administratively Prohibited (Code 13)。在 ICMPv6 中,Destination Unreachable 消息是类型 1,有几个可能的 code 值。与 ICMPv4 相比,ICMPv6 中的 Fragmentation Required 消息被放在了完全的类型之下 (类型 2),但是其使用与 ICMP Destination Unreachable 消息非常相似,所以我们在这里讨论它。在 ICMPv6 中它被称为 Packet Too Big (PTB) 消息。我们将使用更简单的 ICMPv6 PTB 术语来指代 ICMPv4 (type 3, code 4) 消息和 ICMPv6 (type 2,code 0) 消息。

8.3.2.1 ICMPv4 Host Unreachable 和 ICMPv6 Address Unreachable

当以直接递交的方式发送 IP datagram 到某主机,但是因为一些理由不能抵达目的地,路由器或主机则会生成这一形式的 Destination Unreachable 消息。例如,最后一跳的路由器尝试向主机发送一个 ARP 请求,但是主机关机或断开了。

8.3.2.2 ICMPv6 No Route to Destination

该消息细化了 ICMPv4 的 Host Unreachable 消息,以区分因为直接递交失败而导致的主机不可达,和因为没有路由而导致的主机不可达。仅当到达的 datagram 必须被转发,但是没有路由条目指示下一跳使用的路由器,该消息被生成。正如我们所见,对于每个 IP 路由器收到 packet 来说,IP 路由器必须包含合法的指向目的地址的下一跳转发条目,才能成功进行转发。

8.3.2.3 ICMPv4 Communication Administratively Prohibited 和 ICMPv6 Communication with Destination Administratively Prohibited

在 ICMPv4 和 ICMPv6 中,这些 Destination Unreachable 消息能用于表明 administrative prohibition 阻止了和目的地的成功通讯。这通常是因为防火墙有意地丢弃未能遵循路由器实施的某些操作政策的流量,路由器发送一个 ICMP 错误。在很多情况下,不应该发布有一个用于丢失流量的特殊政策的事实,所以通常可能禁止这些消息的生成,要么通过静默的丢弃到来的 packets 或者生成一些其他的 ICMP 错误消息。

8.3.2.4 ICMPv4 Port Unreachable 和 ICMPv6 Port Unreachable

当到来的 datagram 的目的应用没有准备好接收该消息时,生成一个 Port Unreachable 消息。这在与 UDP 结合使用时最常见,当消息被发送到一个没有任何服务器进程正在使用的端口上时。如果 UDP 接收该 datagram 但是其目的端口号与进程当前使用的端口号不匹配,UDP 以一个 ICMP Port Unreachable 消息进行响应。

8.3.2.5 ICMPv4 PTB

如果一个 IPv4 路由器收到一个 datagram 并打算转发它,如果 datagram 不符合所选传出网络接口使用的 MTU,datagram 必须被 fragmented (见第十章)。如果到达的 datagram 在它的 IP header 中设置了 Don’t Fragment 位字段,它不会被转发,而是被丢弃,且这一 ICMPv4 Destination Unreachable (PTB) 消息被生成。因为发送这一消息的路由器知道下一跳的 MTU,它能在它生成的错误消息中包含该 MTU 值。

该消息最初打算用于进行网络诊断,但是已经被用于 path MTU discovery 了。PMTUD 被用于在与特定的主机通讯时,确定一个合适的 packet 大小,以避免不期望的 packet fragmentation。它的使用对 TCP 来说很常见,我们将在 14 章对它进行更详细的说明。

8.3.2.6 ICMPv6 PTB

在 ICMPv6 中,一个特殊的消息和类型码的结合被用于表示 packet 对下一跳的 MTU 来说太大了 (见图 8-6)。
在这里插入图片描述
该消息不是 Destination Unreachable 消息。回顾 IPv6,packet fragmentation 仅被 datagram 的发送方执行,且 MTU discovery 总应该被使用。因此,该消息主要被用于 IPv PMTUD 机制,但是在极少情况下,到达的 packet 也可能对下一跳来说太大了。因为在 PMTUD 运行后, packet 被注入到网络中后,路由可能会发生改变,此时对于路由器的传出 MTU 来说,到达的 packet 可能太大了。 与 ICMPv4 Destination Unreachable code 4(PTB) 消息的现代实现一样,建议的 packet MTU 大小,基于生成该 ICMP 消息的路由器的外出链接的 MTU,携带在消息中。

8.3.2.7 ICMPv6 Beyond Scope of Source Address

正如我们在第二章中所见,IPv6 使用不同作用域的地址。因此,构造一个源地址和目的地址处于不同的作用域的 packet 是有可能的。进一步来说,在同一作用域内目的地址可能不可达。例如,源地址使用 link-local 作用域的 packet 其目的地可能是需要经过多个路由器的 global 作用域。因为源地址范围不足,该 packet 被路由器直接丢弃,这种形式的 ICMPv6 错误用于指示这种问题。

8.3.2.8 ICMPv6 Source Address Failed Ingress/Egress Policy

Code 5 是 code 1 更细致的版本,当特定的进入或外出过滤政策是禁止成功递交 datagram 的理由时,使用它。例如,当主机尝试使用一个来自不期望网络前缀的源 IPv6 地址发送流量时,可能会使用这个错误。

8.3.2.9 ICMPv6 Reject Route to Destination

一个 rejectblocking route 是一个特殊的路由或转发表条目 (见第 5 章),它表明匹配的 packet 应该被丢弃,且一个 ICMPv6 Destination Unreachable Reject Route 消息应当被生成。(一个类似的条目类型被称为 blackhole route 也会导致匹配的 packet 被丢弃,但是通常不生成一个 Destination Unreachable 消息。) 这样的 route 可能被安装在路由器的转发表上以防止 packet 被发送到不期望的目的地导致泄漏。不期望的目的地可能包括 martian routes (在公共 Internet 上不使用的前缀) 和 bogons (未被分配的合法前缀)。

8.3.3 Redirect

如果路由器接收到来自主机的 datagram,且能确定对于递交 datagram 到它的目的地的主机来说,它不是正确的下一跳,路由器向主机发送一个 Redirect 消息,并将该 datagram 发送到正确的路由器(或主机)上。即,如果能确定对该 datagram 来说有比它本身更好的下一跳,它重定向该主机以更新它的转发表,这样未来对于对相同目的地的流量将被定向到新的节点。这一功能提供了一种粗糙的路由协议模式,指示 IP 转发功能 packets 应该发送到哪里。IP 转发的功能在第 5 章做了详细讨论。

在图 8-7 中,网络 segment 有一个主机和 2 个路由器,R1 和 R2。当主机不正确地发送一个 datagram 通过 R2,R2 通过发送一个 Redirect 消息到主机作为响应,然后转发 datagram 到 R1。虽然主机可能被配置为基于 ICMP redirects 更新它们的转发表,但是路由器不鼓励这样做,因为路由器使用动态路由协议,它们应该知道到所有可达的目的地的最好的下一跳节点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.3.4 ICMP Time Exceeded

每一个 IPv4 datagram 在它的 IPv4 header 中都有一个 Time-to-live 字段,每一个 IPv6 datagram 在它的 header 中都有一个 Hop limit 字段。按照最初的设想,8-bit 的 TTL 字段用于保存 datagram 允许在网络中剩余的存活秒数,在那之后它被强制丢弃 (如果存在转发循环,这很有用)。因为一个特殊的规则,每个路由器都必须将 TTL 字段的值至少减 1,结合事实 datagram 的转发时间被缩短为 1 秒的很小一部分,TTL 字段实际上用于 IPv4 datagram 在网络中的跳数限制,超过该限制后该 datagram 被路由器丢弃。这种使用方式被正式化并最终被 IPv6 采用。ICMP Time Exceeded 消息在路由器因为 TTLHop Limit 字段太小 (i.e.,到达值 0 或 1 且必须被转发) 而丢弃一个 datagram 时产生。该消息对 traceroute 工具 (在 Windows 中称为 tracert) 的正确执行十分重要。它的格式,在 ICMPv4 和 ICMPv6 中,如图 8-10 所示:

在这里插入图片描述
这一消息的另一个不怎么常见的变体是在一个 fragmented IP datagram 只有部分到达它的目的地 (i.e.,所有的 fragments 没有在一个时间段内全部抵达)。在这种情况下,一个 ICMP Time Exceeded 消息被用于通知发送方整个 datagram 被丢弃。回想一下,如果有任何 datagram 的 fragment 被丢弃,整个 datagram 就丢失了。

8.3.5 Parameter Problem

ICMP Paremeter Proble 消息由接收到其 header 中包含一些不能修复的问题的 datagram 的路由器和主机产生。但一个 datagram 不能被处理且没有其他的 ICMP 消息能充分描述该问题,该消息充当一种 “catchall” 错误状态指示器。在 ICMPv4 和 ICMPv6 中,如果在 header 中有错误,例如一些字段在可接收的值范围之外,一个特殊的 ICMP 错误消息 Pointer 字段表示发现错误的字段的字节偏移,相对于错误的 IP header 的起始。例如,ICMPv4 中,Pointer 字段的值为 1 表示一个错误的 DS 字段或 ECN 字段 (这些字段曾被称为 IPv4 Type of SeriveToS Byte,现在已被重定义和重命名了,见第 5 章)。ICMPv4 Parameter Problem 消息的格式如图 8-14 所示。

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

8.4 ICMP Query/Informational Messages

虽然 ICMP 定义了一系列的查询消息,例如 Address Mask Request/Reply,Timestamp Request/Reply,和 Information Request/Reply,这些功能已经被其他更加目的特化的协议 (包括 DHCP 协议,见第 6 章) 代替了。仅存的流行的 ICMP query/informational 消息是 Echo Request/Response 消息,更常被称为 ping,以及 Router Discovery 消息。即使 Router Discovery 在 IPv4 中并没有广泛使用,但是它在 IPv6 中的类似物 (Neighbor Discovery 的一部分) 是很基础的东西。 另外,ICMPv6 被拓展为支持 Mobile IPv6 以及发现具有多播能力的路由器。在本节,我们研究 Echo Request/Reply 功能,和用于基本的路由器的消息,以及 Multicast Listener Discovery (见第 6 章和第 9 章)。在随后的章节中,我们探究 IPv6 中 Neighbor Discovery 的操作。

8.4.1 Echo Request/Reply (ping)

最常用的 ICMP 消息对之一是 Echo Request 和 Echo Response (或 Reply)。ICMP Echo Request 消息可能具有任意大小 (受限于封装的 IP datagram 的最终大小)。ICMP 实现需要使用 ICMP Echo Reply 消息返回任何接收到的消息给发送者,即使需要多个 IP fragments。ICMP Echo Request/Response 消息格式如图 8-16 所示。

和其他的 ICMP query/informational 消息一样,服务器必须在 Reply 中回射 IdentifierSequence number 字段。

在这里插入图片描述
这些消息由 ping 程序发送,它常被用于快速确认计算机是否在 Internet 上可达。如果你能够 “ping” 一个主机,你几乎就能确信能通过其他方法 (远程登录,其他服务,等) 抵达该主机。然而,随着防火墙的普遍使用,这一点现在还远不能确定。

8.9 Note

  1. Internet Control Message Protocol (IMCP) 用于传输错误和控制消息。
  2. ICMP 使用 IP 协议传输。
  3. Checksum 覆盖整个 ICMPv4 消息,因为 IP 协议的 Checksum 对 datagram 的 payload 部分不做检查。
  4. 信息消息由操作系统自动处理,错误消息传递到用户进程或传输协议。
  5. 制定规则限制 ICMP 消息的生成,使用 “token bucket” 限制单个发送方的 ICMP 流量开销。
  6. Destination Unreachable 错误消息表示 datagram 在所有路径上都不能被递交到目的地。
  7. Destination Unreachable 错误消息包括 Host Unreachable,Port Unreachable,Fragmentation Required/Don’t-Fragment Specified,Communication Administratively Prohibited
  8. Redirect 错误消息表示接收到 datagram 的路由器不是正确的 (最适合的) 下一跳,路由器向发送该 datagram 的主机发送 Redirect ICMP 错误消息,更新主机上的路由条目,并向正确的路由器或主机转发该 datagram。
  9. ICMP Time Exceeded 错误消息表示 datagram 的 TTL (IPv4) 或 Hop limit (IPv6) 耗尽,该 datagram 被路由器丢弃。
  10. Parameter Problem 错误消息表示路由器或主机接收到的 datagram 的 header 有不可修复的问题。
  11. Echo Request/Reply 或 ping 被用于快速检测某主机在 Internet 上是否可达,但是受防火墙影响,其他方式不一定能抵达该主机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值