ICMP协议

ICMP 是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP基于IP协议,也就是说,一个ICMP包需要封装在IP包中,然后在互联网传送。ICMP是IP套装的必须部分,任何一个支持IP协议的计算机,都要同时实现ICMP。

ICMP传输的控制信息可以分为两大类:

  • 错误(error)信息:这一类信息可用来诊断网络故障。IP协议的工作方式是“Best Effort”,如果IP包没有被传送到目的地,或者IP包发生错误,IP协议本身不会做进一步的努力。但上游发送IP包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送IP包。通过ICMP包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。
  • 咨询(Informational)信息:例如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用ICMP包回答。

ICMP包有Type, Code和Checksum三部分:

  • 类型:指明该数据包属于什么类型(大分类),长度1个字节。
  • 代码:指明数据包属于大类里面的哪个小类,长度1个字节。类型字段与代码字段共同决定ICMP数据包类型,以及后续字段含义。
  • 校验和: 指明该数据包的校验和,长度2个字节。该校验和覆盖整个ICMP数据包。

ICMP数据包通过类型字段与代码字段来共同决定该数据包传达的控制信息。常见的ICMP包类型:

  • 0(Echo Reply):属于咨询信息,ping命令就是利用了该类型的ICMP包。
  • 3(Destination Unreachable)属于错误信息。如果一个路由器接收到一个IP包,不知道下一步往哪里发送,就会向出发主机发送该类型的ICMP包。
  • 11(Time Exceeded)属于错误信息。IPv4中的Time to Live(TTL)会随着经过的路由器而递减,当这个区域值减为0时,就认为该IP包超时(Time Exceeded)。traceroute就利用了这种类型的ICMP包,它向目的地发送IP包,第一次的时候,将TTL设置为1,引发第一个路由器的Time Exceeded错误。这样,第一个路由器回复ICMP包,从而让出发主机知道途径的第一个路由器的信息。随后TTL被设置为2、3、4,…,直到到达目的主机。这样,沿途的每个路由器都会向出发主机发送ICMP包来汇报错误。traceroute将ICMP包的信息打印在屏幕上,就是接力路径的信息了。