《图解TCP/IP》
5.4 ICMP(Internet Control Message Protocol)
ICMP是用于辅助IP的一种协议,从名字上就知道,“Internet控制报文协议”。
那么为什么要有这种协议呢?想想就知道,单靠IP协议,就好比上课时,在没有规则约束的情况下,有人说话(广播),有人递纸条(单播),秩序十分混乱。这时候班主任又不在,就需要有一个纪律委员,来管理班级。
ICMP的主要功能包括但不限于:
- 确认IP包是否成功送达到目标地址
- 通知发送过程中,IP包被废弃的具体原因
- 改善网络设置
这时候需要提一点,就是ICMP是基于“尽力而为”的IP进行工作的,无法保证质量。在网络安全优于便利性的环境里,往往无法使用ICMP。
首先来介绍一下比较常见的一种问题,就是如果某个IP包因为某种原因未能达到目标地址,这个消息就会交由ICMP负责通知。如下图所示:
ICMP的这种通知消息会使用IP进行发送,相当于是IP的一种补充。
ICMP的消息大体上可以分为两类:
- 通知出错原因的错误消息
- 用于诊断的查询消息
主要的ICMP消息有以下几种:
-
类型3:ICMP目标不可达消息
无法将IP数据包发送给目标地址的时候,就会给发送单主机返回一个目标不可达的ICMP消息。具体情况有很多种,主机根据具体的错误号,就可以了解到此次发送不可达的具体原因,见下表:
实际中经常遇到的错误号是1,表示主机不可达(Host Unreachable),通常指路由器中没有该主机的信息,或者是主机没有连接到网络。
错误号4,即用于此前讲过的MTU探索。
-
类型5:ICMP重定向消息(通常用了这个消息,反而会引发问题,所以往往不设置)
路由器发现发送端主机用了次优的路径发送数据,就会返回一个ICMP重定向消息。如下图所示:
-
类型11:ICMP超时消息
让我们回忆一下,IP包中有一个名为TTL(Time to Live,生存周期)的消息,意思就是每经过一个路由器,该数值就会减1,直到减到0的时候该IP包就会被丢弃。此时,就会发送一个ICMP超时消息(ICMP Time Exceeded Message)给发送端主机,并通知该包已被丢弃。
值得一提的是,有一种便利的显示从发送到目的端一共经历了多少路由器的命令行指令,就是
traceroute
(windows平台下则为tracert
)。原理就是从生存期限 = 1,顺序递增的发送UDP包,强制接收ICMP超时消息的一种方法。 -
类型0、8:ICMP回送消息
用于主机与路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息。即有向对端主机发送回送请求的消息(ICMP Echo Request Message),还有接收对端主机发送回来的回送应答消息(ICMP Echo Reply Message)。
值得一提的是,最常用的
ping
命令(判断对端主机是否可达),利用的就是这个消息。
其余类型的ICMP信息,包括类型4:原点抑制消息;类型9、10:路由器探索消息;类型17、18:地址掩码消息,此处就不再赘述了。
IPv4时代,如果没有ICMP,IP协议也是可以正常使用的。但是IPv6中,如果没有ICMPv6,IPv6就无法正常通信。此前提到过,IPv6中有一种ICMPv6消息,用于替代IPv4中的ARP协议。IPv6中,ARP转为ICMP的邻居探索消息(Neighbor Discovery),既融合了IPv4的ARP、ICMP重定向、ICMP路由器选择消息等功能于一提,还提供了自动设置IP地址的功能(要结合DHCPv6)。
ICMPv6中同样将ICMP分为两类:
- 错误消息,类型0~127
- 信息消息,类型128~255
邻居探索消息,类型133~137。该消息用于查询IPv6的地址与MAC地址的对应关系,并由邻居宣告消息得知MAC地址。这种消息利用IPv6的多播地址实现传输。
IPv6中有即插即用,没有DHCP的情况下,也可以实现IP的自动获取。
- 如果没有路由器,那么就是用MAC地址作为链路本地的单播地址。
- 如果有路由器,就通过获取路由器IPv6地址的前面部分,结合MAC地址组成后半部分。