RFC792-ICMP

RFC 全英文文档,看两分钟会睡着的,只能自己用汉字组织一遍了。。。

介绍

网际协议(即 IP 协议)是一个用于在同一网络中端到端(即一个计算机到另一个计算机)之间的传递数据报协议。网络中的连接设备我们称之为网关(这里说的网关就是交换机、路由器等的统称)。为了对网络进行控制,这些网关之间会通过 GGP 协议(即 Gateway to Gateway Protocol)进行交流。有时候,一个网关或者目的主机需要与源主机通信,例如,向源主机报告数据报处理过程中发生的错误。这时候就得需要用到了我们正要说的网际消息控制协议(即 ICMP,Internet Control Message Protocol)了。ICMP 协议尽管是比 IP 协议更高一层的协议,但是它使用了基本的 IP 协议的形式,因此 ICMP 通常被当做 IP 协议的一部分,并且每个 IP 模块都得实现 ICMP 协议。
一般出现以下几种情况时会用到 ICMP 消息:

  1. 一个数据报不能抵达它的目的地;
  2. 一个网关没有足够的容量来运送数据报;
  3. 一个网关有更短的路由来发送数据报;

IP 协议是一种不可靠协议。所以 ICMP 这种控制协议被设计出来的目的就是在使用 IP 协议通信出现问题时提供反馈,但仍然不能让 IP 变得可靠。我们并不能保证一个数据报一定会送到目的主机或者一个控制消息一定会被返回。一些数据报可能在没有任何丢失报告的情况下丢失。如果想要实现可靠性通信,基于 IP 协议的高层协议必须自己设定可靠性规则。
ICMP 消息一般在处理数据报出错时用来报告错误。为了避免无限的发送 ICMP 消息,比如:对于 ICMP 消息自身没有被发送到目的地。所以 ICMP 消息仅仅用来发送在处理数据报帧中的第 0 帧(实际上就是第一帧的意思,这里说 0 是指第一帧的偏移量为 0)时发生的错误。

消息格式

ICMP 消息使用了 IP 协议的头部。数据部分的第一个字节表示 ICMP 消息的类型,而 ICMP 消息的类型决定了剩余数据的格式。任何带有“未使用”标记的字段都是目前保留字段以便日后扩展,这些字段在实际的消息中被设置为零,消息接收者并不需要处理这些字段(比如在校验和的过程中包括它们)。除非有特别说明,ICMP 消息的头部字段的值应该像下面这样:

Field Name Field Value
Version 4
IHL 消息头的长度(单位是 32 位字)
服务类型 0
总长度 整个消息的长度(单位是字节)
Identification 与数据报的帧有关,见 IP 协议
Flags 与数据报的帧有关,见 IP 协议
Fragment Offset 与数据报的帧有关,见 IP 协议
Time to Live 早期定义的是消息在网络上存活的秒数;实际使用中它在网关之间逐跳递减,因此这个值应该至少等于该消息需要穿过的网关数
Protocol ICMP = 1
头部校验和 对头部数据计算得出的 16 位的校验和。对头部数据计算校验和时,校验和字段应该为零。这种校验和算法在将来可能会被替换掉
源地址 发送 ICMP 消息的网关或者主机的 IP 地址。如无特殊说明,该字段可以是任何网关的地址
目的地址 接收 ICMP 消息的网关或者主机的 IP 地址

目的地不可达消息

消息格式如图:
目的地不可达消息
字段解释:

  1. Type: 3(至于为啥是三?因为协议规定是三你就得用三)
  2. Code:
    • 0: net unreachable
    • 1: host unreachable
    • 2: protocol unreachable
    • 3: port unreachable
    • 4: fragmentation needed and DF set
    • 5: source route failed
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Internet Header + 64 bits of Data Datagram:尼玛,这个字段没看懂是干啥的,,

