协议森林5——家有宝刀:ICMP 协议

网络层中最重要的协议是 IP 协议,我们已经通过前面的章节了解了 IP 协议。IP 协议的一个重要补充协议是 ICMP 协议。ICMP(Internet Control Message Protocol)介于网络层和传输层的协议。它的用于传输网络诊断信息。
ICMP 协议
ICMP 传输的信息可以分为两类,一类是错误(error)信息,这一类信息可用来诊断网络故障。我们已经知道,IP 协议的工作方式是“我尽力”,如果 IP 包没有被传送到目的地,或者 IP 包发生错误,IP 协议本身不会做进一步的努力。但上游发送 IP 包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送 IP 包。通过 ICMP 包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。由于 ICMP 只提供特定类型的错误汇报,而不会真正纠错,所以它不能帮助 IP 协议成为“可靠”(reliable)的协议。另一类信息是咨询(Informational)性质的,比如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用 ICMP 包回答。
ICMP 协议基于 IP 协议。也就是说,一个 ICMP 包需要封装在 IP 包中,然后在互联网传送。ICMP 是 IP 套装的必须部分,也就是说,任何一个支持 IP 协议的计算机,都要同时支持 ICMP。
ICMP 包的结构:
协议森林5——家有宝刀:ICMP 协议_第1张图片
ICMP 包都会有类型(Type),代码(Code)和校验码(Checksum)三部分。类型表示 ICMP 包的大的类型,而代码是一个类型之内细分的小类型。针对不同的错误信息或者咨询信息,会有不同的类型和代码。从上面我们可以看到,ICMP 支持的类型非常多,就好像瑞士军刀一样,有各种各样的功能。校验码与 IP 协议的头部校验码相类似,但与 IP 协议中校验码只校验头部不同,ICMP 的校验码所校验的是整个 ICMP 包,也就是说包括头部和数据。
余下的 ICMP 包格式根据不同的类型不同。另一方面,ICMP 包通常是由某个 IP 包触发的。这个触发 IP 包的头部和一部份数据会被包含在 ICMP 包的数据部分。
ICMP 协议是命令行工具ping和traceroute的基础。这两个工具常用于网络排错。
常见的 ICMP 包类型
回音
回音(Echo)属于咨询信息。ping命令就是利用了该类型的 ICMP 包。当使用ping命令的时候,将向目标主机发送 Echo-询问类型的 ICMP 包,而目标主机在接收到该 ICMP 包之后,会回复 Echo-回答类型的 ICMP 包,并将询问 ICMP 包包含在数据部分。ping命令是我们进行网络排查的一个重要工具。如果一个 IP 地址可以通过ping命令收到回复,那么其他的网络协议通信方式也很有可能成功。
源头冷却
源头冷却(source quench)属于错误信息。如果某个主机快速的向目的地传送数据,而目的地主机没有匹配的处理能力,目的地主机可以向出发主机发出该类型的 ICMP 包,提醒出发主机放慢发送速度:“请对我温柔一点吧”。
目的地无法到达
目的地无法到达(Destination Unreachable)属于错误信息。如果一个路由器接收到一个没办法进一步接力的 IP 包,它会向出发主机发送该类型的 ICMP 包。比如当 IP 包到达最后一个路由器,路由器发现目的地主机无法正常工作,就会向出发主机发送目的地无法到达(Destination Unreachable)类型的 ICMP 包。目的地无法到达还可能有其他的原因,比如不存在接力路径,比如不被接收的端口号等等。
超时
超时(Time Exceeded)属于错误信息。IPv4 中的存活时间(Time to Live,TTL)和 IPv6 中的最大中继数(Hop Limit)会随着经过的路由器而递减,当这个区域值减为 0 时,就认为该 IP 包超时(Time Exceeded)。如果超时,路由器将发给出发主机的超时类型的 ICMP 包,通知主机发生了超时错误。
traceroute就利用了这种类型的 ICMP 包。traceroute命令用来发现 IP 接力路径(route)上的各个路由器。它向目的地发送 IP 包,第一次的时候,将 TTL 设置为 1,引发第一个路由器的超时错误。这样,第一个路由器回复 ICMP 包,从而让出发主机知道途径的第一个路由器的信息。随后 TTL 被设置为 2、3、4、……,直到到达目的主机。这样,沿途的每个路由器都会向出发主机发送 ICMP 包来汇报错误。traceroute将 ICMP 包的信息打印在屏幕上,就是接力路径的信息了。
重新定向
重新定向(redirect)属于错误信息。当一个路由器收到一个 IP 包,对照其路由表,发现自己不应该收到该 IP 包,它会向出发主机发送重新定向类型的 ICMP,提醒出发主机修改自己的路由表。比如下面的网络:
协议森林5——家有宝刀:ICMP 协议_第2张图片
假如 145.1 发送到 145.15 的 IP 包,结果被中间的路由器通过 145.17 的网卡收到。那么路由器会发现,根据自己的路由表,这个 IP 包要原路返回。那么路由表就可以判断出 145.1 的路由表可能有问题。所以路由器会向 145.1 发送重新定向类型的 ICMP 包。
IPv6 的邻居搜索(Neighbor Discovery)
ARP 协议用于发现周边的 IP 地址和 MAC 地址的对应。然而,ARP 协议只用于 IPv4,IPv6 并不使用 ARP 协议。IPv6 包通过邻居搜索(ND, Neighbor Discovery)来实现 ARP 的功能。ND 的工作方式与 ARP 类似,但它基于 ICMP 协议。ICMP 包有邻居询问(Neighbor Solicitation)和邻居答复(Neighbor Advertisement)类型。这两个类型分别对应 ARP 协议的询问和回复信息。
总结
ICMP 协议是 IP 协议的排错帮手,它可以帮助人们及时发现 IP 通信中出现的故障。基于 ICMP 的工具ping和traceroute也构成了重要的网络诊断工具。然而,需要注意的是,尽管 ICMP 的设计是出于好的意图,但 ICMP 却经常被黑客借用进行网络攻击,比如利用伪造的 IP 包引发大量的 ICMP 回复,并将这些 ICMP 包导向受害主机,从而形成拒绝服务攻击(Denial-of-Service attack)。而重新定向类型的 ICMP 包可以引起某个主机更改自己的路由表,所以也被用作攻击工具。许多站点选择忽视某些类型的 ICMP 包来提高自身的安全性。

你可能感兴趣的:(计算机网络基础协议)