RFC792:INTERNET CONTROL MESSAGE PROTOCOL,September 1981 DARPA INTERNET PROGRAM PROTOCOL SPECIFICATION
介绍
Internet 协议 (IP) [1] 用于在称为 Catenet [2] 的互连网络系统中的主机到主机数据报服务。网络连接设备称为网关。这些网关为了控制目的通过网关到网关协议 (Gateway to Gateway Protocol,GGP) [3,4] 在它们之间进行通信。有时,网关或目标主机会与源主机通信,例如,报告数据报处理中的错误。为此目的,使用该协议,即Internet控制消息协议 (Internet Control Message Protocol,ICMP)。ICMP,使用IP的基础支持,就好像它是一个更高级别的协议,然而,ICMP实际上是IP的一个组成部分,必须由每个IP模块来实现。
ICMP 消息在几种情况下发送:例如,当数据报无法到达其目的地时,当网关没有缓冲能力来转发数据报时,以及当网关可以指示主机在更短的路由上发送流量时。
Internet 协议的设计并非绝对可靠。这些控制消息的目的是提供有关通信环境中问题的反馈,而不是使 IP 可靠。仍然不能保证数据报将被传递或控制消息将被返回。某些数据报可能仍未送达,而没有任何丢失报告。如果需要可靠的通信,使用 IP 的更高级别的协议必须实现自己的可靠性程序。
ICMP 消息通常会报告数据报处理过程中的错误。为了避免消息等消息的无限回归,不发送有关ICMP消息的ICMP消息。此外,ICMP 消息仅发送有关处理分段数据报的分段零时出现的错误。(片段零的片段偏移量为零)。
1、 消息格式
ICMP 消息使用基本 IP 报头发送。数据报数据部分的第一个八位字节是 ICMP 类型字段;该字段的值决定了剩余数据的格式。任何标记为“未使用”的字段都保留用于以后的扩展,并且在发送时必须为零,但接收方不应使用这些字段(除非将它们包含在校验和中)。除非在个别格式说明下另有说明,互联网头字段的值如下:
版本/ Version
4
IHL
以 32 位字为单位的 Internet 标头长度(Internet header length)。
服务类型/ Type of Service
0
总长度/ Total Length
互联网标头和数据的长度(以八位字节为单位)。
标识、标志、片段偏移
Identification, Flags, Fragment Offset。用于分片,见[1]。
生存时间/ Time to Live
以秒为单位的生存时间;由于该字段在处理数据报的每台机器上都会递减,因此该字段中的值至少应与该数据报将穿越的网关数量一样大。
协议/ Protocol
ICMP = 1
头校验和/ Header Checksum
报头中所有 16 位字的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
源地址/ Source Address
组成 ICMP 消息的网关或主机的地址。除非另有说明,否则这可以是任何网关地址。
目的地址/ Destination Address
消息应发送到的网关或主机的地址。
2、 目的地不可达消息
IP字段:
目的地址
来自原始数据报数据的源网络和地址。
ICMP 字段:
类型/ Type
3
代码/ Code
0 = 网络不可达; 1 = 主机不可达; 2 = 协议不可达; 3 = 端口不可达; 4 = 需要分片和 DF 设置; 5 = 源路由失败。
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
Internet报头 + 64 位数据数据报
Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
描述/ Description
如果根据网关的路由表中的信息,数据报的互联网目的域中指定的网络不可达,例如到网络的距离是无穷大,网关可以向互联网源主机发送数据报目的不可达消息。此外,在某些网络中,网关可能能够确定 Internet 目标主机是否无法访问。当目标主机不可达时,这些网络中的网关可能会向源主机发送目标不可达消息。
如果在目标主机中,IP 模块由于指示的协议模块或进程端口不活动而无法传递数据报,则目标主机可以向源主机发送目标不可达消息。
另一种情况是数据报必须被分片才能由网关转发,但不要分片标志是打开的。在这种情况下,网关必须丢弃数据报并可能返回目的地不可达消息。
代码 0、1、4 和 5 可以从网关接收。代码 2 和 3 可以从主机接收。
3、 超时消息
IP字段:
目的地址
来自原始数据报数据的源网络和地址。
ICMP 字段:
类型/ Type
11
代码/ Code
0 = 在传输过程中超过了生存时间; 1 = 超出片段重组时间。
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
Internet报头 + 64 位数据数据报
Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
描述/ Description
如果处理数据报的网关发现生存时间字段为零,则必须丢弃该数据报。网关也可以通过超时消息通知源主机。
如果主机重组分片数据报由于在其时限内丢失分片而无法完成重组,它会丢弃该数据报,并且它可能会发送超时消息。
如果片段零不可用,则根本不需要发送超过的时间。
代码 0 可以从网关接收。可以从主机接收代码 1。
4、 参数问题信息
IP字段:
目的地址
来自原始数据报数据的源网络和地址。
ICMP 字段:
类型/ Type
12
代码/ Code
0 = 指针指示错误。
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
指针/ Pointer
如果 code = 0,则标识检测到错误的八位字节。
Internet报头 + 64 位数据数据报
Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
描述/ Description
如果处理数据报的网关或主机发现报头参数存在问题,以至于无法完成数据报的处理,则必须丢弃该数据报。这种问题的一个潜在原因是选项中的参数不正确。网关或主机也可以通过参数问题消息通知源主机。仅当错误导致数据报被丢弃时才会发送此消息。
指针标识检测到错误的原始数据报头的八位字节(它可能位于选项的中间)。例如,1 表示服务类型有问题,(如果存在选项)20 表示第一个选项的类型代码有问题。
代码 0 可以从网关或主机接收。
5、 源抑制消息
IP字段:
目的地址
原始数据报数据的源网络和地址。
ICMP 字段:
类型/ Type
4
代码/ Code
0
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
Internet报头 + 64 位数据数据报
Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
描述/ Description
如果网关没有将数据报排队以输出到通往目的地网络的路由上的下一个网络所需的缓冲区空间,则该网关可能会丢弃 Internet 数据报。如果网关丢弃数据报,它可能会向数据报的互联网源主机发送源抑制消息。如果数据报到达太快而无法处理,目标主机也可以发送源抑制消息。源抑制消息是对主机的请求,以降低其向 Internet 目标发送流量的速率。网关可以为它丢弃的每条消息发送一个源抑制消息。收到源抑制消息后,源主机应降低将流量发送到指定目的地的速率,直到它不再从网关接收源抑制消息。然后,源主机可以逐渐增加将流量发送到目标的速率,直到它再次收到源抑制消息。
网关或主机可以在接近其容量限制时发送源抑制消息,而不是等到超过容量。这意味着可以传递触发源抑制消息的数据数据报。
代码 0 可以从网关或主机接收。
6、 重定向消息
IP字段:
目的地址
原始数据报数据的源网络和地址。
ICMP 字段:
类型/ Type
5
代码/ Code
0 = 为网络重定向数据报。 1 = 为主机重定向数据报。 2 = 服务类型和网络的重定向数据报。 3 = 重定向服务类型和主机的数据报。
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
网关网络地址
原始数据报数据的互联网目标网络字段中指定的网络流量应发送到的网关地址。
Internet报头 + 64 位数据数据报
Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。
描述/ Description
网关在以下情况下向主机发送重定向消息。网关 G1 从网关所连接的网络上的主机接收 Internet 数据报。网关 G1 检查其路由表并获取到数据报 Internet 目标网络 X 的路由上的下一个网关 G2 的地址。如果 G2 和由数据报 Internet 源地址标识的主机位于同一网络,重定向消息被发送到主机。重定向消息建议主机将其网络 X 的流量直接发送到网关 G2,因为这是到目的地的较短路径。网关将原始数据报的数据转发到其 Internet 目的地。
对于具有 IP 源路由选项和目标地址字段中的网关地址的数据报,即使存在比源路由中的下一个地址更好的到达最终目标的路由,也不会发送重定向消息。
代码 0、1、2 和 3 可以从网关接收。
7、 Echo 或 Echo Reply消息
地址
echo 消息中的源地址将是echo reply 消息的目的地。为了形成一个echo 应答消息,源地址和目标地址简单地颠倒,类型代码更改为 0,并重新计算校验和。
类型/ Type
8 用于echo 消息; 0 表示echo reply 消息。
代码/ Code
0
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。如果总长度为奇数,则接收数据填充一个八位字节的零以计算校验和。将来可能会替换此校验和。
标识符/ Identifier
如果 code = 0,则帮助匹配echo 和reply 的标识符可能为零。
序列号/ Sequence Number
如果 code = 0,则有助于匹配echo 和reply 的序列号可能为零。
描述/ Description
在echo 消息中接收到的数据必须在echo 应答消息中返回。
echo 发送方可以使用标识符和序列号来帮助将回复与echo 请求进行匹配。例如,可以像 TCP 或 UDP 中的端口一样使用标识符来标识会话,并且序列号可能会在每次发送echo 请求时递增。echo 器在echo reply 中返回这些相同的值。
代码 0 可以从网关或主机接收。
8、 时间戳或时间戳回复消息
地址
时间戳消息中的源地址将是时间戳回复消息的目的地。要形成时间戳回复消息,只需将源地址和目标地址颠倒,类型代码更改为 14,并重新计算校验和。
类型/ Type
13 用于时间戳消息; 14 用于时间戳回复消息。
代码/ Code
0
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
标识符/ Identifier
如果 code = 0,则帮助匹配时间戳和回复的标识符可能为零。
序列号/ Sequence Number
如果 code = 0,则有助于匹配时间戳和回复的序列号可能为零。
描述/ Description
消息中收到的数据(时间戳)与附加时间戳一起在回复中返回。时间戳是自 UT 午夜以来的 32 位毫秒。Mills [5] 描述了这些时间戳的一种用途。
Originate Timestamp 是发送者在发送之前最后一次接触消息的时间,Receive Timestamp 是 echoer 在接收时第一次接触它的时间,Transmit Timestamp 是 echoer 在发送消息时最后一次接触消息的时间。
如果时间不能以毫秒为单位或无法提供与午夜 UT 相关的时间,那么任何时间都可以插入到时间戳中,前提是时间戳的高位也设置为指示此非标准值。
echo 发送器可以使用标识符和序列号来帮助将回复与请求匹配。例如,标识符可能像 TCP 或 UDP 中的端口一样用于标识会话,并且序列号可能会在每次发送请求时递增。目的地在回复中返回这些相同的值。
代码 0 可以从网关或主机接收。
9、 信息请求或信息回复消息
地址
信息请求消息中的源地址将是信息回复消息的目的地。为了形成信息回复消息,只需将源地址和目标地址颠倒,类型代码更改为 16,并重新计算校验和。
类型/ Type
15为信息请求消息; 16为信息回复消息。
代码/ Code
0
校验和/ Checksum
校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。
标识符/ Identifier
如果 code = 0,则帮助匹配请求和回复的标识符可能为零。
序列号/ Sequence Number
如果 code = 0,则有助于匹配请求和回复的序列号可能为零。
描述/ Description
该消息可以在 IP 标头中的源网络和目标地址字段为零(这意味着“这个”网络)一起发送。回复 IP 模块应该使用完全指定的地址发送回复。此消息是主机找出其所在网络号码的一种方式。
echo 发送器可以使用标识符和序列号来帮助将回复与请求匹配。例如,标识符可能像 TCP 或 UDP 中的端口一样用于标识会话,并且序列号可能会在每次发送请求时递增。目的地在回复中返回这些相同的值。
代码 0 可以从网关或主机接收。
10、 消息类型摘要
0 Echo Reply 3 目的地不可达/ Destination Unreachable 4 源抑制/ Source Quench 5 重定向/ Redirect 8 Echo 11 超时/ Time Exceeded 12 参数问题/ Parameter Problem 13 时间戳/ Timestamp 14 时间戳回复/ Timestamp Reply 15 信息请求/ Information Request 16 信息回复/ Information Reply
参考资料
[1] Postel, J. (ed.), "Internet Protocol - DARPA Internet Program Protocol Specification," RFC 791, USC/Information Sciences Institute, September 1981. [2] Cerf, V., "The Catenet Model for Internetworking," IEN 48, Information Processing Techniques Office, Defense Advanced Research Projects Agency, July 1978. [3] Strazisar, V., "Gateway Routing: An Implementation Specification", IEN 30, Bolt Beranek and Newman, April 1979. [4] Strazisar, V., "How to Build a Gateway", IEN 109, Bolt Beranek and Newman, August 1979. [5] Mills, D., "DCNET Internet Clock Service," RFC 778, COMSAT Laboratories, April 1981.