细节描述:

  1. 如果根据网关路由表查询后的结果是该消息的目的地不可达(比如到达目的地的距离无限远),那么该网关可能就会发送一个目的地不可达消息给源主机。另外,一些网络里,网关可以决定某些目的地是否是不可达。
  2. 目的主机如果由于指定的协议模块或者端口未激活而不能运送这个数据报,那么目的主机就可能会发送一个不可达消息到源主机。
  3. 其他的情况还有,比如某一个网关缓存容量较小,必须会数据报分帧才能运送数据报,然而该数据报设置了禁止分帧标志位。那么该网关可能会丢弃该数据报,并返回一个目的地不可达的消息。
  4. code 0,1,4,5 可能从一个网关发出。code 2 和 3 可能从一个主机发出。

超时消息

消息格式如图:
超时消息
字段解释:

  1. Type: 11
  2. Code:
    • 0: time to live exceeded in transit
    • 1: fragment reassembly time exceeded
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Internet Header + 64 bits of Data Datagram:尼玛,这个字段没看懂是干啥的,,

细节描述:

  1. 如果一个网关在处理某个数据报时发现该数据报的 TTL(Time to Live)字段为零,那么它必须丢弃该数据报。这个网关也许会通过发送超时消息来通知源主机。
  2. 如果目的主机重新组装数据报的各个分帧时由于缺少某些帧而不能在限定时间内完成组装,那么它将会丢弃这个数据报,并且它可能会发送一个超时消息到源主机。
  3. 如果零帧不可用,那么也不必再发送超时消息了。
  4. code 0 可能从一个网关发出。code 1 可能从一个主机发出。

参数问题消息

消息格式如图:
参数问题消息
字段解释:

  1. Type: 12
  2. Code:
    • 0: pointer indicates the error
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Internet Header + 64 bits of Data Datagram:尼玛,这个字段没看懂是干啥的,,

细节描述:

  1. 如果一个网关或者主机在处理一个数据报时发现一个头部参数错误以致其不能完成头部完整性处理,那么它必须丢弃该数据报。对于这种问题,一个可能的原因就是该数据报的头部可选项中设置了错误的参数。该网关或主机可能会发送参数问题消息到源主机。参数问题消息只有这种错误导致数据报被丢弃时发送。
  2. 在错误被检测出来的地方,指针会指明原始数据报头部的八位字节组。例如,1 表示服务类型字段有错,20 表示第一个可选项的类型码有误。
  3. code 0 可能从一个网关发出,也可能从一个主机发出。

源端熄火消息

消息格式如图:
源端熄火消息
字段解释:

  1. Type: 4
  2. Code:
    • 0
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Internet Header + 64 bits of Data Datagram:尼玛,这个字段没看懂是干啥的,,

细节描述:

  1. 如果一个网关没有足够的缓冲区空间来存放某个数据报时,那么这个网关可能就会丢弃这个数据报。如果网关丢弃了这个数据报,那么它可能会向源端发送一个源端熄火消息以通知源端主机降低发送数据报的速度。如果数据报被运送到目的主机的速度过快以致目的主机不能处理掉该数据报,那么目的主机可能会向源端发送一个源端熄火消息以通知源端主机降低发送数据报的速度。网关也许会对它丢弃的每一个数据报都发送一个相应的源端熄火消息。当收到一个源端熄火消息后,源主机应该降低其向特定目的地发送数据报的速度直到它不再收到源端熄火消息。然后源主机可以逐渐增加发送数据报的速度直到它再次接收到源端熄火消息。
  2. 网关或者主机也许会在用完其缓冲区容量之前向源端发送源端熄火消息,而不是当缓冲区容量已经超出了才发送这个消息。这也就意味着触发了源端熄火消息的数据报可能被正确运送了。
  3. code 0 可能从一个网关发出,也可能从一个主机发出。

重定向消息

消息格式如图:
重定向消息
字段解释:

  1. Type: 5
  2. Code:
    • 0: Redirect datagrams for the Network
    • 1: Redirect datagrams for the Host
    • 2: Redirect datagrams for the Type of Service and Netword
    • 3: Redirect datagrams for the Type of Service and Host
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Gateway Internet Address:指定了原始数据报需要发往的目的网关地址
  5. Internet Header + 64 bits of Data Datagram:尼玛,这个字段没看懂是干啥的,,

