在网络层,ICMP协议有着很重要的作用。它可以算是一位检查者,帮助我们检查在消息中的一些传递问题。那么接下来我们就来规范一下这个协议的定义。互联网控制消息协议(Internet Control Message Protocol 或简写 ICMP)的目的是用于在 TCP/IP 网络中发送控制消息,提供可能发生在通信环境中的各种问题反馈,通过这些信息,令管理者可以对所发生的问题作出诊断,然后采取适当的措施去解决它。
ICMP依靠IP来完成它的任务,它是IP的主要部分。它与传输协议,如TCP和UDP显著不同:它一般不用于在两点间传输数据。它通常不由网络程序直接使用,除了ping和traceroute这两个特别的例子。
IPv4的ICMP也叫ICMPv4。IPv6的也有一个相似的协议,叫ICMPv6。
ICMP消息是在IP层,通常是从一个普通的产生了ICMP响应的IP数据报中生成的。IP把适当的ICMP消息用一个新的档头(header)封装起来(以把ICMP消息送回原来的发送者),然后把产生的数据报用常规的方式传送回去。
例如,每台转发IP数据报的机器(例如途中的路由器)都要把IP报头中的TTL(time to live)减1,如果TTL减为了0,一个ICMP超时消息就会被发送到数据报的源发送者。
每个ICMP消息都是直接封装在一个IP数据报中的,因此,和UDP一样,ICMP是不可靠的。
虽然ICMP协议是包含在IP数据报中的,但是对ICMP消息通常会特殊处理,会和一般IP数据报的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个被提示一个ICMP消息的程序。
很多常用的工具是基于ICMP消息的。traceroute是通过发送包含有特殊的TTL的包,然后查找ICMP协议超时消息和目标不可达消息来实现的。和traceroute相关的ping则是用ICMP的"Echo request"和"Echo reply"消息来实现的。
ICMP部分的结构
报头
ICMP报头从IP报头的第160位开始(除非使用了IP报头的可选部分)。
Type - ICMP的类型;
Code - 进一步划分ICMP的类型;例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
Checksum - 这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中数据部分的值视为0。
ID - 这个字段包含了ID值,在ECHO REPLY类型的消息中要返回这个字段。
Sequence - 这个字段包含一个序号,同样要在ECHO REPLY类型的消息中要返回这个字段。
填充数据
填充的数据紧接在ICMP报头的后面(以8位为一组):
Linux的 "ping"工具填充的ICMP除了8个8位元组的报头以外,还另外填充数据使得总大小为64字节。
Windows 的"ping.exe" 填充的ICMP协议除了8个8位元组的报头以外,还另外填充数据使得总大小为40字节