3.3.4 协议
协议是指为了完成给定任务,进程间通信所要用到的一组众所周知的规则和格式。协议的定义包括两个重要的部分:
- 必须交换的消息的顺序的规约。
- 消息中数据格式的规约。
众所周知的协议的存在使得分布式系统的软件组件能独立地开发,能在代码次序不一样、数据表达不一样的计算机上用不同的程序语言实现。
一个协议是由分别位于发送方计算机和接收方计算机上的一对软件模块实现的。例如,一个传输协议将任意长度的消息从一个发送进程传递给一个接收进程。想向另一个进程传输消息的进程给传输协议模块发出一个调用,并按指定的格式传递消息。接着传输软件负责将消息传递到目的地,它将消息分割成指定大小的数据包和格式,利用网络协议(另一个低层的协议)将消息传输到目的地。接收方计算机中相应的传输协议模块通过网络级协议模块接收这些数据包,并在传递给接收进程之前,进行逆向转换,重新生成消息。
协议层 网络软件是按层的层次结构排列的。每一层都为上面的层提供了相应的接口,并扩展了下层通信系统的性质。层由与网络相连的每一个计算机上的一个模块表示。图3-2说明了这个结构和通过分层协议传递消息时的数据流。每一个模块看起来都是和网络中另一个计算机上相同层次的模块直接通信,但事实上数据并没有在两个同层次的协议模块之间直接传输。网络软件的每一层都只通过本地过程调用与它的上一层和下一层通信。
在发送方,每一层(除了最顶层,即应用层以外)从上一层按照指定的格式接收数据项,并在将其传送到下一层进行进一步处理之前,进行数据转换,按下一层的格式封装数据。图3-3说明了这一过程,在图中,该过程被应用于OSI协议组的前四层。从图中可以看出,数据包的头部包含大部分与网络相关的数据项,但为了简洁起见,它省略了在一些数据包类型中出现的附加部分;同时该图也假设应用层要传递的应用层消息的长度小于底层网络数据包的最大长度。否则,消息就要被封装成几个网络层的数据包。在接收方,下层接收到的数据项要进行一次相反的转换,再传递到上一层。上层协议的类型已经包括在了每层的头部,这使得接收方的协议栈能选择正确的软件组件来拆分数据包。
这样,每一层为上一层提供服务,并扩展下一层提供的服务。最下面的是物理层。它是由通信介质(铜线、光缆、卫星通信信道或无线电传输)和在发送结点将信号放置在通信介质上,在接收结点感应该信号的模拟信号电路实现的。在接收结点,接收到的数据项通过软件模块的层次结构向上传送,在每一层都重新转换直到变成可传递给接收进程的格式为止。
协议组 一套完整的协议层被称为协议组或者协议栈,这也反映了分层结构。图3-4显示了与国际标准组织(ISO)采用的开放系统互连(Open System Interconnection,OSI)的7层参考模型[ISO 1992]相一致的协议栈。采用OSI参考模型,是为了促进满足开放系统需求的协议标准的开发。
图3-5总结了OSI参考模型的每一层的目标。顾名思义,这只是一个用于协议定义的框架,而不是特定协议组的定义。与OSI模型一致的协议组必须在模型定义的7层的每一层包括至少一个特定的协议。
协议分层给简化和概括访问网络通信服务的软件接口带来了实质性的好处,同时也带来了极大的性能开销。通过N层协议栈传输一个应用级的消息,通常在协议组中要进行N次控制传输,才能到达相关的软件层,其中至少有一个是操作系统的入口,数据的N份拷贝也作为了封装机制的一部分。所有这些开销导致应用进程间的数据传输率远低于可用的网络带宽。
图3-5包括了在互联网中使用的协议的例子,但互联网的实现在两方面没有遵循OSI模型。第一,在互联网协议栈中,并没有清楚地区分应用层、表示层、会话层。应用层和表示层或实现成单独的中间件层或在每个应用内部单独实现。这样,CORBA就可以在每个应用进程包括的中间件库中实现对象间调用和数据表示(CORBA的进一步讨论见第8章)。Web浏览器和其他的一些需要安全信道的应用也采用了类似过程库方式使用的安全套接字层(见第11章)。
第二,会话层与传输层集成在一起。互连网络协议组包括应用层、传输层和互连网络层。互连网络层是一个“虚拟的”网络层,负责将互连网络的数据包传输到目的计算机。94互连网络数据包是在互连网络上传递的数据单元。
图3-6 互连网络层互连网络协议覆盖在底层的网络上,参见图3-6。网络接口层接收互连网络数据包,并将其转换成适合每个底层网络的网络层传输的数据包。
数据包组装 在传输前将消息分割成多个数据包并在接收端重新组装各个数据包的任务通常是由传输层完成。
网络层协议的数据包包括头部和数据域。在大部分网络技术中,数据域是长度可变的,其最大长度称为最大传输单元(Maximum Transfer Unit,MTU)。如果消息的长度超过底层网络层的MTU,就将其分割为多个大小适当的块,并标上序列号以便其重新装配,再用多个数据包进行传输。例如,以太网的MTU是1500字节,如果消息不超过这个数据量,就能在一个以太网数据包中进行传输。
尽管在互联网协议组中,IP协议处于网络层协议的位置,但它的MTU却很大,有64KB(实际通常使用8KB,因为一些结点无法处理这么大的数据包)。无论IP数据包采用哪一个MTU值,比以太网MTU值大的数据包必须经过分割才能在以太网上传输。
端口 传输层的任务是在一对网络端口间提供与网络无关的消息传送服务。端口是主机中可由软件定义的目的点。它隶属于进程,使得数据能传输到位于目的结点的指定进程。这里我们将详细讲述端口在互联网和大部分其他网络中实现的端口寻址过程。第4章将讨论端口的编程。
寻址 传输层负责将消息传递到目的地址,其使用的传输地址由主机的网络地址和一个端口号组成。网络地址是能唯一标识主机的一个数字标识符,可以让负责将数据路由到该主机的结点准确地定位它。在互联网中,为每台主机都分配了一个IP地址,用于标识该主机和它连入的子网,使得从其他结点都能路由到该主机(下一节将介绍这一内容)。以太网中没有路由结点,由每台主机负责辨识数据包的地址,并接收发给自己的数据包。
众所周知的互联网服务(如HTTP或FTP)已经被分配了关联的端口号。它们都在权威机构(即互联网编号管理局,简称IANA)进行了登记[www.iana.org]。要访问指定主机上的某个服务,只要将请求发给该主机上相关的端口就可以了。有些服务,如FTP(关联端口为21),会被分配一个新的端口号(私有号码),并将新的端口号发送到客户端。客户端使用新的端口号完成交易或会话的剩余部分。其他服务,如HTTP(关联端口为80),通过关联端口处理所有的业务活动。
编号小于1023的端口被定义为公共端口。在大多数操作系统中,它们的使用被限制在特权进程中。1024~49151之间的端口是IANA拥有的服务描述的已注册端口,其他直到65535的端口可用于个人目的。实际上,大于1023的所有端口都可用于个人目的,只是为个人目的而使用这些端口的计算机不能同时访问相应的已注册服务。
在开发经常包括许多动态分配的服务器的分布式系统中,分配固定端口号并不恰当。这个问题的解决方案涉及为服务动态分配端口以及提供绑定机制,使得客户能用符号化名字定位服务和相应的端口。这些将在第5章做进一步讨论。
数据包传递 网络层采用两种方法传递数据包。
数据报包传递:术语“数据报”指出了这种传输模式与信件、电报的传输模式的相似性。数据报网络的本质特征是每个包的传递都是一个“一次性”的过程;不需要计划,一旦包被传递,网络就不再保存它的相关信息。在数据报网络中,从一个源地址到一个目的地址的数据包序列可以按照不同的路由来传递(这样,网络就有能力处理故障,或缓解局部拥塞带来的影响),在这种情况下,数据包序列可能不按照原来的顺序到达。
每个数据报包都包括完整的源主机和目的地主机的网络地址,后者是路由过程的基本参数,我们将在下一节加以讨论。数据报传递是数据包网络最初所基于的概念,可以在目前使用的大多数计算机网络中找到它。互联网的网络层(IP)、以太网以及大部分有线或无线的局域网技术都是基于数据报传递的。
虚电路包传递:一些网络级的服务利用类似于电话网络中传递的方式实现包传输。必须在经源主机A到目的主机B传递包之前建立虚电路。要建立虚电路,涉及确定从源地址到目的地址的路由,这可能会经过一些中间结点。在路由中的每个结点上都会有一个表格项,指示路由下一步该使用哪一个链接。
一旦建立起虚电路,就可以用它传输任意数量的数据包了。每个网络层的数据包只包括一个虚电路号,而不是源地址和目的地址。此时已不需要地址信息,因为在中间结点,通过引用虚电路号来路由数据包。数据包到达目的地址后,根据虚电路号就可以决定其源地址。
虚电路与电话网络的类比不能这样从表面上看。在POTS中,进行一次电话呼叫就要建立从主叫者到被叫者的物理电路,而这一音频链接也将作为专用连接而被保留。在虚电路的包传递中,电路只是由一些在路由结点上的表格项来表示,而数据包所路经的链接也只在传递一个数据包时使用,在其余时间这些链接是空闲的,可供它用。97因此,一个链接可以被多个独立的虚电路使用。目前使用的最重要的虚电路网络技术是ATM。我们已经提到过(见3.3.3节),它传送单个数据包的延迟较短,这是使用虚电路的直接结果。但无论怎么说,数据包传送到一个新目的地址前要求有一个准备阶段,这确实造成了短时间的延迟。
不要将网络层的数据报传递和虚电路包传递之间的区别与传输层中名字相似的一对机制(即无连接传输和面向连接传输)相混淆。我们将在3.4.6节有关互联网传输协议——UDP(无连接的)和TCP(面向连接的)的内容中描述这些技术。这里我们只是让大家注意,在任何一种类型的网络层上都可以实现这些传输模式。