趣学CCNA:路由与交换(第2版)
上QQ阅读APP看书,第一时间看更新

2.3.2 ICMP

没吃过猪肉,还没见过猪跑?没听说过ICMP,还没在家里装宽带路由器的时候按照说明书去ping过几个地址?其实,ping是一项测试工具,这个工具所使用的就是ICMP,其目的是检测对方与自己在网络层上的连通性。说得再通俗点,就是看看发起ping的这台设备与它去ping的那台设备,在网络层能不能“通”。如果说ICMP是第二常用的网络检测协议,估计没有协议敢称第一。

在这里,有些读者也许感到不解:既然ICMP的功能是检测网络层的连通性,它的分层就应该高于网络层,何况ICMP还封装在IP头部之内,更让它像极了一个传输层的协议。这大概是这些读者第一次有机会产生这种不解。

首先,对于在我提出这个问题之前就有了产生这个疑问的读者,我表示钦佩,你的理解能力真的很强,而且你也的确相当准确地把握了分层模型的理解方式。确实,ICMP既不完全属于网络层,也不完全属于传输层,而是介于这两层之间。为了便于读者理解网络层相关的操作和协议,我们姑且将ICMP放在网络层部分进行介绍。后面我们要进行介绍的ARP也存在同样的问题。

这是各类分层模型经常遭遇的尴尬之一,TCP/IP模型是对TCP/IP协议栈所进行的一种描述,但世界上没有一种分类模型能够既无所不包地考虑到每一个已有协议的特点,又料事如神地预测到未来的所有需求与环境。这就像社会发展五段论对欧洲社会的过往进行了充分的概括,又对人类社会未来的发展作出了自己的预言。但这种历史发展规律未必能严丝合缝地套用到欧陆之外的地区。人类文明在不同的发展历程中表现出的共性还是远大于差异性。为了强调差异性而认为一切探讨共性的努力都是纸上谈兵,这种态度是弊大于利的。

TCP/IP模型则是根据实际环境总结出来的协议模型,尽管大把协议还是无法按照它的分层方式而毫无争议地被归入某一层之中,但瑕不掩瑜,它提供的功能分类仍然对这个行业具有不容小觑的指导意义。推荐读者在学习不同协议的时候,先去思考一下它的分层,如果发现它的分层确实存在争议,那就“入乡随俗”,不必进行深入的理论挖掘。思考分层,有助于读者理解分层结构,并潜移默化地用它来指导配置和排错的工作。不进行理论挖掘,是因为这样做实在意义不大。在此,我还是想搬出在介绍OSI模型时提到的那句话:分层模型固然重要,具体协议仅供参考。

回到正文,前面我们说ICMP是封装在IP数据包中的,具体方法是作为IP数据包中的数据部分,并且在前面添加上图2-8所示的IP数据包头部。封装后的ICMP消息如图2-9所示。

图2-9 ICMP消息的封装

当然,ICMP也有自己定义的头部格式,它的头部格式如图2-10所示。

图2-10 ICMP的头部格式

从图2-10不难看出,ICMP定义了一些不同的消息类型,就连头部格式都会因消息类型而有所区别。在这里,我们只介绍4种与日常使用关系最为密切的消息类型供读者参考。

回应(Echo)消息和回应应答(Echo Reply)消息:这是ping工具用来测试数据包是否在网络层可达时,测试设备和被测试设备之间相互发送的消息。比如,主机A的IP地址为10.0.0.2,主机B的IP地址为10.0.0.3。那么,在我们通过主机A测试A到B网络层的连通性时,就可以输入命令ping 10.0.0.3,向B发送Echo消息。如果这两台设备的网络层互相可达,主机A就会收到主机B发来的Echo Reply消息。关于IP地址的问题,我们会在后面的章节中详加阐述。

目的地不可达(Destination Unreachable)消息:如果路由器不能定位一个目的地址,就会发出这类消息。

发送超时(Time Exceeded)消息:当数据包的TTL为0时,路由器就会发出这类消息。trace是除ping之外另一项使用ICMP的常用路径检测工具,它的原理就是通过接收路由器发送的超时消息来了解去往某个目的地址的沿途路径情况。trace的具体做法是这样的:把去往那个目的地址数据包的TTL值依次设置为1、2、3……以此类推,然后发送出去。于是,这些数据包在经过沿途的路由器时,其中总会有一个的TTL值递减至零,于是路由器就会向始发设备发出发送超时消息。根据收到的这些消息就能跟踪发往目的地址的数据包在网络上依次通过的路由器,从而统计沿途路径中的数据和时间开销。

关于ICMP,我们的介绍已经足够读者完成CCNA阶段的学习,下面我们来介绍本章的最后一个协议:ARP。