OSI参考模型是计算机网路体系结构发展的产物,它的基本内容是开放系统通信功能的分层结构。
该模型基于国际标准化组织(ISO)的建议作为各种层上使用的协议国际标准化的第一步而发展起来的。
这一模型被称作ISO OSI开放系统互联参考模型(open system interconnection refertence model),因为它是关于如何把开放式系统(即为了与其他系统通信而相互开放的系统)连接起来的,所以我们常简称它为OSI模型。
下图即为OSI模型参考图,共分为7层,以及标有每层常见的协议:
注:该图省略了物理介质,物理介质是位于物理层下面,进行真实的物理传输。
==该层涉及通信在信道上传输的原始比特流==。设计上必须保证一方发出二进制“1”时,另一方收到的也是“1”而不是“0”。
这里的典型问题有如下几个:
这里的设计主要是处理机械的、电气的和过程的接口,以及物理层下的物理传输介质等问题。
该层的主要任务是加强物理层传输原始比特的功能,使之对网络层显现为一条无错线路。
发送方把输入数据分装在数据帧(data frame
)里(典型的帧为几百字节或几千字节),按顺序传送各帧,并处理接收方回送的确认帧(acknowledge-ment frame
)。因为物理层仅仅接收和传送比特流,并不关心它的意义和结构,所以能依赖各链路层来产生和识别帧边界。
可以通过在帧的前面和后面附加上特殊的二进制编码模式来达到这一目的。如果这些二进制编码偶然在数据中出现,则必须采取特殊措施 以避免混淆。
传输线路上突发的噪声干扰可能把帧完全破坏掉。在这种情况下,发送方机器上的数据链路软件必须重传该帧。然而,相同帧的多次重传也可能使接收方收到重复帧,比如接收方给发送方的确认丢失以后,就可能收到重复帧。数据链路层要解决由于帧的破坏、丢失和重复所出现的问题。数据链路层可能向网络层提供几类不同的服务,每一类都有不同的服务质量和价格。
数据链路层要解决的另一个问题(在大多数层上也存在)是防止高速的发送方的数据把低速的接收方“淹没”。==因此需要有某种流量调节机制,使发送方知道当前接收方还有多少缓存空间==。通常流量调节和出错处理同时完成。
如果线路能用于双向传输数据,数据链路软件还必须解决新的麻烦,即从A到B数据帧的确认帧将同从B到A的数据帧一同竞争线路的使用权。借道(piggybacking
)就是一种巧妙的方法。
广播式网络在数据链路层还要处理新的问题,==即如何控制对共享信道的访问。数据链路层的一个特殊的子层 - 介质访问子层,就是专门处理这个问题的。==
该层关系到子网的运行控制,其中一个关键问题是确定分组从源端到目的端如何选择路由。路由既可以选用网络中固定的静态路由表,几乎保持不变,也可以在每一次会话开始时决定(例如通过终端对话决定),还可以根据当前网络的负载状况,高度灵活地为每一个分组决定路由。
如果在子网中同时出现过多的分组,它们将相互阻塞通路,形成瓶颈。此类拥塞控制也属于网络层的范围。
因为拥有子网的人总是希望他们提供的子网服务能得到报酬,所以网络层常常设有记账功能。最低限度,软件必须对每一个顾客究竟发送了多少分组、多少字符或多少比特进行记数,以便于生成账单。当分组跨越国界时,由于双方税率可能不同,记账则更如复杂。
当分组不得不跨越一个网络以到达目的地时,新的问题又会产生。第二个网络的寻址方法可能和第一个网络完全不同;第二个网络可能由于分组太长而无法接收;两个网络使用的协议也可能不同等。网络层必须解决这些问题,以便异种网络能够互联。
在广播网络中,选择路由问题很简单,因此网络层很弱,甚至不存在。
该层的基本功能是从会话层接收数据,并且在必要时把它分成较小的单元,传递给网络层,并确保到达对方的各段信息正确无误,而且,这些任务都必须高效率地完成。从某种意义上讲,==传输层使会话层不受硬件技术变化的影响==。
通常,会话层每请求建立一个传输连接,传输层就为其创建一个独立的网络连接。如果传输连接需要较高的信息吞吐量,传输层也可以为之创建多个网络连接,让数据在这些网络连接上分流,以提高吞吐量。
另一方面,如果创建或维持一个网络连接不合算,传输层可以将几个传输连接复用到一个网络连接上,以降低费用。在任何情况下,都要求传输层能使多路复用对会话层透明。
传输层也要决定最终向会话层、向网络用户提供什么样的服务。最流行的传输连接是一条无错的、按发送顺序传输报文或字节的点到点的信道。但是,还有的传输服务是不能保证传输次序的独立报文传输和多目标报文广播。采用哪种服务是在建立连接时确定的。
==传输层是真正的从源到目标“端到端”的层==。也就是说,源端机上的某程序,利用报文头和控制报文与目标机上的类似程序进行对话。在传输层以下的各层中,协议是每台机器和它直接相邻的机器间的协议,而不是最终的源端机与目标机之间的协议,在它们中间可能还有多个路由器。
很多主机有多道程序在运行,这意味着这些主机有多条连接进出,因此需要有某种方式来区别报文属于哪条连接。识别这些连接的信息可以放人传输层的报文头中。
除了将几个报文流多路复用到一条通道上,传输层还必须解决跨网络连接的建立和拆除。这需要某种命名机制,使机器内的进程可以讲明它希望与谁会话。另外,还需要一种机制以调节通信量,使高速主机不会发生过快地向低速主机传输数据的现象。这样的机制称为流量控制(flow control
),它在传输层(同样在其他层)中扮演着关键角色。主机之间的流量控制和路由器之间的流量控制不同,尽管稍后我们将看到类似的原理对二者都适用。
该层允许不同机器上的用户建立会话(session)关系。会话层允许进行类似传输层的普通数据的传输,并提供了对某些应用有用的增强服务会话,也可被用于远程登录到分时系统或在两台机器间传递文件。
会话层服务之一是管理对话。会话层允许信息同时双向传输,或任一时刻只能单向传输。若属于后者,则类似于单线链路,会话层将记录此时该轮到哪一方了。
一种与会活有关的服务是令牌管理(token management
)。有些协议保证双方不能同时进行同样的操作,这一点很重要。为了管理这些活动,会话层提供了令牌。令牌可以在会活双方之间交换,==只有持有令牌的一方可以执行某种关键操作。==
另一种会话服务是同步(synchronization
)。如果网络平均每小时出现一次大故障,而两台计算机之间要进行长达两小时的文件传输时该怎么办呢?每一次传输中途失败后,都不得不重新传输这个文件。而当网络再次出现故障时,又可能半途而废了。为了解决这个问题,会话层提供了一种方法,即在数据流中插入检查点。每次网络崩溃后,仅需要重传最后一个检查点以后的数据。
该层完成某些特定的功能,由于这些功能常被请求,因此人们希望找到通用的解决办法,而不是让每个用户来实现。值得一提的是,==表示层以下的各层只关心可靠地传输比特流,而表示层关心的是所传输的信息的语法和语义。==
表示层服务的一个典型例子是用一种大家一致同意的标准方法对数据编码。大多数用户程序之间并不是交换随机的比特流,而是诸如人名、日期、货币数量和发票之类的信息。这些对象是用字符串、整型、浮点数的形式,以及由几种简单类型组成的数据结构来表示的。不同的机器有不同的代码来表示字符串(如ASCII和Unicode)、整型(如二进制反码和二进制补码)等。为了让采用不同表示法的计算机之间能进行通信,交换中使用的数据结构可以用抽象的方式来定义,并且使用标准的编码方式。表示层管理这些抽象数据结构,并且在计算机内部表示法和网络的标准表示法之间进行转换。
该层包含大量人们普遍需要的协议。例如,世界上有成百种不兼容的终端型号。如果希望一个全屏幕编辑程序能工作在网络中许多不同的终端类型上,每个终端都有不同的屏幕格式、插入和删除文本的换码序列、光标移动等,其困难可想而知。
解决这一问题的方法之一是定义一个抽象的网络虚拟终端(network virtual terminal
),编辑程序和其他所有程序都面向该虚拟终端。而对每一种终端类型,都写一段软件来把网络虚拟终端映射到实际的终端。
例如,当把虚拟终端的光标移到屏幕左上角时,该软件必须发出适当的命令使真正终端的光标移动到同一位置。所有虚拟终端软件都位于应用层。
另一个应用层功能是文件传输。不同的文件系统有不同的文件命名原则,文本行有不同的表示方式等。不同的系统之间传输文件所需处理的各种不兼容问题,也同样属于应用层的工作。此外还有电子邮件、远程作业输入、名录查询和其他各种通用和专用的功能。