ICMP本身是一个网络层协议,但是,它的报文不是如设想的那样直接传送给数据链路层。实际上,ICMP首先要封装成IP报文,然后再传输给下一层。
ICMP报文可分为两类:差错报告报文和查询报文。
差错报告报文用于报告路由器或主机(目的站)在处理一个IP数据报时可能遇到的一些问题。
查询报文是成对出现的,它帮助主机或网络管理员从一个路由器或另一个主机得到特定的信息。
下图列出了每一类的ICMP报文:
ICMP报文有一个8字节的首部和一个可变长度的数据部分。前4个字节在每个ICMP报文中都是相同的。第一个字段定义了ICMP的类型,它定义了报文的类型,第二个字段说明了是何种原因的ICMP报文,最后一个共同的字段是检验和字段。如下图所示:
差错报告:
ICMP不能纠正差错,只能报告差错。差错的纠正留给高层协议去做。差错报文总是发送给原始的数据源。ICMP使用源IP地址将差错报文发送给数据报的源站(发出者)。
一共有5种差错可以处理:目的站不可达,源站抑制,时间超时,参数问题,改变路由。
关于ICMP差错报文有以下的一些要点:
1.对于携带ICMP报文的报文不能在产生新的ICMP报文;
2.对于分片的数据报,如果不是第一个分片则不产生ICMP差错报文;
3.对于具有多播地址的数据报,不产生ICMP差错报文;
4.对于具有特殊地址的(127.0.0.0或0.0.0.0)不产生ICMP差错报文。
ICMP差错报文的数据部分包括:原始数据报的IP首部再加上前8个字节的数据部分(原始数据报中的首部就可给出原始信源,它接收差错报文,这就是关于数据报本身的信息,前8个字节的数据部分是因为那里提供了UDP或者TCP的端口号以及TCP的序号)。如下图所示:
查询报告:
在这种类型的ICMP报文中,一个结点发送出报文,然后由目的结点用特定的格式进行回答。
查询报文有以下几种:回送请求和回答,时间戳请求和回答,地址掩码请求和回答,路由器询问和通告。
回送请求和回答:此报文类型是为了网络诊断用的,主机或路由器可以发送回送请求报文,收到回送请求报文的主机或路由器发送出回送回答报文。PING命令就是采用此报文类型设计的。
时间戳请求和回答:此报文类型用于两个机器中时钟的同步。
地址掩码请求和回答:主机要得到掩码就发送此类报文给路由器,如果主机不知道路由器的地址,则广播此类报文,路由器收到地址掩码请求报文后就响应地址掩码回答报文,向主机提供所需的掩码。
ICMP的设计:
ICMP软件包由两个模块组成:输入模块和输出模块。如下图所示:
输入模块:当从IP层来的ICMP分组要交付给输入模块时,此模块即被调用。
输出模块:输出模块负责创建由高层或IP协议所请求的请求报文,询问报文或差错报文。