目录

ICMP

IPv4/v6 协议是尽力传输的网络协议,提供的数据传输服务是不可靠的、无连接的,不能保证数据包能成功到达目的地。所以,还需要另外的一个网络层协议来提供错误检测和错误报告功能,这就是 ICMPv4/v6(Internet Control Message Protocol,互联网控制消息协议)。

需要注意的是,ICMP Msg 是通过 IP 协议进行传输,但它的目的并不是让 IP 成为一种可靠的协议,而是对传输中发生的问题进行反馈。ICMP 消息的传输同样得不到可靠性保证,也有可能在传输过程中丢失。因此 ICMP 不是传输层的补充,应该把它当做网络层协议。

ICMP 的主要功能:

  1. 确认 IP 数据包能够成功送达目的 IP 地址。
  2. 报告 IP 数据包无法送达的原因。

ICMP 以此来检测 IP 网络是否正常、网络配置是否正确、设备是否异常等信息,继而便于进行网络问题的监控、告警以及诊断。

ICMPv4 协议栈

互联网协议 — ICMP 互联网控制消息协议_响应报文

  • type(类型):表示 ICMP 消息的类型。
  • code(代码):表示 ICMP 消息的具体含义。

例如:type 为 3 表示 Destination Unreachable Message(目的不可达消息),若 code 值为 0 表示 Network Unreachable(目的网络不可达)。

ICMPv4 的消息类型

常见的 ICMP 消息类型如下图所示。

互联网协议 — ICMP 互联网控制消息协议_响应报文_02

从功能上,ICMP 的消息可分为两类:

  1. 用于通知出错原因的错误消息。
  2. 用于诊断的查询消息。

互联网协议 — ICMP 互联网控制消息协议_路由表_03

Echo Request & Echo Reply Msg

最常用的 ping 命令就是使用 Echo Request 和 Echo Reply 来实现的。

  • Echo Request(回送请求消息):由源设备(主机、路由器等)向一个指定的目的设备发出的请求。这种消息用来测试目的地是否可达。
  • Echo Reply(回送响应消息):对 Echo Request 的响应。目的设备发送 Echo Reply 来响应收到的 Echo Request 。

互联网协议 — ICMP 互联网控制消息协议_路由表_04

  • NOTE: The Data (Variable length) received in the echo message must be returned in the echo reply message.
    互联网协议 — ICMP 互联网控制消息协议_路由表_05

Destination Unreachable Msg

  • Destination Unreachable(目的不可达):当路由器无法将 IP 包发送给目的地址时,会给源设备返回一个 Destination Unreachable 消息,并在消息中显示不可达的具体原因。

互联网协议 — ICMP 互联网控制消息协议_其他_06

例如:经常会遇到的 code 为 1 ,表示主机不可达,指路由表中没有目的设备的信息,或目的设备没有连接到网络。

互联网协议 — ICMP 互联网控制消息协议_响应报文_07

Parameter Problem Msg

  • Parameter Problem(参数问题):路由器发现 IP 包头出现错误或非法值后,向源设备发送一个 Parameter Problem 消息。这个消息包含有问题的 IP 头,或错误字段的提示信息。

互联网协议 — ICMP 互联网控制消息协议_响应报文_08

Redirect Msg

  • Redirect(重定向):如果路由器发现一条更优的路径发送数据,那么它就会返回一个 Redirect 消息给主机。这个消息包含了最合适的路由信息和源数据。

注意,Redirect 消息可能会引发路由问题,所以不进行这种设置。比如:路由器的路由表不准确时,ICMP 有可能就无法正常工作。

互联网协议 — ICMP 互联网控制消息协议_其他_09

Time Exceeded Msg

Time Exceeded(超时):IP 包中有一个字段是 TTL(生存周期),它的值每经过一次路由器就减 1 ,直到减到 0 时 IP 包会被丢弃。这时,路由器会发送一个 Time Exceeded 消息给源设备,并通知 IP 包已被丢弃。

设置 TTL 的主要目的,是当路由发生环路时,避免 IP 包无休止的在网络上转发。还可以用 TTL 控制 IP 包的可达范围,比如设置一个较小的 TTL 值。

互联网协议 — ICMP 互联网控制消息协议_路由表_10

Timestamp Request & Timestamp Reply Msg

时间戳可以记录 ICMP 消息一次往返所需的时间。源设备发送一个带有发送时间的 Timestamp Request 消息,目的设备收到后,发送一个带有原设备发送时间、目的设备接收时间以及目的设备发送时间的 Timestamp Reply 消息。源设备收到 Timestamp Reply 时,并同时记录到达时间。这些时间戳可以估计网络上的传输时间。

互联网协议 — ICMP 互联网控制消息协议_路由表_11

ICMP 的应用

ICMP 被广泛应用于网络测试,最常用的 ping 和 traceroute 网络测试工具,都是使用 ICMP 协议实现的。

ping

使用 ping 命令时,源设备向目的设备发送 Echo request 消息,目的地址是目的设备的 IP 地址。目的设备收到 Echo request 消息后,向源设备回应一个 Echo reply 消息,可知目的设备是可达的。

互联网协议 — ICMP 互联网控制消息协议_字段_12

  • 如果中间某个路由器没有到达目的网络的路由,便会向源设备回应一个 Destination Unreachable 消息,告知目的设备不可达。
    互联网协议 — ICMP 互联网控制消息协议_字段_13

  • 如果源主机在一定时间内无法收到回应报文,就认为目的设备不可达,并显示超时。
    互联网协议 — ICMP 互联网控制消息协议_响应报文_14

traceroute

ping 工具只能测试目的设备的连通性,但是看不到数据包的传输路径。所以在网络不通的情况下,无法知道网络问题发生在哪个位置。traceroute 工具可以查看数据包的整条传输路径,包括途中经过的中间设备。

IP 头部的 TTL 字段是为避免数据包循环转发而设计的。每经过一个路由器,数据包头中的 TTL 值减 1 。如果 TTL 值为 0 则丢弃报文,并向源设备回应一个 Time Exceeded 消息,告知错误类型。tracert 就是基于 TTL 字段和 ICMP 协议实现的。在 Windows 中命令是 tracert ,在 Unix 、MacOS 中命令是 traceroute 。

使用 traceroute 命令时,源设备的 traceroute 逐跳发送数据包,并等待每一个响应报文。发送第一个数据包时,TTL 值设为 1 。第一个路由器收到数据包后 TTL 值减 1 ,随即丢弃数据包,并返回一个 Time Exceeded 消息。源设备的 traceroute 收到响应报文后,取出源 IP 地址,即路径上的第一个路由器地址。然后 traceroute 发送一个 TTL 值为 2 的数据包。第一个路由器将 TTL 值减 1 ,并转发数据包。第二个路由器再将 TTL 值减 1 ,丢弃数据包并返回一个 Time Exceeded 消息。traceroute 收到响应报文后,取出源 IP 地址,即路径上的第二个路由器地址。类似步骤,traceroute 逐跳获得每一个路由器的地址,并探测到目的设备的可达性。