标题：Internet控制信息协议
介绍
为了这个目的才使用了ICMP，它使用IP做于底层支持，好像它是一个高层协议，而实际上它是IP的一部分，必须由其它IP模块实现。
ICMP消息在以下几种情况下发送：当数据报不能到达目的地时，当网关的已经失去缓存功能，当网关能够引导主机在更短路由上发送。
IP并非设计为设计为绝对可靠，这个协议的目的是为了当网络出现问题的时候返回控制信息，而不是使IP协议变得绝对可靠，并不保证数据报或控制信息能够返回。一些数据报仍将在没有任何报告的情况下丢失。上层协议必须使用自己的差错控制程序来判断通信是否正确。
ICMP信息通常报告在处理数据报过程中的错误。若要避免信息无限制地返回，对于ICMP消息不会单独成包发送，而且ICMP信息只在处理数据报偏移量为0时发送。
消息格式
ICMP消息以基本IP头发送。数据的第一个字节是ICMP类型域；此域的值决定了了其余数据的格式。任何标记为“未使用”的域都是为以后的扩展保留的，在传送过程中必须全部是0。除非在个别的格式之下，包头域如下格式：
版本：4
IHL：Internet头长度大小以32位字为单位。
服务类型：0
总长度：包头长度和数据长度。
段中所用标识，段偏移量：在段是使用。
生存周期：以秒计，此域在每台机器处理数据报时减少，此值必须大于要传送它的网关所消耗的时间。
协议：ICMP = 1
包头校验码：16位数据反码和再取反而得。为计算校验码，此域应该为0。在将来可以会取代这一域。
源地址：创建ICMP信息的网关或主机地址，除非说明，它可以是任何网关地址。
目的地址：信息要发送到的网关或主机地址。
未达目的地信息
图1
IP域：目的地址，发送原始数据报数据的网络地址
ICMP域：
类型：3
代码：
0 = 网络不可达；
1 = 主机不可达；
2 = 协议不可用；
3 = 端口不可达；
4 = 需要段和DF设置；
5 = 源路由失败；
校验码：16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
Internet包头+源数据报：
Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。如果高层协议使用端口号，应该假设其在源数据的头64个字节之中。
说明：
相应于网关的路由表，如果在目的域中指定的网络不可达，如网络距离为无限远，网关会向发送源数据的主机发送目的不可达消息。而且，在一些网络中，网关有能力决定目的主机是否可达。如果目的地不可达，它将向发送源数据的主机发送不可达信息。
在目的主机，如果IP模块因为指定的协议模块和进程端口不可用而不能提交数据报，目的主机将向发送源数据的主机发送不可达信息。
另外一种情况是当数据报必须被分段传送，而“不可分段”位打开，在这种情况下，网关必须抛弃此数据报，并向向发送源数据的主机发送不可达信息。
代码0，1，4和5由网关发送，而代码2和3由主机发送。
超时信息
图2
IP域：
目的地址：从源数据报数据中得到。
ICMP域：
类型：11
代码：
0 = 传送超时；
1 = 分段级装超时。
校验码：16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
Internet包头+64位源数据报数据：Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。如果高层协议使用端口号，应该假设其在源数据的头64个字节之中。
说明：
如果网关在处理数据报时发现生存周期域为零，此数据报必须抛弃。网关同时必须通过超时信息通知源主机。
如果主机在组装分段的数据报时因为丢失段未能在规定时间内组装数据，此数据报必须抛弃。网关发送超时信息。
如果段零不可用则不用发送超时信息。
代码0由网关发送，代码1由主机发送。
参数问题消息
图3
IP域：
目的地址：从源数据中得到。
ICMP域：
类型：12
代码：
0 = 指针指向错误。
校验码： 16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
指针
如果code = 0，指向有问题的字节。
Internet包头+64位源数据报数据：Internet包头+64位源数据报数据：Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。如果高层协议使用端口号，应该假设其在源数据的头64个字节之中。
说明：
如果网并或主机在处理数据报时发现包头参数有错误以至不能完成工作，它必须抛弃此数据报。一个潜在的原因可以是变量的错误。网关或主机将通过参数问题消息通知源主机，此消息只有在消息被抛弃时才被发送。指针指向发现错误的数据报包头字节。
代码： 从主机或网关接收0。
源拥塞消息
图4
IP域：
目的地址：源数据报数据的地址和源网络。
ICMP域：
类型：4
代码： 0
校验码： 16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
Internet包头+64位源数据报数据： Internet包头+64位源数据报数据：Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。如果高层协议使用端口号，应该假设其在源数据的头64个字节之中。
说明：
如果没有缓冲容纳，网关会抛弃数据报，如果网关这样做了，它会发送源拥塞消息给发送主机。如果接收的数据报太多无法处理，目的主机也会发送相应的消息给发送主机。此消息要求发送发减少发送速率，网关会给每个抛弃的消息返回源拥塞消息，在接到此消息后，发送主机应该减少发送速率，直到不再接收到网关发送的源拥塞消息为止。在此之后，源主机可以再增加发送速率，直到接收到目的主机的源拥塞消息为止。
网关或主机不会等到已经超过限度后再发送此消息，而是接近自己的处理极限时就发送此消息，这意味着，引发源拥塞消息的数据报仍然可以处理。代码： 从主机或网关接收0。
重定向消息
图5
IP域：
目的地址：源数据报数据的地址和源网络。
ICMP域：
类型： 5
代码：
0 = 重定向网络的数据报；
1 = 重定向主机的数据报；
2 = 重定向网络和服务类型的数据报；
3 = 重定向网络和主机类型的数据报。
校验码：
16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
网关Internet地址：
应该发送网关地址（其在源数据报数据的internet目的网络域中指定）。
Internet包头+64位源数据报数据：
Internet包头+64位源数据报数据：Internet包头加上源数据的头64位而得。此数据用于主机匹配信息到相应的进程。如果高层协议使用端口号，应该假设其在源数据的头64个字节之中。
说明：
网关在下面情况下发送重定向消息。网关（G1）从网关相连的网络上接收到数据报，它检查路由表获得下一个网关（G2）的地址（X）。如果G2和指定的接收主机在同一网络上，重定向消息发出，此消息建议发送主机直接将数据报发向网关G2，因为这更近，同时网关G1向前继续发送此数据报。
因为在数据报中的IP源路由和目的地址域是可选的，所以即使有更好的路由有时也无法发现。代码：网关发送0，1，2和3。
回送或回送响应消息
图6
IP域：
地址：
回送消息的源地址是回送响应消息的目的地址。若要形成一个回送响应消息，应该将源和目的地址交换，将类型代码更改为0，重新计算机校验码。
IP域：
类型：
8代表回送消息；
0代表回送响应消息。
代码：0
校验码：
16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
标识符：如果代码=0，帮助匹配回送和回送响应的代码可以为0。
序列码：如果代码=0，帮助匹配回送和回送响应的序列码可以为0。
说明：
回送消息中接收到的消息应该在回送响应消息中返回。标识符和序列码由回送发送者使用帮助匹配回送请求的响应。代码： 从主机或网关接收0。
时间戳和时间戳响应消息
图7
IP域：
地址：
时间戳消息的源地址是时间戳响应消息的目的地址。若要形成一个时间戳响应消息，应该将源和目的地址交换，将类型代码更改为14，重新计算机校验码。
IP域：
类型：
13代表时间戳消息；
14代表时间戳响应消息。
代码：0
校验码：
16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
标识符：如果代码=0，帮助匹配时间戳和时间戳响应的代码可以为0。
序列码：如果代码=0，帮助匹配时间戳和时间戳响应的代码可以为0。
说明：
接收到的时间戳附加在响应里返回，时间是以百万分之一称为单位计算，并以标准时午夜开始计时。原时间戳是发送方发送前的时间。接收时间戳是回送者接收到的时间，传送时间是回送者发送的时间。
如果时间以百万分之一秒计无效，或者不能以标准时提供，可以在时间戳的高字节填充入数据以表示这不是标准数据。标识符和序列码由发送者匹配请求的响应。代码： 从主机或网关接收0。
信息请求或信息响应消息
图8
IP域：
地址：
信息请求消息的源地址是信息响应消息的目的地址。若要形成一个信息响应消息，应该将源和目的地址交换，将类型代码更改为16，重新计算机校验码。
IP域：
类型：
15代表信息请求消息；
16 代表信息响应消息。
代码： 0
校验码：
16位数据（从ICMP类型开始）的反码和再取反而得。为计算校验码，校验码域应该为零。这些零在以后会被校验码取代。
标识符：如果代码=0，帮助匹配信息请求和信息响应的代码可以为0。
序列码：如果代码=0，帮助匹配信息请求和信息响应的代码可以为0。
说明：
此消息可以在IP包头中以源网络地址发送，但同时目的地址域为0（这表示此网络内）。响应IP模块应该发送完全指定地址的响应。发送此消息是主机寻找到自己所在网络号码的一种方法。标识符和序列码由发送者匹配请求的响应。代码： 从主机或网关接收0。
消息类型总结
0 回送响应
3 目的不可达
4 源拥塞
5 重定向
8 回送
11 超时
12 参数问题
13 时间戳
14 时间戳响应
15 信息请求（已作废）
16 信息响应（已作废）
17 地址掩码请求
18 地址掩码应答