unix网络的服务器程序设计方法_第1页
unix网络的服务器程序设计方法_第2页
unix网络的服务器程序设计方法_第3页
unix网络的服务器程序设计方法_第4页
unix网络的服务器程序设计方法_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UNIX网络的服务器程序设计方法(刘凯 刘春旭,四川大学计算机学院)摘要:介绍了几种网络操作模式和UNIX下基于TCP/IP协议的网络客户/服务器模式的程序架构。重点对客户/服务器模式中服务器程序的几种设计方法进行了讨论。关键词:客户/服务器,Socket,进程,并发服务器1引言11几种网络模式的介绍对等网络(PeertoPeer)模式不需要专用服务器,每一台工作站都能充当网络服务的请求者和提供者,都有绝对自主权,也可以互相交换文件。这种类型的网络软件被设计成每一个实体都能完成相同或相似的功能。服务器(ServerBased)模式以服务器为中心,严格地定义了每一个实体的工作角色,即网络上的工作站无法在彼此间直接进行文件传输,需通过服务器作为媒介,所有的文件读取,消息传送等也都在服务器的掌握之中。客户/服务器(Client/Server)模式(有时也称为主从式Master/Slave)指将需要处理的工作分配给客户端和服务器端处理,所谓的客户和服务器并没有一定的界限,这取决于运行什么软件,简单的讲,客户是提出服务请求的一方,而服务器是提供服务的一方。在客户/服务器模式中服务器端所提供的功能不仅仅是文件、数据库等服务,还应当有相应的计算、通信等能力也就是说在工作时由客户端和服务器端各自负担一部分计算或通信的功能。客户/服务器模式已经成为计算机网络互连中最重要的应用技术之一,它把一个大型的计算机应用系统变为多个能互为独立的子系统,而服务器便是整个应用系统资源的存储与管理中心,多台客户机则各自处理相应的功能,共同实现完整的应用。浏览器/服务器(Browser/Server)模式从本质上将,仍然是客户/服务器模式(是客户/服务器模式的特例)。只不过在某些应用方面,如数据库服务,它将传统的二层客户/服务器结构发展成三层的客户/服务器结构并在Internet上应用而已。在上述几种模式中,客户/服务器模式具有灵活多变的体系结构、丰富的开发环境和强大的设备驱动能力。12本文所采用的网络应用程序编程接口网络程序之间进行通讯,必须建立在一定的通讯协议基础之上。对于UNIX下的应用程序,可用的协议有TCP/IP的传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram Protocol),XNS(Xerox Network System)的定序分组协议SPP(Sequential Pocket Protocol)和网际数据报协议IDP(Internetwork Datagram Protocol)以及ARPANET的接口报文处理机链路IMPLINK(Interface Message Processor Link)等。因为Internet的普及,使得TCP/IP成为使用最广泛的协议。UNIX下基于TCP/IP协议的网络应用程序编程接口API(Application Programming Interface)有两种:源自BSD UNIX的Socket API和AT&T的传输层接口TLI(Transport Layer Interface)的超集X/Open传输接口XTI(X/Open Transport Interface)。这两种API都是面向客户/服务器模式的。由于Socket API已经成为事实上的标准,因此本文在介绍服务器端程序的设计方法时也采用Socket API。2客户/服务器模式的Socket实现框架21 TCP/IP Socket的基本原理。TCP/IP对外提供的只是编程接口而非用户服务,真正的用户服务还得靠编写相应的服务程序来实现。TCP/IP的Socket API编程接口构成了使用协议的网络应用程序视图。服务程序客户程序Socket APITCP/IP协议物理介质图1网络应用程序、Socket API和TCP/IP的关系Socket API在BSD UNIX中首次提出,其目的是为了解决网络间程序通讯的问题。就其原理而言,面向连接的Socket类似于电话系统,无连接的Socket类似于电报系统。Socket实质上是为网络程序提供了通讯的端点号。对于每个网络程序的一个Socket,它首先有一个半相关的端点号的描述:协议,本地地址,本地端口,如果它是与另一个Socket连接了的,则有一个相关的端点描述:协议,本地地址,本地端口,远程地址,远程端口。每个Socket有一个本地唯一的由操作系统分配的编号。22 Socket 的系统调用Socket是面向客户/服务器模式设计的,它针对客户和服务器程序提供了不同的系统调用。同时它还分为面向连接和无连接两种类型。下表列出了Socket API的基本函数(这里就不对调用参数进行说明了)。 表1 基本的Socket系统调用函数名用途使用者相关协议说明socket建立一个通讯端点客户、服务器TCP、UDPbind为一个连接的本地socket赋名客户、服务器TCP、UDP使用TCP时,使用者为服务器;使用UDP时,使用者为客户listen监听socket上的连接服务器TCPaccept接受socket上的连接服务器TCPconnect对socket进行连接初始化客户TCPread从socket接收信息客户、服务器TCPwrite向socket发送信息客户、服务器TCPrecvfrom从socket接收信息客户、服务器UDPsendto向socket发送信息客户、服务器UDPclose关闭socket客户、服务器TCP、UDP23面向连接和无连接的客户/服务器模式的程序流程框架图服务器socket ( )服务响应服务请求建立连接处理服务请求bind ( )listen ( )accept ( )阻塞并等待客户的连接请求read ( )write ( )客户socket ( )connect ( )write ( )read ( )图2 面向连接的客户/服务器模式服务器服务响应服务请求bind()recvfrom()阻塞并等待客户数据处理服务请求sendto()socket()客户recvfrom()sendto()bind()socket()图3 无连接的客户/服务器模式3服务器程序的设计方法31总述客户程序一般比较简单,而服务器程序就比较复杂了,因为对服务器程序的设计,必须考虑到其响应速度和响应能力等服务性能因数。本文主要讨论的是面向连接的服务器程序设计方法。总体上服务器程序可分为两类:并发服务器(Concurrent Server)和串行服务器(Iterative Server)。前者主要针对实时性的客户/服务器模式,后者主要针对服务量小的客户/服务器模式。32 TCP串行服务器程序串行服务器程序是这样的:每次它只能为一个连接过来的客户程序提供服务,只有在完全处理了一个客户的请求后,才能响应下一个客户的请求,即按照FIFO的原则响应请求。一般很少使用串行服务器程序,不过诸如时间/日期等服务量小的且实时性要求不高的服务器程序可以使用该方式。从进程控制的角度来讲,该方式的速度是最快的,因为它不进行进程控制,系统开销小。33 传统的TCP进程并发服务器程序在这种方式下,并发服务器程序在收到客户程序请求后,派生出一个子进程来为该客户程序服务,自己则回到等待状态,准备接收下一个客户程序的请求,子进程在服务完成后退出。其中,作为父进程的并发服务器程序成为主服务器(master),具体处理客户请求的子进程成为从服务器(slave)。响应子进程接管连接客户程序slave服务请求父进程返回生成子进程fork()连接connect()处理请求master接受客户请求accecp()图4 传统的TCP进程并发服务器程序框架并发服务器的问题在于派生子进程(fork()操作)时会消耗CPU的很多时间,这对需要响应数目众多的客户进程的服务器进程所在的系统是极为不利的,例如对于Web服务器就是这样。34 TCP预先派生子进程并发服务器程序在传统的TCP进程并发服务器程序的基础上,可以对响应方式进行一些改造。传统的TCP进程并发服务器程序的响应方式是即响应即派生子进程。现在将这种方式改变为:服务器程序启动后就先生成若干子进程以备响应,这些子进程构成服务子进程组,而父进程则成了监控进程。fork可用子进程组父进程子进程1子进程2子进程3客户2客户1子进程N图5 TCP预先派生子进程这里需要解决的问题是:怎样保持一定量的可用子进程;服务请求到达时,唤醒子进程的机制应该怎样以及父进程怎样将必要的信息传递给子进程。父进程监视可用子进程的数量,当数量低于某个阈值时就再派生一些子进程,当数量高于某个阈值时就终止一些可用子进程。当然,总的子进程数量也应当有个上限值,以防止系统资源消耗完。这样就使得可用子进程数及总的子进程数保持在一定范围之内了。预先生成得子进程在各自调用accept()后进入睡眠状态。由于这些子进程共用一个socket结构,当一个可户请求到达时,就会造成惊群(thundering herd)唤醒所有的子进程。当然,只有最先被调度的子进程才会获得客户的连接,其他的子进程会再次进入睡眠状态。这种情况会导致系统性能的下降。解决这个问题的方法是给accept上锁,即保证accept操作的原子性。有些UNIX系统在内核已经解决了这一问题,就无须再给accept上锁了。如果子进程只是父进程的副本,基本上就不用额外考虑进程通讯的问题了。如果将父进程改造成类似于inetd的守护进程(启动后先调用fork()生成子进程,再通过exec系统调用执行服务处理程序),就必须解决父进程同子进程之间的通讯问题。UNIX下进程通讯的机制有多种,如管道(pipe),具名管道(named pipe),IPC消息(InterProcess Communication Message)等。这里我们使用IPC消息队列来向子进程传递socket描述字。消息队列客户1客户2父进程子进程1子进程2子进程3可用子进程组子进程N图6 使用IPC消息机制的TCP预先派生子进程方法35 TCP线程并发服务器程序线程的执行效率比进程高10到100倍。编写线程函数时必须注意函数的线程安全性。并非所有的UNIX系统或同种UNIX的不同版本都支持线程。由于在方法上线程服务器程序同进程服务器程序的设计差不多,这里就不作多的描述了。4结束语编程人员在编写具体的服务器程序时,应当结合具体的应用、网络结构和网络性能等情况,尽可能地提高服务效率和网络安全性。参考文献1网络操作系统的分类leas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论