2.3 网络层协议概述
趣学CCNA——路由与交换
网络层的协议不胜枚举,完全不可能一一进行介绍。在本节,我们会挑其中几个对网络行为产生极大影响的协议进行介绍。
话说回来,虽说网络层协议多如牛毛,但在众多网络层协议之中,有一个协议光辉太过耀眼,让人们几乎忘记了其他协议的存在。它的重要性是如此不容忽视,以至于它的名称叫做“互联网协议 ( Internet Protocol )”,简称为IP协议。那么,让我们就从这个互联网协议说起吧。
2.3.1 IP介绍
在那个“模型们”还没有走上历史舞台的年代,IEEE发布了一篇论文,题为“一个实现数据网通信的协议”。这篇论文的两位作者(文顿·格雷·瑟夫先生和罗伯特·埃利奥特·卡恩先生)描述了一个在网络节点之间,使用包交换的方式共享资源的互联网络协议。这个协议的核心叫做“传输控制程序”,它由两部分组成,其中一部分的功能是提供面向连接的传输;另一部分则是提供数据报文服务。后来,就像很多读者可能已经猜测到的那样:这个程序的两大功能按照分层的理念被分为了两个协议,其中一个协议负责提供面向连接的传输,叫做传输控制协议,简称TCP;另一个提供数据报文服务,叫做互联网协议,简称IP。这两个协议分别工作在传输(Transport)层和互联网(Internet)层,由此诞生的四层模型就是后来的DoD模型(见图2-1下面的注释)。最开始是需求,然后是协议,最后诞生了分层模型,这是具有盘古开天地或者创世纪意义的事件,至少对于网络世界来说,这样的形容毫不夸张。
因此,IP协议原本就是传输控制程序中负责提供数据报文服务的一个组成部分。既然原本的传输控制程序中已经安排了TCP来提供有连接的数据传输服务,那么IP 协议必然也是一个无连接的协议,而它提供的数据报文服务肯定不包含在TCP协议之中。那么,IP协议到底能够为数据报文提供什么样的服务呢?
这个关子卖得一分钱不值,因为不知道IP协议的人,不会有耐心把这本书读到现在——没错,IP 提供的 服务,主要就是寻址。下面,我们按照前面的惯例,通过分析IP数据包头部格式,来研究这项协议能够提供给的功能,请看图2-8。
版本:IP协议不只有一个版本,但我们当前最常使用的IP协议叫做IPv4。所有IPv4封装的数据包,版本号字段的取值当然全都是4。虽然新版的IP协议(也就是IPv6协议)为了提供更丰富的地址资源,也为了斧正IPv4的一些缺陷,而对数据包头部格式进行了重新的定义,但它依然保留了版本字段,且取值为6。当然,IPv6定义的头部格式我们会在第15章中进行深入的介绍。
首部长度:如果看到这个字段时,您的目光就开始自动在首部格式中搜索“可选项”字段,说明您的学习已经入门了。没错,首部长度需要通过头部格式中字段的取值进行描述,说明这个首部是不定长的,因此一定存在可选项字段,不过我们不会在这一章中介绍IP协议头部的可选项字段,因为它们并不常用。
服务类型:这个字段的作用是向设备说明,是否应该对数据包进行特殊处理,以及应该如何对数据包进行特殊处理。
总长度:总长度字段相当于UDP协议的长度字段,它的数值标明了这个数据包头部与数据部分的长度之和。图2-8标记得很清楚,IP包头如果没有可选项,也没有携带任何数据,则长度为20字节。
标识符、标志与段偏移量:数据在链路中传输是有长度限制的,就像载货车在路上跑是有限重的一样。如果一辆车跑着跑着,发现车皮加货物的总重量超过了前面这个道路的限重,就应该停车卸货分装,这个过程叫做“分片”,有时也翻译成“分段”。可是最终,同一批货毕竟还是要拾掇齐了才能交付的。为了能把分装的货按照原样组装回去,难免需要贴一些标签,说明哪些货是同一批的,以及如何把它们组装在一起。标识符、标志和段偏移量就是这样的标签。
TTL :TTL的全称是生存时间(Time-To-Live)。这个字段定义的本来是数据包在网络中最长能跑多长时间。后来人们发现数据包跑得实在是太快了,就转而把这个字段定义成了数据包在网络中最多能穿过多少台路由器设备。这个字段的目的是为了防止数据按照一些不靠谱的行程,遭遇“迷失”,在网络中沿着一条环路永远这样跑下去。这样跑的数据多了,网络岂不是会被堵死?
协议号:这个字段定义的是IP封装上层的协议,就像TCP/UDP协议的端口号字段定义的是它们上层的协议一样。
首部校验和:校验数据在传输的过程中,头部是否发生了变化。
源地址和目的地址:信封上的发信人地址和收信人地址。这两个32位的地址我们会单拿一章进行介绍。好消息是那一章的内容极为枯燥,敬请期待。
关于IP协议,我们姑且介绍到这里,上面的内容仅仅有助于读者了解这项协议所定义的功能。但是这项协议最重要的信息在于它的地址部分,而介绍它的地址必须以一整章的内容展开说明,敬请读者稍安勿躁。而下面,我们要介绍另一个网络层的协议,那就是与IP协议关系极为密切的互联网控制消息协议(ICMP)。
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-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消息。如果这两台设备的网络层互相可达,我们就会收到主机B发来的Echo Reply消息。关于IP地址的问题,我们会在后面的章节中详加阐述。
目的地不可达 ( Destination Unreachable) 消息:如果路由器不能定位一个目的地址,就会发出这类消息。
发送超时 ( Time Exceeded) 消息:当数据包的TTL为0时,路由器就会发出这类消息。trace是除了ping之外,另一项使用ICMP协议的常用路径检测工具。它的原理就是通过接收路由器发送的超时消息来了解去往某个目的地址的沿途路径情况。trace的具体做法是这样的:把去往那个目的地址数据包的TTL值依次设置为1、2、3……以此类推,然后发送出去。于是,这些数据包在经过沿途的路由器时,总会有其中一个的TTL值递减至零,于是路由器就会向始发设备发出发送超时消息。根据收到的这些消息就能跟踪发往目的地的数据包在网络上依次通过的路由器,从而统计路径的数据和时间开销。
关于ICMP,我们的介绍已经足够读者完成CCNA阶段的学习,下面我们来介绍本章的最后一个协议:ARP协议。
2.3.3 ARP介绍
对于没什么网络基础的同学,我们先对下一章进行一个小小的预告。在局域网中,每个接口都有一个硬件地址,叫做MAC地址。这个地址与IP数据包头部的地址最大的不同之处在于,它是出厂的时候就烧录在板卡上的。那IP地址呢?如果您配置过家用宽带路由器,或者对您家里的任何一台PC执行过网络配置,您就会明白:IP地址是咱们自己填在地址栏里的。当然,我们有时候也会对IP地址进行自动配置。但不管手动配置还是自动配置,IP地址终究是可以管理的。
如果一个数据帧经过局域网接口的封装,需要转发给这个局域网中的某台设备,那么它就一定要封装上那台目的设备的 MAC 地址。问题是,始发的这台设备要怎么才能知道烧录在人家硬件上的地址呢?答案是,它只能去问知道这个地址的设备。那么,哪台设备知道这个地址呢?通常情况下,这个问题的答案是:当然是那台设备自己知道自己的硬件地址(例外情况姑且不提)。
这样一来,我们发现问题变成了一个死循环:因为A设备不知道B设备的硬件地址,所以没法向B发包,所以A要设法搞到B的硬件地址,因为B知道自己的硬件地址,所以A要向B发包询问,因为A不知道B的硬件地址,所以没法向B发包。
有办法吗?
有。
在火车站,孩子丢了。因为不知道孩子在哪里,所以要找人问,因为只有孩子自己知道自己在哪里,所以这个问题应该问孩子本人,因为找不到孩子,所以没法问。怎么办?广播寻人呗。孩子听见广播,自己就找车站的制服阿姨带他去广播室了。
于是,我们想到,A可以“以B的IP地址作为目的IP地址,以自己的IP地址作为源IP地址,以广播地址作为目的MAC地址,以自己的MAC地址作为源MAC地址”,这样封装一个二层的数据帧,把它发送出去。这样一来,虽然局域网中的所有设备都会收到这个数据包,但只有B在接收到这个数据包时,才会通过查看其目的IP地址而发现这个数据包找的是自己,于是它会以自己的IP和MAC地址作为源IP和源MAC地址,以A的IP和MAC地址作为目的IP和目的MAC地址,向A发送一个数据包,这样就将自己的MAC地址发送给了A。从此A和B幸福地生活在了一起。注意,定义这种MAC地址解析方式的协议,就叫做ARP 协议,全 称地址解析协议。
您也许想问,既然有了MAC地址,为啥还要搞出来一个什么IP地址,然后再为了对应这两个地址,还得用什么乱七八糟的协议去解析,只有一个地址不好吗?
那麻烦可就大了。
前面说过,MAC地址是烧录在硬件上的地址,它是一个物理地址,它的属性是自然属性,就像人脸一样。这个世界上固然千人千面,一张脸就足以唯一地定义一个人。但是靠这种纯自然的属性,是无法对人进行归类的。而无法归类就无法找寻,茫茫人海,想靠一张照片就找到这个人,恐怕比上青天还不知道难了多少倍。
而IP地址是人们定义的一个逻辑地址,它的属性是抽象属性,就像咱们的家庭住址一样,是经过了抽象和汇总的。中华人民共和国北京市海淀区苏州街18号长远天地大厦B1-1005是一个层层缩小、层层具体的范围,按照这个范围,寻找一个人又是何其容易的一件事。
关于MAC地址与局域网,关于IP地址及其分类和汇总,后面的故事还有很多,请读者拭目以待。