ICMP报文的格式类型总共分为三大类:
1、差错报文
2、控制报文
3、查询报文
上图是ICMP报文的基本格式,上面提到的三种ICMP报文均有“类型,代码和校验和”三个字段,后面还有4个字节是根据不同的报文类型而有不同的格式,有的是全0,有的则有其他的特殊格式。但是ICMP始终有8个字节的头部长度。其中类型字段代表着不同的报文类型,而代码字段指明了某个类型的报文中细分出的该报文的指定的功能。即一个类型的报文拥有着多种功能。
同时还需要注意的是ICMP差错报文的数据部分存储的是IP头部和IP头部后面的8个字节,这就使得IP的相关信息以及上层协议的端口信息可以被ICMP记录,在进行协议,端口方面的错误信息反馈时可以更好的反应问题。
一、差错报文分为:
1、目的不可达:
目的不可达的类型字段值为3,代码字段有为0-15,也就是说若将目的不可达的ICMP报文再做一个细分,会将目的不可达的原因分为16种,并用不同ICMP差错报文进行表示。
代码为0:
代表着网络不可达,出现这个ICMP差错报文,就代表着报文在路由过程的时候出现了问题,比如报文的目的网络在路由器上没有相应的条目,于是该路由器就回送网络不可达的报文。
代码为1:
代表主机不可达,这个报文的来源一般是目的主机所处的网关发送的,因为目的主机所处的网关没有找到对应的目的主机的IP地址,而无法转交该数据报文,所以将数据报文丢弃并回送该ICMP差错报文。
代码为2:
代表着协议不可达,这就说明数据交互的双方在协议上的出现了问题。
代码为3
代表着端口不可达,这就说明数据包上指定的目的端口在目的主机上可能没有监听
代码为4
代表一个原本需要分片的数据包,但是IP头部上的表示是不进行分片,由此就出现了错误。比如我们可以设置自己的网卡的MTU大小比网关的MTU大,那么我们发送过去的数据在被网关接收后可能会出现错误,因为网关网卡的最大接收MTU数比发送过来的数据包小,而且这个数据包还标识不进行分片,这就会出现错误。
代码为5
源站选路失败
代码为6
目的网络不认识
代码为7
目的主机不认识
一般来说我在日常生活中比较常见的就时0到4代码的ICMP报文。后面的代码5到15的ICMP差错报文几乎没见过。
2、时间超时
时间超时的类型字段的值为11。
代码为0
代表TTL超时
代码为1
代表分片重组超时
3、参数问题
参数问题的类型字段值为12,它主要是因为对IP头部中的字段值出现了问题,从而导致收到这些问题报文的主机返送一个参数问题的ICMP差错报文。
二、ICMP控制报文
1、源站抑制
源站控制的类型字段值是4。只有一个代码0
源站抑制是拥塞控制的一种方式,虽然TCP在端到端上使用了窗口机制和慢开始,拥塞避免和快重传对流量进行了控制,网关通过对链路上的链路情况进行监控,对信源发送源站抑制里面包含着目的网络的信息,当接收方接收该信息后根据目的网络信息知道去往该网络的链路发生拥塞,于是减少信息的发送。
2、路由重定向
路由重定向的类型字段为5,有0-3,4个代码
路由重定向是指当主机发送给某个路由器的时候,这个路由器会判断自己是否是最佳的转发设备,如果根据它的路由信息发现其他的转发设备对于该主机来说最好,也就是能够更快的将数转发到目的对象,那么它就将发送路由重定向给这个主机让它将路由修改为更佳的路由。更佳路由的信息存储在ICMP的后4个字节上,我们老师说重定向一般都木有了,所以图一乐看看就完事了。
三、ICMP查询报文
1、请求和回应报文
这个就是最常见的ping命令发送的报文,请求的ICMP类型字段为8,回应的类型字段为0,代码都只有0.
需要注意的是请求和回应的ICMP报文使用到了ICMP头部的后4个字节,分为两个字段,即标识和序列号,标识一般是发送该报文的进程号,我个人认为标识和序列号是标识一对请求和回应报文,只有与某请求报文对应的回应报文,它们的标识与序列号才是相同的。
需要注意的是,请求和回应的ICMP数据包中的数据部分都是相同的。
2、路由询问或通告
路由询问的类型字段值为10,通告的类型字段值为9,只有一个代码0
该类型报文主要用于无盘工作站,没有办法保存网关的情况,它就只能靠发送路由询问,来询问网关信息。路由询问报文只用了ICMP头部的前面4个字节,但是路由通告使用了全部的8个字节。、后4个字节有三个字段,分别为“地址数,地址项长度,生存时间”,它们占用的长度是1B,1B,2B这三个字段记载着数据部分包含的路由条目数量,路由条目的长度(即IP地址的长度),以及路由条目在路由器上面的有效生存时间。
在该ICMP报文中,每个路由信息分为路由地址和优先级,各自占用4个字节,优先级越高越有可能成为该主机的默认网关。
3、时间戳请求与应答
时间戳的请求的类型字段为13,应答为14,只有一个代码0
它的头部与请求与回应的ICMP报文一致,但是数据部分它使用了12个字节,每4个字节记录一段时间信息,总共有三段,分别是“发送时间戳 ,接收时间戳,回送时间戳”,发送时间戳的信息由时间戳请求者记录,后面两个字段由回送者记录。字段里面记录的是有关当前时间的毫秒数的表示,发送者只要根据回送者发送的时间信息就可以很容易的求出往返时长。
4、地址掩码请求和应答
请求的类型字段值为17,应答的类型字段为18,只有一个代码0
它的ICMP头部与请求的ICMP包的头部相同,数据字段存储的是请求的子网掩码,我觉得这个可能是和RARP配合用的吧,RARP仅仅提供IP地址,这个提供子网掩码,但是现在DHCP都已经挺牛逼了,这个我感觉也没什么用。