2.3 OSI参考模型
OSI参考模型最重要的功能之一是帮助不同主机之间进行数据传输——这意味着,比如说允许我们在Unix主机和PC或Mac主机之间传输数据。
但是OSI并不是一个物理模型;它是一组指导方针,应用开发商使用这个指导方针来创建并实施应用,使其运行在网络中。它还提供了一个框架,来创建和实施网络互联标准、设备和互联网络规划。
OSI有7个层,分为2个组。上面的三层定义了终端工作站中的应用如何相互通信,以及如何与用户通信。下面的四层定义了如何端到端地传输数据。图2.5展示了上三层的功能,图2.6展示了下四层的功能。
在学习图2.5时,要知道计算机的用户接口(位于应用层),还要知道较高层的作用是实现应用和主机之间的通信。要记住,较高层不知道网络互联或网络地址信息,这是下四层的功能。
在图2.6中可以看出下面的四层定义了如何通过物理线缆或通过交换机和路由器,传输数据;还定义了如何重新建立传输主机和目的主机的应用之间的连接。
下面的网络设备工作在OSI模型的全部7七层上。
- 网络管理站(NMS)
- Web和应用服务器
- 网关(不是默认网关)
- 网络主机
基本上,ISO很像网络世界的Emily Post。与Post女士撰写了人类社会规范标准——或协议一样,ISO开发了OSI参考模型,为开放式网络协议集提供了先例和指导。通过定义通信模型的规范,它至今仍是对比不同协议集最常用的方法。
如前所述,OSI参考模型有以下七层。
- 应用层(第七层)
- 表示层(第六层)
- 会话层(第五层)
- 传输层(第四层)
- 网络层(第三层)
- 数据链路层(第二层)
- 物理层(第一层)
图2.7总结了图2.5和2.6中列出的OSI模型各层的功能。
整体了解后,接下来具体看看每一层的详细介绍。
2.3.1 应用层
OSI模型的应用层(Application Layer)是实际上处理用户与计算机之间通信的位置。这一层只在发生以下情况时才提供服务,即应用需要访问网络时,比如Internet浏览器(IE)。你可以卸载系统中的每个网络组件,比如TCP/IP、网卡(NIC)等,卸载后你仍可以使用IE来浏览本地的HTML文档——这是没有问题的。但若想使用HTTP来获得HTML文档,或者通过FTP或TFTP来获得文件,情况就变得复杂了。因为这时IE将会尝试访问应用层,来请求这些文件。这时真正发生的事件是这样的:应用层是实际应用程序(应用程序甚至根本不属于OSI层级结构中的任何一层)的接口,应用层的下一层会将应用信息向下发送到协议栈。换句话说,IE浏览器并不运行于应用层——当需要访问远端资源时,它充当了应用程序与应用层协议之间的接口。
应用层还负责为意图建立通信的双方识别并确立它们之间是否存在通信的可能性,并确定是否有足够的资源来支持双方的通信。
这些工作很重要,因为计算机上的应用有时不仅仅需要桌面资源。它们常常需要将多个网络应用中的通信组件结合起来。文件传输和电子邮件就是典型的案例,它们都启用了远程访问、网络管理活动、客户端/服务器处理过程和信息位置功能。很多网络应用都通过企业网为通信提供服务,但当前以及将来的互联网络需要的是快速发展,并且超出了当前物理网络的限制。
注意
一定要记住,应用层扮演的角色是真实应用程序之间的接口。这也就是说,以Microsoft Outlook为例,它并不属于应用层,但它是拥有应用层协议的接口。第4章“TCP/IP DoD模型”将介绍一些真正属于应用层的程序,比如FTP和TFTP。
2.3.2 表示层
表示层(Presentation Layer)的命名来自于它的用途:它将数据呈现给应用层,它负责提供数据转换和编码格式。
表示层本质上是一个转换器,提供编码和转换功能。成功的数据传输技术会在传输数据之前,将数据改编为标准格式。计算机可以接收这种通用格式的数据,然后将数据转换成本地格式,再进行实际阅读(比如将EBCDIC转换为ASCII)。通过提供转换服务,表示层确保了从一个系统的应用层发出的数据,能够被另一个系统的应用层识别。
OSI提供了协议标准,其中定义了标准的数据格式。表示层还与数据压缩、解压缩、加密和解密工作相关。有些表示层标准还涉及了多媒体业务。
2.3.3 会话层
会话层(Session Layer)负责建立、管理和拆除表示层通信对之间的会话,它还提供了设备或节点之间的会话控制功能。它能够协调系统之间以及服务之间的通信,并通过三个不同模式对通信进行管理:单工(Simplex)、半双工(Half Duplex)和全双工(Full Duplex)。总而言之一句话,会话层的基本作用就是使不同应用的数据与其他应用的数据区分开来。
2.3.4 传输层
传输层(Transport Layer)将数据分段并重新组合后放入数据流中。传输层提供的服务能够将更高层应用中的数据分段并重新组合,并将这些数据放入相同的数据流。它们提供了端到端的数据传输服务,并且在互联网络中,在发送主机和目的主机之间建立了一条逻辑连接。
有些人可能已经很熟悉TCP和UDP了(如果不了解也不要紧——我会在第4章进行详细介绍)。你会知道这两个协议都是工作在传输层的,并且TCP提供可靠服务,UDP提供不可靠服务。也就是说应用开发者拥有更多的选择,在与TCP/IP协议协同工作时,他们可以从这两个协议之间选择一个。
传输层提供的机制能够复用更高层应用、建立会话并拆除虚拟线路。它还对更高层隐藏了所有与网络相关的信息细节,因而提供了透明传输。
注意
可靠的网络通信(Reliable Networking)这一术语可以用在传输层。这个术语意味着这个协议中使用了确认、排序和流控制机制。
传输层可以是无连接的,也可以是面向连接的。但Cisco更希望你能够理解传输层中面向连接的这一部分内容。接下来的小结大体介绍了传输层中面向连接的(可靠的)协议。
流控制
数据完整性是由传输层保障的,传输层会维持流控制(Flow Control)并且允许系统之间的应用请求使用可靠的数据传输协议。流控制能够防止连接一端的发送主机使接收主机的接收缓存溢出——这种情况会导致丢失数据。可靠的数据传输依赖于系统之间面向连接的通信方式,并通过各种协议实现以下目标。
- 接收方会在收到分片后,向发送方进行确认。
- 所有未被确认的分片会被重传。
- 分片在到达目的地后,会被重新排列为正确的顺序。
- 维持一个可管理的数据流,以避免拥塞、过载和数据丢失。
注意
流控制的目的是让接收方有办法管理从发送方那里接收的大量数据。
面向连接的通信
在可靠传输的操作中,想要传输数据的设备通过向远端设备创建一个会话,即建立一条面向连接的通信会话。传输设备首先会与对端系统建立一条面向连接的会话,这一行为称为呼叫建立(Call Setup)或三次握手(Three-Way Handshake),然后传输数据。传输结束后,会由呼叫终结(Call Termination)来拆除这条虚拟线路。
图2.8描述了发送系统和接收系统之间典型的可靠会话建立过程。从图中可以看出,双方主机的应用程序都会首先告知各自的操作系统:要初始化一条连接。两个操作系统通过在网络上发送消息来进行通信,以此确定双方均允许初始化连接,并且均准备好初始化连接。在必须的同步过程结束后,建立起一条连接,接着开始进行数据传输(这个虚拟线路的创建过程成为开销)。
在两台主机传输信息的过程中,它们会周期性地检查对方的状态,它们通过各自的协议软件进行通信,以确保运作正常且数据接收工作也正常。
图2.9中总结了面向连接的会话——三次握手——的建立步骤。
- 第一条“连接协定”部分表示请求同步。
- 下面这个部分确认了两台主机之间请求及建立连接的参数——规则,且要求接收方的信息也在这里进行同步,这样才能建立一条双方向的连接。
- 最后一部分也是确认。它告知目的地主机:连接协定已经被接受了,实际连接已经建立了。现在可以开始进行数据传输了。
这一过程看起来很简单,但实际上事情并不总是这么顺利。有时在传输过程中会发生拥塞,这是因为高速率计算机生成数据流的速度比网络处理传输的速度快,可能是许多计算机同时通过一个网关发送数据,或者是由目的地导致的网络拥塞。在后一情况中,网关或目的地的拥塞甚至与源无关。无论在哪种情况中,本质问题都与道路瓶颈类似——流量太大,而容量太小。通常这不是一辆车引发的问题,而是道路上的车辆太多。
那么,当一台设备收到的数据量超出了它的处理极限时,会发生什么?它会把暂时无法处理的数据放入名为缓存(Buffer)的内存空间中。但是缓存空间只能够解决小量突发的数据。若数据量很大且数据流持续不断的话,设备的内存空间最终会被耗尽,突发容量会被占满,最终设备会把后续收到的所有数据包丢弃。
但你也不用过于担心。因为传输协议所提供的功能,使得网络流控制系统能够非常良好地工作。为了避免大量“倾倒”数据并导致数据丢失,传输协议可以向数据流的发送方(或者源设备)发出一个“未就绪(Not Ready)”提示,详见图2.10。这个机制运作起来就好像红灯一样,告诉发送方设备停止向超载的接收方设备传输数据分段。当对等体接收设备将缓存中的数据分段处理完成,它会发出意为“就绪”的传输指示。而等待继续发送其余数据的设备收到了这个“就绪”指示后,它就会开始继续传输。
基本上,在使用可靠的、面向连接的数据传输协议时,接收方设备接收数据报文的顺序与发送方设备发送数据报文的顺序完全相同——如果顺序被打乱,传输就失败了!如果在传输过程中一个数据分段丢失了、重复了或者被破坏了,传输就会失败。这一问题是通过如下机制解决的:接收方设备需要确认它收到了每一个数据分段。
如果具有以下特征,我们就把它称为面向连接的服务。
- 建立了一条虚拟链路(比如三次握手)。
- 使用序列机制。
- 使用确认机制。
- 使用流控制。
注意
流控制机制的类型分为:缓存、滑动窗口和拥塞避免。
滑动窗口
理想状况下,数据的传输是快捷且高效的。你一定能够想到,如果发送方设备必须在发送每个数据分段之后,必须等待一个确认,那么传输速度肯定会降低。但正是由于在发送方传输数据分段之后,到它处理完确认信息之前,有那么一小段时间,因此发送方设备会借此机会传输更多数据。在接收到确认信息之前,传输设备所能够发送的数据分段数量,就称为窗口(Window)。
注意
窗口负责控制未经确认的数据分段的数量。
窗口的大小控制着从一端传输到另一端的信息量的多少。有些协议以数据包的数量为计量单位,TCP/IP以字节数为计量单位。
从图2.11中可以看到两个窗口大小——一个设置为1,另一个设置为3。
当你把窗口大小配置为1后,发送方设备在每发送一个数据分段后都需要等待一个确认信息,之后才能发送另一个数据分段。如果你把窗口大小配置为3,发送方设备能够在接收到确认信息之前,发送3个数据分段。
在这个简化了的小案例中,发送方设备和接收方设备都是工作站。在现实环境中,使用的计量单位就不是简单的计数了,而是能够发送的字节数。
注意
如果接收方主机没有收到所有它应该收到的字节,这台主机可以通过缩小窗口大小来提高通信会话的效率。
确认机制
在数据流通过正常运作的数据链路,从一台设备传输到另一台设备的过程中,可靠的数据传输机制会确保数据流的完整性。它能够确保数据流不会重复,也不会丢失。这是通过具有重传功能的主动确认机制(Positive Acknowledgment With Retransmission)进行保障的——这一机制要求接收方设备在接收到数据时,向发送方设备发送一个确认消息。发送方设备会记录每个数据分段的字节数。在发送了足够多字节的数据分段后,它会等待确认消息,收到确认消息后再继续发送下一轮字节。当发送方设备发送了一个数据分段后,它会开启一个计时器,若在这个计时器超时之前都没有从接收方那里收到这个数据分段的确认消息,它就会重传这个数据分段。
在图2.12中,发送方设备传输了数据分段1、2和3。
接收方设备会通过在ACK 4中请求数据分段4,来确认自己收到了前一个数据分段。发送方设备在收到了这个确认消息后,就会接着发送数据分段4、5和6。如果数据分段5没有成功到达目的地,接收方设备会向发送方设备告知这一事件,并请求对方重传这个数据分段。这时发送方设备会重新发送丢失的数据分段并等待确认消息,它必须在按照正确的顺序接收到确认消息后,才会继续发送数据分段7。
2.3.5 网络层
网络层(也称为第三层)负责管理设备的寻址,追踪设备在网络中的位置,并且负责决定传输数据最佳的路径。也就是说,位于不同网络的设备之间如果需要传输数据的话,网络层必须为这些设备传输流量。路由器(第三层设备)就是特别为网络层设计的,在互联网络之间提供路由服务。
事情是这样的:首先,当路由器的某个接口接收到一个数据包后,它首先会检查数据包的目的IP地址。如果数据包不是去往这台路由器的,路由器会在路由表中查找目的网络地址。当路由器选择好出接口后,它会把数据包发送到那个接口,封装成帧并发送到本地网络中。如果路由器无法在路由表中找到与这个数据包目的网络相对应的路由条目,路由器就会丢弃这个数据包。
网络层使用的数据包类型有两种:数据和路由更新。
数据数据包 ( Data Packet ):用来通过互联网络来传输用户数据。用来支持数据流量的协议称为被路由协议(routed protocol),比如IP和IPv6都是被路由协议。第5章将介绍更多有关IP寻址和IPv6的内容。
路由更新数据包 ( Route Update Packet ):用来更新邻居路由器的信息,即更新互联网络中所有路由器所连接的网络的相关信息。用来发送路由更新数据包的协议称为路由协议(routing protocol),RIP、RIPv2、EIGRP和OSPF等就是常见的路由协议。路由更新数据包用来帮助构建和维护每台路由器上的路由表。
图2.13给出了两个路由表的案例。
路由器使用的路由表中包含以下信息。
网络地址 网络地址是与协议相关的。路由器必须为每种被路由协议维护单独的路由表,因为不同的被路由协议会使用完全不同的寻址机制来构建网络拓扑,比如IP、IPv6和IPX。想象一下这样一个场景,使用不同语言的人居住在同一条街上,因此路标分别用不同的语言标识。假设这条名为“猫”的街上住了美国人、西班牙人和法国人,那么路标就得写成Cat/Gato/Chat。
接口 去往特定网络,数据包将会使用的出接口。
度量值 到达远端网络的距离。不同的路由协议会使用不同的方法来计算这个距离。第10章中将介绍路由协议,现在只要知道一点就行了:有的路由协议(其实也就是RIP)使用跳数进行计算(为了到达远端网络,数据包需要穿越的路由器数量),其他路由协议使用带宽、线路延迟,甚至tick count(1/18秒)来进行计算。
前文提到过路由器分隔广播域,也就是默认情况下,路由器是不会转发广播的。你还记得这样设计的好处是什么吗?路由器也会分隔冲突域,你也可以使用二层(数据链路层)交换机来分隔冲突域。路由器上的每个接口都分别代表一个独立的网络,因此必须为每个接口分配唯一的网络识别号,网络中所有连接到路由器这个接口的主机也必须使用相同的网络号。图2.14展示了在互联网络中,路由器是如何工作的。
你需要记住以下这些有关路由器的知识点。
默认情况下,路由器不会转发任何广播或组播数据包。
- 路由器使用网络层地址中的逻辑地址,来决定转发数据包的下一跳路由器。
- 路由器可以使用访问列表(访问列表由管理员创建),来提供安全控制,允许某些类型的数据包进入或离开某个接口。
- 如果需要的话,路由器可以提供二层桥接功能,也可以同时通过相同的接口提供路由功能。
- 三层设备(也就是本例中的路由器)在VLAN(虚拟局域网)之间提供联通性。
- 路由器可以为特定类型的网络流量提供QoS(服务质量)。
2.3.6 数据链路层
数据链路层负责为数据提供物理传输,并负责处理错误通知、网络拓扑,以及实施流控制。这意味着数据链路层会使用硬件地址,来确保把消息发送到相同LAN中的正确设备上,在此过程中,它还会负责将来自于网络层的消息转换为比特的格式,以便物理层进行传输。
数据链路层会把消息重新编辑格式,编辑后的每一片称为一个数据帧(Data Frame),它会添加自定义的头部,其中包含硬件目的地址和源地址。这些添加的信息构成了类似容器胶囊的结构,把原始消息包裹在其中。这与将引擎、巡航设备和其他工具添加到阿波罗项目的环月组件相同。这个设备的不同部分会在太空飞行的不同阶段发挥作用,当它们的使命完成时,各个部分会脱离整个设备并被丢弃。数据传输在网络中的形式也是类似的。
图2.15展示了以太网和IEEE定义的数据链路层。细看的话你会发现,IEEE 802.2标准与其他IEEE标准结合在一起,并为其添加了更多的功能。
有一点非常重要你一定要知道,路由器工作在网络层,它完全不会在意特定的主机具体位于什么地方。它们唯一关心的问题是网络位于什么地方,以及去往该网络(包括远端网络)的最佳路径是什么。路由器是只关注网络的设备,但毕竟这也是好事一件!真正唯一地标识出本地网络中的每台设备,是数据链路层所做的工作。
当本地网络中的一台主机向另一台主机发送数据包,或者当路由器之间传输数据包时,数据链路层使用硬件地址解析功能。每次在路由器之间发送数据包时,数据包都会在数据链路层被封装成帧,其中包括控制信息。然后接收方路由器会把这些封装的信息剥除,剩下原封不动的原始数据包。数据包的封装和解封装过程会在每一跳重复发生,直到数据包到达了最终的目的地主机。有一点非常重要一定要理解,那就是在沿着路由器一路转发的过程中,数据包本身是不会发生任何改变的;它只是会被封装上一些控制信息,当数据包被传输到不同类型的媒介上时,会需要到这些控制信息。
IEEE定义的以太网数据链路层分为以下两个子层。
媒介接入控制( MAC ) 802.3 **定义了如何将数据包放到媒介中。当所有人共享所有带宽时,竞争媒介接入机会的原则是“先到先得”。物理寻址和逻辑拓扑也是在这里定义的。什么是逻辑拓扑呢?它是通过物理拓扑的信令路径。这一子层中还可以使用line discipline、错误通知(并不纠正)、排序要发送的数据帧,以及可选的流控制机制。
逻辑链路控制( LLC ) 802.2 **负责识别网络层协议,然后封装它们。LLC头部负责告诉数据链路层,在接收到这个数据帧后,要对它做什么。具体工作方式是这样的:主机接收到一个数据帧后,会查看LLC头部,以便得知这个数据包是去往哪里的——也就是位于网络层的IP协议。LLC还可以提供流控制,并对控制比特进行排序。
在本章开篇我提到的交换机和网桥都工作在数据链路层,并根据硬件(MAC)地址来筛选网络信息。接下来我们详细讨论一下这部分内容。
工作在数据链路层的交换机和网桥
我们把二层交换看做是基于硬件的桥接,因为它使用一个专门的硬件,即ASIC(专用集成电路)。ASIC可以以吉比特的速率工作,并且延迟非常低。
注意
延迟在这里指的是从数据帧进入一个端口,到它离开整个端口所花费的时间。
网桥和交换机会在数据帧穿越网络时,读取数据帧的内容。二层设备会把源硬件地址放入一个过滤表中,以便记录是从哪个端口收到这个数据帧的。这一信息(记录在网桥和交换机的过滤表中)有助于设备确定具体终端设备的位置。图2.16展示了互联网络中的交换机。
房地产业的关键是位置、位置、位置,对于二层和三层设备来说也是如此。尽管这两类设备需要感知网络拓扑的能力,但它们的关注点却不尽相同。从根本上来说,三层设备(比如路由器)需要定位的是具体的网络,而二层设备(比如交换机和网桥)需要定位的是具体的设备。因此路由器关注的是网络,交换机和网桥则关注每一台设备。路由器中的路由表会“映射”互联网络,而交换机和网桥中的过滤表会“映射”每台设备。
当二层设备上构建出一个过滤表后,它只会转发那些目的硬件地址已经定位好了的数据帧。如果目的设备与这个数据帧位于同一个网段,二层设备会锁定这个数据帧,防止它去往其他网段。如果目的地位于另一个网段,数据帧只能被传输到那个网段中。这被称为透明桥接(Transparent Bridging)。
若交换机接口收到了一个数据帧,并且没有在它的过滤表中找到这个数据帧的目的硬件地址,它会把这个数据帧转发给所有它所连接的网段。如果这个“神秘数据帧”所去往的未知设备应答了这个转发行为,交换机会根据这台设备的位置来更新过滤表。但因为传输这个数据帧所使用的目的地址是广播地址,因此交换机默认会向所有连接的网段转发广播。
所有收到这个转发广播的设备都属于同一个广播域。这会带来一个问题:二层设备会产生二层广播风暴,并最终影响设备性能,唯一能够阻止广播风暴蔓延的方法是使用三层设备——路由器。
在互联网络中使用交换机来代替集线器,最大的好处在于交换机的每个端口实际上自己就是一个冲突域(而集线器会建立一个大冲突域)。但是即使配备了交换机,在默认情况下,你仍然无法分离广播域。交换机或集线器都无法分离广播域。它们只会简单地转发所有广播。
使用LAN交换技术代替集线器的另一个好处是每台插在交换机上的设备都可以同时传输数据——最起码它们可以认为每个端口只插入了一台主机,而不是插入了一个集线器。读到这里你可能已经猜到了,集线器在同一时间只允许同一网段中的一台设备发送数据。
2.3.7 物理层
终于讲到了最底层,物理层(Physical Layer)做了两件事:发送比特以及接收比特。比特是由1和0构成的——以数字表示的莫尔斯编码。物理层直接与各种类型的实际通信媒介进行通信。不同类型的媒介会以不同的方式来表达这些比特。有些使用多种音频,其他的使用状态变化——电压由高到低,或者由低到高。对于每种类型的媒介来说,都需要使用特定的协议来描述正确的比特格式,将数据编码到媒介信令的方式,以及物理媒介连接接口的不同质量。
物理层定义了在两个终端系统之间激活、维持和关闭物理联路所需要的所有电气特性、机械特性、程序性需求和功能性需求。这一层也负责区分DTE(数据终端设备)和DCE(数据通信设备)接口(一些老电话公司的职员仍称DCE为数据电路终端设备)。DCE通常位于运营商,DTE是与其相连的设备。通常需要通过调制解调器或者CSU/DSU(信道服务单元/数据服务单元)来获得DTE所提供的服务。
OSI为物理层定义了连接器标准以及不同的物理拓扑,以便使分离的系统之间能够相互通信。CCNA课程只关注IEEE以太网标准。
工作在物理层的集线器
集线器(Hub)实际上是一个多端口的转发器。在转发器接收到一个数字信号后,它会增强或重新生成这个信号,然后将这个数字信号从所有活跃的端口转发出去,在此期间无需查看任何数据。活跃的集线器也是这样做的。从集线器上的一个端口收到数字信号后,集线器会增强或重新生成这个信号,然后将这个数字信号从接收端口之外的所有端口转发出去。也就是说所有连接在一台集线器上的设备都属于同一个冲突域,也属于同一个广播域。图2.17展示了网络中的集线器。
集线器与转发器一样,在它接收到流量并将流量传输到另一部分物理媒介期间,它并不会对流量进行检查。连接到一台集线器或多台集线器的所有设备,若某台设备正在传输数据,其他设备只能侦听。集线器能够创建的拓扑类型是物理星型网络——集线器是位于中心的设备,线缆从各个方向连接集线器。从外观看来,这种设计确实很像星星,但以太网络是运行于总线拓扑的,因此信号必须穿越网络才能从一端到达另一端。
注意
可以使用集线器和转发器来扩大单个LAN网段的覆盖范围,但我并不建议这样做。LAN交换机能够适应大多数情况。