
ICMP(因特网控制报文协议 Internet Control Message Protocol)是一种面向无连接的协议,用于传输出错报告控制信息。IP提供的尽力数据包通信服务无连接服务,而并不能解决网络低层的数据报丢失、重复、延迟或乱序等问题,TCP在IP基础建立有连接服务解决以上问题,但是不能解决网络故障或其他网络原因无法传输的包的问题。ICMP就可以对IP包无法传输时提供报告,这些差错报告帮助了发送方了解为什么无法传递,网络发生了什么问题,确定应用程序的后续操作。

1、ICMP用来报告错误,是一个差错报告机制。它为遇到差错的路由器提供了向最初源站报告差错的办法,源站必须把差错交给一个应用程序或采取其他措施来纠正问题。
2、不能用来报告ICMP消息的错误ICMP,避免无限循环。当ICMP查询消息时通过发送ICMP来响应。
3、对于分段的数据报,ICMP消息只发送关于第一个分段中的错误。ICMP消息永远不会引用一个具有非0片偏移量字段的IP数据报。
4、响应具有一个回送、广播或组播目的地址的数据报时,永远不会发送ICMP消息。

ICMP就像一个更高层的IP协议,ICMP消息被封装在IP数据报中,它是IP的一个组成部分,所有IP模块都必须实现它,而IP数据报本身放在帧的数据部分中通过物理网络传递.因此,ICMP具有两级封装模式。

ICMP 报文的前4个字节是统一的格式,共有三个字段:类型、代码、检验和。
ICMP 报文的种类有两种:ICMP 差错报告类报文;ICMP 询问类报文。


参考文献:
1、T Taylor,M Leech,S Bellovin.Icmp traceback messages.Internet Engineering Task Force,2000
2、李佳,石冰心.基于ICMP和SNMP的网络拓扑发现算法研究及实现.微型机与应用, 1998(1):33-35

ICMP的差错报文有5种:终点不可达(类型值3)、源点抑制(类型值4)、时间超过(类型值11)、参数问题(类型值12)、改变路由(重定向)(类型值5)。
所有ICMP差错报文中的数据字段都具有同样的格式。将收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报告的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报文。提取到的数据报的数据字段的前8个字节就是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。

△ 目标不可达:当路由器检测到数据报无法传递到目的地时,向创建数据报发送ICMP目的不可达报文。报包括:网络不通(如路由器故障)、目的主机连不通(未开机)、协议不可达、端口不可达、以及其他共15种不同的情况,用不同代码表示。
△ 超时:有两种情况需要发送此报文:一是路由器把数据报的生存时间减至零时,路由器丢弃数据报,并向源主机发送超时报文;另一种是一个数据报的所有段到达前,重组计时到点。
△ 参数错误:数据报头部的标志出现错误,或缺少必须的选项。
△ 源冷却:路由器在处理报文时会有一个缓存队列。如果超过最大缓存队列,将无法处理,则丢弃报文并向源发送方发一个ICMP源抑制报文。源主机收到此报文,需要降低发送数据报的速率。
△ 重定向:当路由收到IP数据报,发现数据报的目的地址在路由表上没有,它就会发ICMP重定向报文给源发送方。改变路由的报文能够指出网络或特定主机的变化,一般发生在一个网络连接多路由器的情况下。

ICMP询问类报文有四种:回送请求和回答报文(类型值8或0)、时间戳请求和回答报文(类型值13或14)、掩码地址请求和回答报文(类型值17或18)、路由器询问和通告报文(类型值10或9)。
◇ 回送请求/回答:可以对任何一台网上主机的ICMP软件发送请求/回答报文。用来测试目的站是否可达以及了解其有关状态。Ping命令就是采用这个报文来获得两个主机之间的连通性。
◇ 时间戳请求/回答:主机发出查询当前时间的请求,应答报文建议值自午夜开始计算毫秒数,用来记录收发以及传输时间的报文或进行时钟同步和测量时间。Originate Time-stamp字段记录的是发送方发送报文的时刻;ReceiveTime-stamp字段记录的是接收方收到报文的时刻;Transmit Time-stamp字段表示回显最后发送报文的时刻。
◇ 掩码地址请求/回答:主机启动时,会广播一个地址掩码请求报文。路由器收到地址掩码请求报文后,回送一个包含本网使用的32位地址掩码的应答报文。用于无盘系统在引导过程中获取自己的子网掩码。

有三种基于ICMP的简单而广泛使用的应用:Ping、Traceroute、MTU测试。
■ Ping
使用ICMP回送请求和回答消息来确定一台主机是否可到达。它是应用层直接使用网络层ICMP的一个例子,他没有通过运输层的TCP或UDP。

■ Traceroute
用来确定网络的路由IP数据报。它基于ICMP和UDP。它把一个TTL=1的IP数据报发送给目的主机,第一个路由器使TTL=0,丢弃该数据报并把ICMP超时信息返回源主机。这样,路径上的第一个路由器就被标识,随后用不断增大的TTL值重复这个过程,标识出通往目的主机的路径上确切的路由系列。继续这个过程直至该数据报到达目的主机。实现该过程有两种方法:一种是发送一个ICMP回应请求报文,目的主机产生一个ICMP回应答复报文,Microsoft(tracert)中采用该方法;另一种是发送一个数据报给一个不存在的应用进程,目的主机将会产生一个ICMP目的不可达报文,大多数UNIX版本的traceroute程序采用该方法。
■ MTU测试
IP路由器必须对超过MTU的IP报进行分片,目的主机再完成重组处理,确定源到目的路径MTU有利于提高传输效率。确定方法是“要求报告分片但又不被允许”的ICMP报文。将IP数据报的标识域中的分片BIT=1,不允许分片;当路由器发现IP数据报长度大于MTU时,丢弃数据报,并发回一个要求分片的ICMP报;将IP数据报长度减小,分片BIT=1重发,接受返回的ICMP分析;发送一系列的长度递减的、不允许分片的数据报,通过接收返回的ICMP报的分析,可确定路径MTU。