1
计算机网络技术理论与实践
1.6.1.4 5.1.4 ICMP协议原理

5.1.4 ICMP协议原理

ICMP(Internet Control Message Protocol),属于网络层协议,用于在IP主机和路由器等网络设备之间传递网络是否通畅、主机是否可达、路由是否可用等控制消息。ICMP就是一个错误侦测与回报机制,可以使我们能够检测网络的状态,其功能主要有:

·侦测远端主机是否存在;

·建立及维护路由信息;

·重导信息传送路径;

·数据流量控制。

ICMP的消息格式如图5-9所示,其中最为重要的是类型字段和代码字段。ICMP的消息主要分为以下几种:

img140

图5-9 ICMP消息格式

(1)回送请求或回送响应

可以使用一个ICMP Echo Request(回送请求)数据包来探测主机地址是否存活,这需要被探测的主机上没有过滤掉ICMP报文。当发送一个ICMP回送请求数据包到目标主机时,如果在一定时间内接收到了ICMP Echo Reply(回送响应)数据包,说明主机是存活状态。如果在一定时间内没有收到ICMP回送响应数据包,就可以认为目标主机没有在线或者使用了某些方法过滤了ICMP报文。

我们在检测网络是否通畅和目标主机是否可达时,经常会采用命令ping进行测试,ping命令使用的就是这种机制,利用ICMP的回送请求报文和回送响应报文完成测试。回送请求消息的源IP地址和目的IP地址分别是回送响应消息的目的IP地址和源IP地址。

ICMP回送请求消息中的类型字段的取值为8,代码字段取值为0;

ICMP回送响应消息中的类型字段的取值为0,代码字段取值为0;

(2)超时报文

网络中会发生数据包丢失,数据包长时间在网络中传输但找不到目标,或者拥塞导致在规定时间内无法重组数据包分段,这时就会产生ICMP超时报文。超时报文的类型字段取值为11,代码字段有两种取值:

·Code=0表示传送超时;

·Code=1表示分段组装超时。

(3)目标不可达报文

目标不可达报文在路由器或主机不能传递数据包时使用,也就是当寻找的目的主机、端口或者网络等不存在时,就会产生目标不可达报文。目标不可达报文的类型字段取值为3,针对于不同的目标,代码字段取值如下:

·Code=0表示网络不可达;

·Code=1表示主机不可达;

·Code=2表示协议不可达;

·Code=3表示端口不可达;

·Code=4表示数据报太大;

·Code=5表示源路由失败。

ICMP报文是封装在IP数据包中进行传输的,如图5-10所示,这是由于控制信息在网络上传输时需要跨越多个网络,所以也需要用到网络层功能才能够完成,因此,必须封装在IP数据包中。另外,ICMP的数据部分通常是出问题的IP数据包的报头和部分内容。所以在分析ICMP数据包的时候经常会发现两个IP报头。

img141

图5-10 ICMP消息封装示意图