Internet控制消息协议ICMP报文详解

简介: Internet 协议的设计并非绝对可靠。这些控制消息的目的是提供有关通信环境中问题的反馈,而不是使 IP 可靠。仍然不能保证数据报将被传递或控制消息将被返回。某些数据报可能仍未送达,而没有任何丢失报告。如果需要可靠的通信,使用 IP 的更高级别的协议必须实现自己的可靠性程序。

640.gif


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、 目的地不可达消息


640.png


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、 超时消息


640.png


IP字段:


目的地址


来自原始数据报数据的源网络和地址。


ICMP 字段:


类型/ Type

11


代码/ Code

0 = 在传输过程中超过了生存时间;
1 = 超出片段重组时间。


校验和/ Checksum


校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。


Internet报头 + 64 位数据数据报


Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。


描述/ Description


如果处理数据报的网关发现生存时间字段为零,则必须丢弃该数据报。网关也可以通过超时消息通知源主机。


如果主机重组分片数据报由于在其时限内丢失分片而无法完成重组,它会丢弃该数据报,并且它可能会发送超时消息。


如果片段零不可用,则根本不需要发送超过的时间。


代码 0 可以从网关接收。可以从主机接收代码 1。


4、 参数问题信息


640.png


IP字段:


目的地址


来自原始数据报数据的源网络和地址。


ICMP 字段:


类型/ Type

12


代码/ Code

0 = 指针指示错误。


校验和/ Checksum


校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。


指针/ Pointer


如果 code = 0,则标识检测到错误的八位字节。


Internet报头 + 64 位数据数据报


Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。


描述/ Description


如果处理数据报的网关或主机发现报头参数存在问题,以至于无法完成数据报的处理,则必须丢弃该数据报。这种问题的一个潜在原因是选项中的参数不正确。网关或主机也可以通过参数问题消息通知源主机。仅当错误导致数据报被丢弃时才会发送此消息。


指针标识检测到错误的原始数据报头的八位字节(它可能位于选项的中间)。例如,1 表示服务类型有问题,(如果存在选项)20 表示第一个选项的类型代码有问题。


代码 0 可以从网关或主机接收。


5、 源抑制消息


640.png


IP字段:


目的地址


原始数据报数据的源网络和地址。


ICMP 字段:


类型/ Type

4


代码/ Code

0


校验和/ Checksum


校验和是从 ICMP 类型开始的 ICMP 消息的补码和的 16 位补码。为了计算校验和,校验和字段应该为零。将来可能会替换此校验和。


Internet报头 + 64 位数据数据报


Internet 报头加上原始数据报数据的前 64 位。主机使用此数据将消息与适当的进程匹配。如果更高级别的协议使用端口号,则假定它们位于原始数据报数据的前 64 个数据位中。


描述/ Description


如果网关没有将数据报排队以输出到通往目的地网络的路由上的下一个网络所需的缓冲区空间,则该网关可能会丢弃 Internet 数据报。如果网关丢弃数据报,它可能会向数据报的互联网源主机发送源抑制消息。如果数据报到达太快而无法处理,目标主机也可以发送源抑制消息。源抑制消息是对主机的请求,以降低其向 Internet 目标发送流量的速率。网关可以为它丢弃的每条消息发送一个源抑制消息。收到源抑制消息后,源主机应降低将流量发送到指定目的地的速率,直到它不再从网关接收源抑制消息。然后,源主机可以逐渐增加将流量发送到目标的速率,直到它再次收到源抑制消息。


网关或主机可以在接近其容量限制时发送源抑制消息,而不是等到超过容量。这意味着可以传递触发源抑制消息的数据数据报。


代码 0 可以从网关或主机接收。


6、 重定向消息


640.png


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消息


640.png


地址


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、 时间戳或时间戳回复消息


640.png


地址


时间戳消息中的源地址将是时间戳回复消息的目的地。要形成时间戳回复消息,只需将源地址和目标地址颠倒,类型代码更改为 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、 信息请求或信息回复消息


640.png


地址


信息请求消息中的源地址将是信息回复消息的目的地。为了形成信息回复消息,只需将源地址和目标地址颠倒,类型代码更改为 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.


相关文章
|
7月前
|
网络协议 网络架构
网络协议与攻击模拟-05-ICMP协议
网络协议与攻击模拟-05-ICMP协议
50 0
|
8月前
|
网络架构
ICMP协议(Internet控制消息协议)
本文详细的介绍ICMP协议,内含详细的实例解析,该文你值得拥有。
|
8月前
|
Linux C语言 C++
Linux ICMP协议实现:C/C++编程指南
ICMP(Internet Control Message Protocol)是网络通信中的重要协议,用于在IP网络中传递错误消息和诊断信息。在Linux系统中,我们可以使用C/C++编程语言来实现基本的ICMP功能,例如发送ICMP回显请求(Ping)和解析ICMP消息。本文将带您深入了解C/C++实现的ICMP协议,包括套接字编程、构造ICMP报文、发送和接收ICMP消息等,以及提供实际的代码示例。
473 1
|
2月前
|
域名解析 缓存 网络协议
|
3月前
|
监控 网络协议 网络安全
ICMP (Internet Control Message Protocol,互联网控制消息协议)
ICMP(Internet Control Message Protocol,互联网控制消息协议)是用于在IP网络中传递控制消息的协议。它通常被用于网络设备之间交换状态信息和错误报告,以及执行网络诊断和故障排除。
60 0
|
3月前
|
网络协议 API 网络安全
用户态协议栈设计实现udp,arp与icmp协议
用户态协议栈设计实现udp,arp与icmp协议
63 1
|
4月前
|
监控 网络协议 网络性能优化
【网络层】DHCP协议(应用层)、ICMP、IPv6详解
【网络层】DHCP协议(应用层)、ICMP、IPv6详解
58 0
|
4月前
|
网络协议 网络架构
Wireshark中的ICMP协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过ICMP协议,在了解Wireshark使用的基础上,重温ICMP协议的通讯过程。 ICMP(Internet Control Message Protocol)Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成TCP/IP模型中的网络层。 在Wireshark界面,我们可以看到
|
9月前
|
负载均衡 网络协议 安全
DNS协议、ICMP协议、NAT技术(二)
DNS协议、ICMP协议、NAT技术
186 0
|
9月前
|
域名解析 存储 缓存
DNS协议、ICMP协议、NAT技术(一)
DNS协议、ICMP协议、NAT技术
171 0