细节描述:

  1. 当某个要发送网络 X 的数据报到达网关 G1 时,网关 G1 发现自己需要先把数据报发送到位于网络 X 上的网关 G2,这时网关 G1 就会通知源主机直接把数据报发送到网关 G2,因为那才是较短路由。
  2. 如果数据报指定了 IP 源路由选项和目的地址的网关地址,那么即使有更短的路由,也不会有网关发送重定向消息的。
  3. code 0,1,2,3 可能从一个网关发出。

Echo or Echo Reply Message

消息格式如图:
Echo or Echo Reply Message
字段解释:

  1. Type:
    • 0:for echo reply message
    • 8:for echo message
  2. Code:
    • 0:
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Identifier:如果 code 的值是零,那么这个字段就用来匹配 echo 或者 reply,一般也直接设置为 0
  5. Sequence Number:如果 code 的值是零,那么这个字段就用来匹配 echo 或者 reply,一般也直接设置为 0

细节描述:

  1. 在 echo 消息中接收到的数据必须在 reply 消息中返回
  2. Identifier 和 Sequence Number 字段可以用来做一些标志位。比如:将 Identifier 的值设置为 TCP 或者 UDP 的端口号来维持一个会话,Sequence Number 在每个 echo 消息中递增,用来表示发送消息的次数。
  3. code 0 可能从一个网关发出,也可能从一个主机发出

Timestamp or Timestamp Reply Message

消息格式如图:
Timestamp or Timestamp Reply Message
字段解释:

  1. Type:
    • 13:for timestamp message
    • 14:for timestamp reply message
  2. Code:
    • 0:
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Identifier:如果 code 的值是零,那么这个字段就用来匹配 timestamp 或者 replies,一般也直接设置为 0
  5. Sequence Number:如果 code 的值是零,那么这个字段就用来匹配 timestamp 或者 replies,一般也直接设置为 0

细节描述:

  1. 在 echo 消息中接收到的数据必须在 reply 消息中返回
  2. Identifier 和 Sequence Number 字段可以用来做一些标志位。比如:将 Identifier 的值设置为 TCP 或者 UDP 的端口号来维持一个会话,Sequence Number 在每个 echo 消息中递增,用来表示发送消息的次数。
  3. code 0 可能从一个网关发出,也可能从一个主机发出

Information Request or Information Reply Message

消息格式如图:
Information Request or Information Reply Message
字段解释:

  1. Type:
    • 15:for information request message
    • 16:for information reply message
  2. Code:
    • 0:
  3. Checksum: 校验和是用于消息完整性校验的。计算校验和时,校验和字段置为零。这个字段将来可能会发生改变。
  4. Identifier:如果 code 的值是零,那么这个字段就用来匹配 timestamp 或者 replies,一般也直接设置为 0
  5. Sequence Number:如果 code 的值是零,那么这个字段就用来匹配 timestamp 或者 replies,一般也直接设置为 0

细节描述:

  1. 当数据报的 IP 头部中的源地址和目的地址字段的值都为零的时候,这种消息会被发送。因此对于一个主机来说这种消息是搞明白自身所处网络号的方法。
  2. Identifier 和 Sequence Number 字段可以用来做一些标志位。比如:将 Identifier 的值设置为 TCP 或者 UDP 的端口号来维持一个会话,Sequence Number 在每个 echo 消息中递增,用来表示发送消息的次数。
  3. code 0 可能从一个网关发出,也可能从一个主机发出

Summary of Message Types

  1. 0: Echo Reply
  2. 3: Destination Unreachable
  3. 4: Source Quench
  4. 5: Redirect
  5. 8: Echo
  6. 11: Time Exceeded
  7. 12: Parameter Problem
  8. 13: Timestamp
  9. 14: Timestamp Reply
  10. 15: Information Request
  11. 16: Information Reply

生词学习

  1. obsolete:废弃
  2. datagram:数据报
  3. catenet:互联网,大型网络
  4. occasionally:偶尔
  5. integral:部分,整体
  6. forward:向前,运送
  7. octet:八位位组,八字节
  8. portion:部分
  9. appropriate:适当的,恰当的
  10. indicated:表明的,显示
  11. exceed:超过,胜过
  12. transit:运输,经过
  13. potential:潜在的
  14. identify:识别,辨认
  15. quench:熄灭,平息
  16. ultimate:最终的,极限的,根本的