文章目录
  1. 概述
  2. ICMP差错报告报文
  3. ICMP询问报文
  4. ICMP应用举例

概述

为更有效地转发IP数据报,在网络层使用网际控制报文协议ICMP。ICMP允许路由器或主机报告IP数据报的差错情况。ICMP报文格式如下:

 

ICMP报文分两种:ICMP差错报告报文与ICMP询问报文。ICMP报文前4字节是包含3个字段(类型、代码、校验和)的固定格式,接下来4个字节的内容与ICMP的类型有关。最后的数据字段取决于ICMP的类型。下表给出常用的ICMP报文类型。

 

下面具体介绍。

ICMP差错报告报文

ICMP差错报告报文主要有以下4种:

  • 终点不可达。路由器或主机无法交付数据报。
  • 时间超过。路由器收到生存时间为0的数据报,丢弃该数据报,并向数据报的源点发送时间超过ICMP报文。
  • 参数问题。路由器或目的主机收到的数据报头部有不正确字段,则丢弃该数据报,向源点发送参数问题报文。
  • 改变路由(重定向)。路由器将改变路由报文发送给主机,告知主机下次将报文发送给另外的路由器。

对于需要进行差错报告的IP数据报,路由器或主机会将IP头部与IP数据字段的前8字节取出,作为ICMP报文的数据字段,再填写ICMP头部得到ICMP报文。

 

对于以下几种情形,均不发送ICMP差错报文。

  • 对ICMP报文,它也是IP数据报,但是对于它的差错情况无需发送ICMP差错报文;
  • 一个IP数据包出错,路由器发送ICMP差错报文后,同属于这一数据报的数据包的差错情况不用再发ICMP差错报文;
  • 对具有多播地址或特殊地址(127.0.0.0、0.0.0.0)的数据报,均不发送ICMP差错报文;

ICMP询问报文

(1)回送请求与回答;ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给查询方回复ICMP回送回答报文。这类报文用来测试目的站是否可达以及了解其相关状态。

(2)时间戳请求与回答;ICMP时间戳请求报文向目的主机或路由器查询当前日期与时间,这类报文用于时钟同步与时间测量。

ICMP应用举例

unix/Linux上的应用traceroute可以显示一个数据报从源点到终点的路径,此工具的原理如下。

traceroute从源主机向目的主机发送UDP数据报,第一个数据报P1的生存时间TTL设为1,那么当P1到达路径上第一个路由器R1时,R1将其接收,并将P1的TTL减1,于是TTL等于0,R1便将P1丢弃并向源主机发送一个ICMP时间超过差错报告报文,于是traceroute就得到了路径上的第一个路由器的IP地址;

第二个数据报P2的生存时间TTL设为2从而得到路径上的第二个路由器的IP地址;以此类推,直到UDP数据报恰能到达目的主机,但是由于UDP报文中的目的端口不正确(不存在对应于该端口号的应用进程),目的主机就会丢弃该报文,并向源主机发送ICMP终点不可达差错报告报文。