介绍
ICMP(Internet Control Message Protocol)是一个在网络层的协议,ping 命令就是使用的 ICMP 协议。注意,ICMP不是高层协议,ICMP报文是封装在 IP数据报中,作为其中的数据部分。
种类
ICMP报文有两种种类:ICMP差错报文,ICMP询问报文。
报文前四个字节是固定的,分别是类型、代码、 检验和。接着四个字节和报文的种类有关。最后是数据字段,其长度取决于ICMP的类型。
代码字段是为了进一步区分某种类型中的不同情况。检验和字段用来检验整个ICMP报文。**为什么还要检验ICMP报文呢?**因为 IP报文只对头部有校验和检验,所以不能保证ICMP不出错。
差错报文
我们看到差错报告报文有四种:
-
终点不可达
当路由器或主机不能交付数据报时就向源点发布终点不可达报文。 -
时间超过
当路由器收到TTL为0的数据报时,除了丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已经收到的全部数据报片丢弃,并向源点发送时间超过报文。 -
参数问题
当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发布参数问题报文。 -
改变路由(重定向)
路由器把改变路由报文发送给主机,让主机知道下次可以选择更好的路由器(发送给另外的路由)。
关于改变路由:我们知道主机和路由器都会维护一个路由表,出于效率的考虑,主机不会和连在网络上的路由器定期交换信息。而主机连着的默认路由器知道去一个地址的最佳路线(信息通过和其他路由器交换得来)。因此当默认路由器发现去目的地址的最佳路由有变时,就用改变路由报文将情况告诉主机。该主机就在它的路由表中增加一个项目。
所有的ICMP差错报文的数据字段都有相同的格式。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来。作为ICMP报文的数据字段。再加上相应的 ICMP差错报文的前八个字节,就构成了 ICMP 差错报告报文。
根据上图可以知道,提取数据字段 8 个字节主要是为了得到端口号。
但是还有不应该发送ICMP差错报文的情况:
- 对于ICMP差错报文,不应发送ICMP差错报文
- 对于第一个分片后的后续分片,不再发送
- 具有多播地址的数据报,都不发送ICMP差错报文
- 对具有特殊地址的(如127.0.0.0或0.0.0.0),不发送 ICMP差错报文
查询报文
常见的ICMP查询报文有两种:
-
回送请求和回答
ICMP回送请求报文 是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。Ping使用的就是这个。 -
时间戳请求和回答
ICMP 时间戳请求报文是请某台主机或路由器回答当前日期和时间。时间戳请求可用于时钟同步和时间测量。
参考书籍
《计算机网络》第七版 谢希仁