ICMP
网络层中最重要的协议是IP协议,我们已经通过前面的章节了解了IP协议。IP协议的一个重要补充协议是ICMP协议。ICMP(Internet Control Message Protocol)介于网络层和传输层的协议。它的用于传输网络诊断信息
ICMP协议
ICMP
传输的信息可以分为两类,一类信息可用来诊断网络故障。我们已经知道,IP
协议的工作方式是"我尽力",如果IP
包没有被传送到目的地,或者IP
包发生错误,IP
协议本身不会做进一步的努力。但上游发送IP
包的主机和接力的路由器并不知道下游发生了错误和故障,它们可能继续发送IP
包。通过ICMP
包,下游的路由器和主机可以将错误信息汇报给上游,从而让上游的路由器和主机进行调整。由于ICMP
只提供特定类型的错误汇报,而不会真正纠错,所以它不能帮助IP
协议成为"可靠"(reliable
)的协议。另一类信息是咨询(Informational
)性质的,比如某台计算机询问路径上的每个路由器都是谁,然后各个路由器同样用ICMP
包回答。
ICMP
协议基于IP
协议。也就是说,一个ICMP
包需要封装在IP
包中,然后在互联网传送。ICMP
是IP
套装的必须部分,也就是说,任何一个支持IP
协议的计算机,都要同时支持ICMP
。
ICMP
包都会有类型(Type
),代码(Code
)和校验码(Checksum
)三部分。
- 类型表示ICMP包的大的类型
- 代码是一个类型之内细分的小类型。针对不同的错误信息或者咨询信息,会有不同的类型和代码。从上面我们可以看到,ICMP支持的类型非常多,就好像瑞士军刀一样,有各种各样的功能。
- 校验码与IP协议的头部校验码相类似,但与IP协议中校验码只校验头部不同,ICMP的校验码所校验的是整个ICMP包,也就是说包括头部和数据。
ping
和traceroute
这两个运维常用于网络排错的命令就是基于ICMP
的~
ICMP类型
Echo
这个名字好像源自古希腊神话,是一个女孩的名字,具体故事就不说了,总之是一段凄美伤感的故事~
回音(Echo
)属于咨询信息。ping
命令就是利用了该类型的ICMP
包。当使用ping
命令的时候,将向目标主机发送Echo
询问类型的ICMP
包,而目标主机在接收到该ICMP
包之后,会回复Echo
回答类型的ICMP
包,并将询问ICMP
包包含在数据部分。ping命令是我们进行网络排查的一个重要工具。如果一个IP地址可以通过ping命令收到回复,那么其他的网络协议通信方式也很有可能成功。
可以通过抓到的包看到,确实如此,发送方icmp中数据和接收方返回的是一样的
发送
返回
Source Quench
源头冷却(source quench
)属于错误信息。如果某个主机快速的向目的地传送数据,而目的地主机没有匹配的处理能力,目的地主机可以向出发主机发出该类型的ICMP包,提醒出发主机放慢发送速度:"请对我温柔一点吧"。
Destination Unreachable
这个信息运维绝对都见过,目的地无法到达(Destination Unreachable
)属于错误信息。如果一个路由器接收到一个没办法进一步接力的IP
包,它会向出发主机发送该类型的ICMP
包。比如当IP
包到达最后一个路由器,路由器发现目的地主机无法正常工作,就会向出发主机发送目的地无法到达(Destination Unreachable
)类型的ICMP包。目的地无法到达还可能有其他的原因,比如不存在接力路径,比如不被接收的端口号等等。
Time Exceeded
超时(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
重定向(redirect
)属于错误信息。当一个路由器收到一个IP
包,对照其路由表,发现自己不应该收到该IP
包,它会向出发主机发送重新定向类型的ICMP
,提醒出发主机修改自己的路由表。比如,192.168.0.5
将本应发给192.168.0.9
的icmp
包发到了,192.168.0.1
,此时192.168.0.1
就会返回一个重新定向类型的ICMP
包给192.168.0.5
。
Neighbor Discovery(IPv6)
解释邻居搜索(Neighbor Discovery)前,需要先说下ARP,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包来提高自身的安全性。