资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,互联网络程序设计,电子科大计算机学院,*,单击此处编辑母版标题样式,互联网络程序设计,第七讲 服务器软件设计的算法和问题,电子科技大学计算机学院,服务器软件设计概述,无连接和面向连接的服务器访问,无状态和有状态的服务器应用,循环和并发的服务器的实现,简单服务器的算法:,创建套接字,绑定到一个熟知端口,期望在这个端口上接收请求,进入无限循环,接受客户请求并应答,只适用于最简单的服务,互联网络程序设计,电子科大计算机学院,并发服务器和循环服务器,循环服务器:一个时刻只处理一个请求,并发服务器:一个时刻可以处理多请求,多数只提供表面并发:执行多个线程,每个线程处理一个请求,使用单线程的可能性:计算量小,主要是异步I/O,便于同时使用多个通信信道,并发处理多个请求,而不是指下层是否使用了多个并发线程,循环服务器容易构建,但是性能差;并发服务器难以构建和设计,但是性能好,互联网络程序设计,电子科大计算机学院,面向连接和无连接的访问,连接性问题是传输协议的中心,TCP/IP提供了两种协议:TCP,UDP,使用TCP的服务器是面向连接的服务器,使用UDP的服务器是无连接的服务器,选择面向连接或者无连接的服务,依赖于应用协议,设计上使用面向连接的传输服务的应用协议时,如果实际中使用了无连接的传输协议时,将可能不能正确地运行或者不能有效运行。,互联网络程序设计,电子科大计算机学院,传输协议的语义,TCP的语义,点到点通信,建立可靠连接,可靠交付,具有流控的传输,双工传输,流模式,UDP,的语义,多对多通信,不可靠服务,缺乏流控制,报文模式,选择传输协议,需要考虑应用程序要求的语义,互联网络程序设计,电子科大计算机学院,面向连接的服务器,面向连接的服务的优点:,易于编程,自动处理分组丢失,分组失序,自动验证数据差错,处理连接状态,面向连接的服务的缺点:,对每个连接都有一个单独的套接字,耗费更多的资源,在空闲的连接上不发送任何分组,始终运行的服务器会因为客户的崩溃,导致无用套接字的过多而耗尽资源,互联网络程序设计,电子科大计算机学院,无连接的服务器,优点:没有资源耗尽问题,缺陷:需要自己完成可靠通信问题,必要时,需要一种自适应重传的复杂技术,需要程序员具有相当的专业知识,对于可靠通信的场合,尽量使用tcp,是否需要组播或者广播是考虑选择何种传输方式的一个因素,支持组播或者广播的服务器必须是无连接的,今后会不断增加这样的应用。,互联网络程序设计,电子科大计算机学院,故障、可靠性和无状态,状态信息:服务器维护的,关于它和客户正进行的交互状态信息,无状态服务器:没有保留任何状态信息,状态服务器:维护状态信息的服务器,无状态源于对确保可靠性的要求:无连接传输不可靠,传输协议不能保证可靠,应用协议的设计必须保证可靠,实现服务器如果有状态依赖,必须慎重,互联网络程序设计,电子科大计算机学院,优化无状态服务器,一个无连接服务器,允许客户从服务器机器磁盘上读出文件,要保持无状态,每个客户请求都必须指定文件名,文件中的位置,读取的字节数,设计服务器的时候,我们注意到:,文件打开和关闭的额外开销较高,使用该服务器的客户请求可能只读十来字节,客户通常按顺序读取文件数据,服务器从内存缓冲区读取数据比磁盘快得多,优化服务器性能维护一个小的文件信息表,互联网络程序设计,电子科大计算机学院,优化无状态服务器,使用IP地址和端口号索引,将没有发现的读取数据从磁盘读到内存,文件名:X,偏移量:512,缓存指针:,文件名:Y,偏移量:1024,缓存指针:,用于文件X的缓存从,512字节开始,用于文件Y的缓存从,1024字节开始,hash(IP addr,port),有关客户使用的文件的信息表,互联网络程序设计,电子科大计算机学院,优化无状态服务器,上述的信息表格可以改善服务器性能,需要程序员极其小心:检查文件名等,如果客户出了故障重新启动,将会重新获得一个不同的端口号,先前的表项将会失去作用,最终会耗尽服务器资源,服务器可以选择删除LRU(最近最少使用)条目。但是如果客户经常崩溃,可能让服务器删除一个合法的客户条目,优化无状态服务器的时候,程序员必须小心,如果客户经常崩溃或者重启,或者网络使报文重复或者迟延,管理少量状态信息也会消耗资源,互联网络程序设计,电子科大计算机学院,四种基本类型的服务器,循环的或者并发的,使用面向连接的或者无连接的传输,循环的,无连接,循环的,面向连接,并发的,无连接,并发的,面向连接,互联网络程序设计,电子科大计算机学院,请求处理时间,循环服务器是最简单的,客户按照顺序等待。是否能够满足要求取决于所需的反应时间,观测响应时间:客户发送请求到服务器响应之间的全部时延。,请求处理时间:服务器处理单个孤立的请求所花费的时间。,循环服务器一次处理一个请求。如果N代表请求队列的平均长度,观测响应时间大约是N/2+1个服务请求处理时间,如果一个服务器设计处理K个客户,每个客户每秒发送R个请求,服务器请求处理时间必须小于每请求1/KR秒。否则请求队列将溢出。这时设计者必须考虑并发实现,互联网络程序设计,电子科大计算机学院,循环的面向连接的服务器算法,通过TCP的面向连接的循环服务器算法,1、创建套接字并将其绑定到它所提供服务的熟知端口上;,2、将该端口设置为被动模式,使其准备为服务器所用;,3、从该套接字上接收下一个连接请求,获得该连接的新的套接字;,4、重复地读取来自客户的请求,构造响应,按照应用协议向客户发回响应;,5、当某个特定客户完成交互时,关闭连接,并返回步骤3以接受新的连接。,互联网络程序设计,电子科大计算机学院,用INADDR_ANY绑定熟知端口,服务器需要创建套接字并将其绑定到所熟知的端口上,getportbyname:服务名映射到熟知端口上,bind为某个套接字指明某个端点,使用结构sockaddr_in,该结构含有IP地址和端口号,对于多接口主机使用INADDR_ANY指明了一个通配地址,让该主机的任何一个IP地址都匹配。,互联网络程序设计,电子科大计算机学院,将套接字置于被动模式,调用listen:将套接字置于被动模式,一个参数指明套接字内部的请求队列长度,请求队列保存一组TCP传入连接请求,来自客户,都向这个服务器请求一个连接,接收连接并使用这些连接,调用accept:获得下一个传入连接请求,返回新的连接的套接字的描述符,服务器接受连接,使用read获得来自客户的应用协议请求,使用write发回应答。,服务器结束连接,使用close释放套接字,互联网络程序设计,电子科大计算机学院,无连接循环服务器的算法,循环服务器的设计,编程,排错,修改很容易。往往使用无连接的协议。,循环服务器对于小的处理时间的服务工作很好。,无连接服务器算法如下:,1、创建套接字并将其绑定到所提供服务的熟知端口上;,2、重复读取来自客户的请求,构造响应,按照应用协议向客户发回响应。,互联网络程序设计,电子科大计算机学院,无连接的服务器中构造应答,connect函数限制了套接字的使用,无连接服务器使用sendto:指明了发送的数据报和它将去的地址,retcode=sendto(s,msg,len,flags,toaddr,toaddrlen);,服务器从收到的请求中的源地址获得应答的地址。调用recvfrom得到数据和对方的地址,retcode=recvfrom(s,buf,len,flags,from,fromlen);,互联网络程序设计,电子科大计算机学院,并发服务器的算法,给多个客户提供快速响应时间需要使用并发服务器,构造要求有相当的I/O时间的响应,可以部分重叠地使用处理器和外设,各个请求所要求的处理时间变化很大,时间分片允许单个处理器处理那些只要求少量处理的请求尽快完成,服务器运行在具有多个处理器的计算机上,不同的处理器处理不同的请求,并发服务器通过使处理和I/O部分重叠来达到高性能。,互联网络程序设计,电子科大计算机学院,主线程和从线程,尽管可以使用一个单线程实现并发服务器,但是大多数使用多线程:,主线程最先开始执行在熟知的端口上打开一个套接字,等待一个请求,并为每个请求创建一个从线程(可能在一个新进程中),主线程不与客户直接通信,每个从线程处理一个客户的通信。,从线程构成响应并发送给客户后,这个从线程便退出,互联网络程序设计,电子科大计算机学院,并发的无连接的服务器的算法,最简单的算法:,主1、创建套接字并将其绑定到所提供服务的熟知地址上。让该套接字保持为未连接的,主2、反复调用recvfrom接收来自客户的下一个请求,创建一个新的从线程来处理响应,从1、从来自主进程的特定请求以及到该套接字的访问开始,从2、根据应用协议构造应答,并用sendto将该应答发回给客户,从3、退出(即:从线程处理完一个请求后就终止),由于创建进程或者线程是昂贵的,因此只有很少的无连接服务器采用并发实现,互联网络程序设计,电子科大计算机学院,并发的面向连接服务器算法,面向连接的服务器在多个连接之间实现并发(不是在各个请求之间),主1、创建套接字并将其绑定到所提供服务的熟知地址上。让该套接字保持为面向连接,主2、将该端口设置为被动模式,主3、反复调用accept以便接收来自客户的下一个连接请求,并创建新的从线程或者进程来处理响应,从1、由主线程传递来的连接请求开始,从2、用该连接与客户进行交互;读取请求并发回响应,从3、关闭连接并退出,互联网络程序设计,电子科大计算机学院,服务器并发性的实现,两种形式的并发性:进程和线程,服务器创建多个进程,每个进程都有一个执行线程,服务器在一个进程中创建多个执行线程,将在11章和12章说明,主进程,从进程,主线程,从线程,互联网络程序设计,电子科大计算机学院,把单独的程序作为从进程使用,并发服务器为每个连接创建一个新从线程,对于单线程的进程实现,采用fork实现,程序中包含主进程和从进程的全部代码,从进程执行一个单独编写和编译的程序也许更加方便,linux系统支持,调用fork后再调用execve,互联网络程序设计,电子科大计算机学院,使用单线程获得表面上的并发性,使用单个线程来处理客户的请求的意义,操作系统创建线程或者进程的开销太昂贵,许多应用要求服务器在多个连接中共享信息,X窗口系统使用显示缓存作为共享数据结构,给各个窗口的显示提供表面并发,出现在服务器的请求没有超过服务器的处理能力,单线程的服务器使用select系统调用进行异步I/O,互联网络程序设计,电子科大计算机学院,单线程服务器处理多连接的算法,1、创建套接字并将其绑定到这个服务的熟知端口上,将该套接字加到一个表中,该表中的项是可以进行I/O的描述符。,2、使用select在已经有的套接字上等待I/O,3、如果最初的套接字准备就绪,使用accept获得下一个连接,并将这个新的套接字加入到表中,该表中的项是可以进行I/O的描述符。,4、如果最初的套接字以外的套接字就绪,就使用recv或read获得下一个请求,构造响应,用send或者write将响应发回给客户,5、继续按照以上的步骤2进行处理,互联网络程序设计,电子科大计算机学院,各个服务器适用的场合,循环的和并发的:,如果循环方案产生的响应时间对应用来说足够,就可以使用循环;否则需要并发,真正的和表面上的并发性:,创建线程或切换环境的开销大,服务器需要在多个连接之间共享或者交换数据,用单线程;,使用线程开销不大或者要得到最大并发性,使用多进程,面向连接的和无连接的:,应用协议处理了可靠性问题,或者应用在局域网环境内,使用无连接的传输。,互联网络程序设计,电子科大计算机学院,服务器类型小结,循环无连接服务器,请求要求处理少,无状态的,最常见的,循环的面向连接服务器,要求可靠传输的,对请求要求处理少的服务,较常见,并发的,无连接的服务器,不常见,为每个请求创建一个新线程或进程,并发的面向连接的服务器,最一般的。可靠传输,并发处理多个请求,多进程可以是多个独立的程序,多线
展开阅读全文