网际控制报文协议ICMP
一.网际控制报文协议ICMP概述
- 为了更有效地转发IP数据报以及提高IP数据报交付成功的机会,TCPIP体系结构的网际层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)[RFC 792].
- 主机或路由器使用ICMP来发送差错报告报文和询问报文。
- ICMP报文被封装在IP数据报中发送。
- ICMP的典型应用 - 分组网间探测PING
- 跟踪路由traceroute
 
二.ICMP报文类型
(一) 差错报告报文
差错报告报文分为五大种
 1.终点不可达
 当路由器或主机不能交付IP数据报时,就向源点发送终点可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达、目的主机不可达、目的协议不可达、目的端口不可达、目的网络未知、目的主机未知等13种。
 
2.源点抑制
 当路由器或主机由于拥塞而丢弃IP数据报时,就向发送该IP数据报的源点发送源点抑制报文,使源点知道应当把IP数据报的发送速率放慢。
 
3.时间超过
- 当路由器收到一个目的IP地址不是自己的IP数据报时,会将其首部中生存时间TTL字段的值减1。若结果不为0,则路由器将该数据报转发出去;若结果为0,路由器不但要丢弃该数据报,还要向发送该IP数据报的源点发送时间超过(超时)报文。
- 另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。

4.参数问题
 当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段的值发现首部在传送过程中出现了误码,就丢弃该数据报,并向发送该数据报的源点发送参数问题报文。
5.改变路由(重定向)
 路由器把改变路由报文发送给主机,让主机知道下次应将IP数据报发送给另外的路由器,这样可以通过更好的路由到达目的主机。
以下情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文不再发送ICMP差错报告报文。
- 对第一个分片的IP数据报片的所有后续数据报片都不发送ICMP差错报告报文
- 对具有多播地址的IP数据报都不发送ICMP差错报告报文。
- 对具有特殊地址(例如127.0.0.0或0.0.0.0)的IP数据报不发送ICMP差错报告报文。
(二) 询问报文
常用的ICMP询问报文有以下两种:
 1.回送请求和回答
 由主机或路由器向一个特定的目的主机或路由器发出。
 收到此报文的主机或路由器必须给发送该报文的源主机或路由器发送ICMP回送回答报文。
 这种询问报文用来测试目的站是否可达以及了解其有关状态。
2.时间戳请求和回答
 用来请求某个主机或路由器回答当前的日期和时间。
 在ICMP时间戳回答报文中有一个32比特的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。
 这种询问报文用来进行时钟同步和测量时间。
ICMP的两个典型应用
(一)分组网间探测PING
- 分组网间探测PING用来测试主机或路由器之间的连通性。- PING是TCPIP体系结构的应用层直接使用网际层ICMP的一个例子,它并不使用运输层的TCP或UDP。
- PING应用所使用的ICMP报文类型为回送请求和回答。
 
- PING是TCPIP体系结构的
(二)跟踪路由
- 跟踪路由应用traceroute,用于探测IP数据报从源主机到达目的主机要经过哪些路由器。
- 在不同操作系统中,traceroute应用的命令和实现机制有所不同: - 在UNIX版本中,具体命令为“traceroute”,其在运输层使用UDP协议,在网络层使用ICMP报文类型只有差错报告报文。
- 在Windows版本中,具体命令为“tracert”,其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。
 
本节总结:
 