网际控制报文协议 ICMP

2022-12-18 计算机网络 网络层

为了更有效地转发 IP 数据报以及提高 IP 数据报交付成功的机会,TCP/IP 体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)[RFC 792] (opens new window)

主机或路由器使用 ICMP 来发送差错报告报文和询问报文。ICMP 报文被封装在 IP 数据报中发送,如下图所示。

# 一、ICMP 报文的种类

# 1.1 ICMP 差错报告报文

终点不可达

当路由器或主机不能交付 IP 数据报时,就向源点发送终点不可达报文。具体可再根据 ICMP 的代码自担细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等 13 种错误。

源点抑制

当路由器或主机由于拥塞而丢弃 IP 数据报时,就会向源点发送源点抑制报文,使源主机知道应当把 IP 数据报的发送频率放慢。

时间超过(超时)

当路由器收到一个目的地址不是自己的 IP 数据报时,会将其首部的生存时间 TTL 字段的值减一。

  • 若结果不为 0,则路由器将该数据报转发出去;
  • 若结果为 0,路由器不但要丢弃该数据报,还要向源点发送时间超过(超时)报文。

另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报分片丢弃,也会向源点发送时间超过(超时)报文。

参数问题

当路由器或目的主机收到 IP 数据报后,根据其首部中的检验和字段的值发现首部在传送过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。

改变路由(重定向)

路由器把改变路由报文发送给主机,让主机知道下一应将数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机。

注意

以下情况不应发送 ICMP 差错报告报文:

  • 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
  • 对第一个分片的 IP 数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
  • 对具有多播地址的 IP 数据报都不发送 ICMP 差错报告报文。
  • 对具有特殊地址(例如 127.0.0.0 或 0.0.0.0)的 IP 数据报不发送 ICMP 差错报告报文。

# 1.2 ICMP 询问报文

回送请求和回答

  • 由主机或路由器向一个特定的目的主机或路由器发出。
  • 收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送 ICMP 回送回答报文。
  • 这种询问报文用来测试目的站是否可达以及了解其有关状态。

时间戳请求和回答

  • 用来请求某个主机或路由器回答当前的日期和时间。
  • 在 ICMP 时间戳回答报文中有一个 32 比特的字段,其中写入的整数代表从 1900 年 1 月 1 日起到当前时刻一共有多少秒。
  • 这种询问报文用来进行时钟同步和测量时间。

# 二、ICMP 的典型应用

# 2.1 分组网间探测 PING

分组网间探测(Packet InterNet Groper,PING)用来测试主机或路由器之间的连通性。

PING 是 TCP/IP 体系结构的 应用层直接使用网际层 ICMP 的一个例子,它并不使用运输层的 TCP 或 UDP。PING 应用所使用的 ICMP 报文类型为回送请求和回答。

上图中,PC 共发送了四个 ICMP 回送请求报文,并且成功收到了相应的四个 ICMP 回送回答报文。由于往返的 ICMP 报文上都有时间戳,因此很容易得出往返时间。

# 2.2 跟踪路由 traceroute

跟踪路由 traceroute 应用,用于探测 IP 数据报从源主机到达目的主机要经过哪些路由器。

具体原理是由源主机向目的主机发送 ICMP 回送请求和回答报文,将 IP 数据报首部中生存时间 TTL 字段的值从 1 不断递增,这样就可以收到链路上每个路由器发出的差错报告报文,直至到达目的主机,具体如下图所示。

# 三、参考资料

Last Updated: 2023-01-28 4:31:25