ICMP的全称是 Internet Control Message Protocol
ICMP报文控制协议:为了更加有效的转发IP数据包和提高交付成功的机会,用ICMP。数据虽然封装在IP包的数据部分中,但他是IP层协议。
ICMP提供一致易懂的出错报告信息。发送的出错报文返回到发送原数据的设备,因为只有发送设备才是出错报文的逻辑接受者。发送设备随后可根据ICMP报文确定发生错误的类型,并确定如何才能更好地重发失败的数据包。但是ICMP唯一的功能是报告问题而不是纠正错误,纠正错误的任务由发送方完成。
ICMP报文有两种类型:
差错报告报文:
- 终点不可达 3:当主机或路由器不能交付数据时,向源主机发送终点不可达的信息。具体有:网络不可达,主机不可达,协议不可达,端口不可达,需要分片但DF比特已置为1,以及源路由失败等六种情况,其代码字段分别置为0至5。当出现以上六种情况时就向源站发送终点不可达报文。
- 时间超过 11:当路由器收到的生存时间为0的数据时。向源主机发送该报文。
- 参数问题 12:当路由器收到的数据包中的首部字段值不正确时,向源主机发送该报文。
- 改变路由(重定向) 5:路由器把这个报文发送给源主机,使其知道下次应该将数据包发送给额外的路由器。
对于差错报告报文是满足以上条件时发送相应的报文,也可以说正常情况下是被动发送,即出现这些问题时向源主机报告,但是当然也可以认为的发送。一下情况不会发送ICMP报文:
- 对于ICMP差错报告报文,不会在发送这个差错报告报文
- 对第一个分片的数据报片的所有后续数据片,都不发送ICMP差错报告报文。
- 对于多播地址的数据包,不发送。
- 对于特殊地址的数据包不发送。
以上几种类型的报文格式都是相同的,当收到需要报告的IP数据包时,将IP数据包的首部和数据部分的前8的字节作为ICMP的数据部分,在添加相应的8字节的ICMP首部信息,在将其封装在IP包中发送到源主机。
询问报文:
回送请求和回答报文8/0:某主机或路由器向目的主机发送询问报文,收到此报文的主机必须向源主机回送回答报文,一般用来测试目的站是否可达。
时间戳请求和回答报文13/14:时间戳请求报文请某主机回答当前日期和时间。回答则是携带自己的当前时间回送到源主机或路由器。一般是用来时钟同步和时间测量。
目的不可达报文
类型:3 | 代码:0至15 | 检验和 |
未使用(全0) | ||
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节 |
源端抑制报文
类型:4 | 代码:0 | 检验和 |
未使用(全0) | ||
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节 |
超时报文
类型:11 | 代码:0或1 | 检验和 |
未使用(全0) | ||
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节 |
参数问题
类型:12 | 代码:0或1 | 检验和 |
指针 | 未使用(全0) | |
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节 |
改变路由
类型:5 | 代码:0到3 | 检验和 |
目标路由器IP地址 | ||
收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节 |
回送请求和回答
类型:8或0 | 代码:0 | 检验和 | |
标识符 | 序号 | ||
由请求报文发送;由回答报文重复 |
时间戳请求和回答
类型:13或14 | 代码:0 | 检验和 | |
标识符 | 序号 | ||
原始时间戳 | |||
接收时间戳 | |||
发送时间戳 |
地址掩码请求和回答
类型:17或18 | 代码:0 | 检验和 | |
标识符 | 序号 | ||
地址掩码 |
路由询问和通告
类型:10 | 代码:0 | 检验和 | |
标识符 | 序号 |
类型:9 | 代码:0 | 检验和 | |
地址数 | 地址项目长度 | 寿命 | |
路由器地址1 | |||
地址参考1 | |||
路由器地址2 | |||
地址参考2 | |||
... |
从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性﹐其功能主要有:
· 侦测远端主机是否存在。
· 建立及维护路由资料。
· 重导资料传送路径(ICMP重定向)。
对于“Ping of Death”攻击,可以采取两种方法进行防范:第一种方法是在路由器上对ICMP数据包进行带宽限制,将ICMP占用的带宽控制在一定的范围内,这样即使有ICMP攻击,它所占用的带宽也是非常有限的,对整个网络的影响非常少;第二种方法就是在主机上设置ICMP数据包的处理规则,最好是设定拒绝所有的ICMP数据包。