已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一个实用的http代理程序设计与实现摘要:本文介绍了http代理服务器基本工作原理、代理服务器的总体设计框架和其中采用的用以提高性能的关健技术、进程池技术和缓存机制以及核心模块的具体实现流程,最后提出了一种实用的http代理服务器的设计方案。关键词:代理服务器; 进程池; 缓存机制abstract:the design and implementation of http proxy server with high performance are described. first, the basic mechanism of http proxy server is introduced and then, the whole framework of proxy server and the key techniques process pool and cache technique are presented which are adopted to improve performance. finally, the implementations of core modules are given.key words: proxy server; process pool; cache mechanism目录第一章 前言2第二章 http原理与代理模型的设计32.1 http协议32.2 http代理模型42.3 模型的实现42.4 优化的代理技术72.4.1 身份认证72.4.2 cache技术8第三章 总体设计103.1框架结构103.2关键技术113.2.1进程池管理113.2.2缓存管理12第四章 核心模块的实现144.1主守护进程的实现144.2代理服务模块的实现154.3缓存管理进程的实现17结语18参考文献:18第一章 前言随着internet与intranet的飞速发展,作为连接internet与intranet的的桥梁,代理服务器在实际应用中发挥着极其重要的作用。代理服务器(proxy)是网络信息的中转站。一般情况下,使用网络浏览器直接去链接其它internet站点并取得网络信息时,须送出请求信写来得到应答,然后对方再把信息传送回来。代理服务器是介于浏览器和web服务器之间的一台服务器,有了它之后,浏览器不是直接到web服务器去取回网页而是向代理服务器发出请求,请求信写会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且,大部分代理服务器都具有缓冲的功能,就好像一个大的cache,它不断将新取得数据包存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上己经存在而且是最新的,那么它就不重新从web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。代理服务器不仅可以实现提高浏览速度和效率的功能,它还可以实现网络的安全过滤、流量控制(减少internet使用费用)、用户管理等功能,因此它既是一种网络防火墙技术,同时也可以解决许多单位连接internet引起ip地址不足的问题。将代理服务器的这些功能应用在多媒体教室中,可以方便地实现教师机对学生机的管理,下面就介绍一下该代理模型的设计与实现。第二章 http原理与代理模型的设计2.1 http协议http是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。当客户端请求一个web页面时,它首先与服务器建立连接,连接成功后,它要将所请求的页面,所用的协议及版木,语言及版木,所能接受的mime类型,编码类型以及连接状况等一些本地信息参数等交给服务器,web服务器收到请求后,发回所交送页面的的信息的响应头信息,然后再发送页面内容信息,最后,双方断开连接。http的早期版木为http/0.9,1982年,tim berners-lee提出了http/1.0, 1997年形成http/ 1.1,也就是现在普遍使用的协议。http/ 1.1在持续连接操作机制中实现流水方式,即客户端需要对同一服务器发出多个请求时,其请求的多数的web页面都是由多部分组成(比如多张图片,声音),可用流水线方式加快速度。流水机制就是指在客户机请求到web页面时,搜索其中的图像链接和声音链接,然后再请求这些页面,即连续发出多个请求并等到这些请求发送完毕,再等待响应。这样就大大节省了单独请求对响应的等待时间,使人们得到更快速的浏览。而且http-ng (next generation of http)的建议己经提出。2.2 http代理模型根据http协议规定,当客户端使用代理模式时,发送的请求命令格式如下: method http: /hostname/path/filename 例如:get http: /.cm/。当客户端同网络代理服务系统建立连接后,代理服务器将收到请求命令,这时代理服务器应该截取主机名部分进行域名解析,并同该主机建立连接,将去掉主机名部分的请求命令转发给它,等待它做出响应,然后将得到的响应转发给客户端,最后断开连接。其模型如图2-1所示。图2-1 带有cache数据库的http协议代理模型 注:客户连接代理服务器,并发出客户请求: 在本地 cache中无此资源时,连接到internet; 从internet上获得所请求的资源: 将客户所请求的资源发送给客户: *代理服务系统检索 cache 数据库: *如果客户请求的资源在数据库中,这直接将请求的资源发给代理服务器:2.3 模型的实现 由于http代理是典型的c/s模式,所以至少需要两个socket(套接字)来实现客户与web服务器的连接。结合在多媒体教室巾的应用,具体过程如下: (1)代理服务器监听客户端的连接请求; (2)客户端连接到代理服务器,发送请求信息; (3)代理服务器解析客户端的发送过来的数据,确定服务类型(http),服务器地址和端口号,确定是否是合法的ip和url,确定是否在木地cache库巾,是,则重定向,不是,则执行(4); (4)代理服务器连接远程web服务器; (5)循环启动线程server,该线程负责客户端,代理服务器和远程web服务器之间数据的交互,交互完毕结束线程; (6)关闭server field socket(服务器端套接字),断开代理与web服务器的连接; (7)关闭client_ field socket(客户端套接字),断开客户端与代理服务器的连接;其实现系统流程图如2所示。图2-2 http代理服务器系统实现流程图在系统设计中,为客户端和服务器各建一个socket套接字client_ field和server_ field以来实现客户和web服务器的连接。由于在该代理系统操作中是要求用户主机和远端主机双向通信的,这样就要求对两个套接字描述符既能够读也能够写。如果采用的是阻塞i/0的话,很有可能长时间阻塞在一个描述符上。因此设计时在处理这个问题的时候调用了select()函数,这个函数允许执行i/o多路转接。其具体含义就是select()函数可以构造一个表,在这个表中包含了所有要用到的文件描述符。然后可以调用一个函数,这个函数可以检测这些文件描述符的状态,当某个指定的)文件描述符准各好进行i/o操作时,此函数就返回,告知进程哪个文件描述符己经可以执行i/o操作了。这样就避免了长时间的阻塞。 在调用select()函数实现多路i/o转接时,首先要声明一个新的文件描述符集: fd - set rdfdset; 然后调用fd- zero ()清空此文件描述符集的所有位,以免下面检测描述符位的时候返回错误结果: fd_ zero ( &rdfdset); 然后调用fd_ set( )在文件描述符集中设置所关心的位。在该系统中,关心的就是分别与用户主机和远端主机连接的两个套接字描述符,所以执行这样的语句: fd_ set (client_ field , &rdfdset) ; fd_set (server_ f ield ,&rdfdset) ; 然后调用select()返回描述符状态,此时描述符状态被存储进描述符集,也就是fd _ set数据结构中。 在该系统中,只关心两个套接字描述符是否可读,因此执行这样的select ()函数: select (fd_ setsize, &rdfdset, null, null ,null) 那么在select ()返回后调用函数fd_ isset ()如果对应文件描述符的状态为“己准备好”(即描述符位为“1),则fd is-set 0返回1,否则返回0。 下面一段代码就实现从套接字client_ field用户主机)到套接字server_ field (远端主机)的无阻塞传输。 char buf 1024: int iolcn -0: if (fd_ isset( client_ field. &rdfdset) if ( iolen =read (client_ field, buff ,sizeof (buf)=0) break : /长度为0意味着连接中断 write 9server_ field. buf. iolen ): /缓冲区的内容发送至服务器端 而这一段代码则实现了反方向的无阻塞传输:if (fd_ isset( server _field, &rdfdset) if (iolen =read( server_ field, buf, sizeof buf ) ) )=0) break;write( client field, buf, iolen );/缓冲区内容发送至客户端 这样就通过代理服务器实现了用户主机与远端主机之间的通信。将该代理系统应用到多媒体教室中,学生机就相当于一个个客户机,教师机就相当于代理服务器。当学生机发送请求时,教师机首先看其ip地址是否有权限访问internet(学生机的ip权限可事先由教师设定),然后再看其请求的url是否合法(不合法的url事先存储在数据库中),如果是,再看其请求的url是否在cache库中,若在并且没有到达更新期限,则从硬盘中读出并显示在客户端;否则,连接到远程web服务器并缓存相应的数据或更新cache库。这样,不仅提高了学生上网的速度,节约了带宽,而且,也提高了系统的安全性,方便了教师对学生的管理。2.4 优化的代理技术为了提高www的访问的速度,也同时加强代理服务器的用户管理,在系统设计过程中,采用了proxy cache缓冲技术和用户身份认证技术,提高系统访问及管理的有效性和高效性 身份认证为了简化客户端的应用软件,本系统在不增加客户端任何软件或对其系统进行改变的情况下,对客户的身份进行认证.即采用主机名/ip地址识别法来确认用户的有效性。利用tcp/ip协议进行通讯时,无论是何种应用协议,在传输层都转化成socket进行联接,两个socket之间利用五元组来实现联接和通讯。socket五元组标识如下:协议 源ip地址 源端口号 目的地址 目的端口号在代理服务程序进入监听状态后,在listen()等待客户的联接请求,一旦有请求,则触发fd-accept事件,在onaccept事件处理函数中即可验证客户信息.实现主要过程如下:socket socket;sockaddr-in m-clientsocket;socket.sockid=accept(listensocket, (struct socketaddr-in)&socket.addr, &sizeof(m-clientsocket)if(socket.sockid=inavlid-socket)return false;cstring ipaddr = inet-ntoa(socket.addr.sin-addr);将网络ip转化为点分格式串if(ipaddr不满足条件)判断ip地址是否满足条件return false;2.4.2 cache技术 cache技术对于提高www的访问速度,减少请求的响应时间和服务器的负载,有着很重要的意义。 随着www的普及程度越来越高,访问internet的用户也越来越多,由此而导致internet的阻塞,这对http请求的阻塞尤为明显。近来的研究数据表明,在所有导致internet阻塞的原因中,由于http请求引起的占了75-80% 。 http代理缓冲的目的就在于减少网络传输开销和提高传输速度。另外,也可以节省上网费用。 代理服务器的cache通过保存代理的url摘要(key)来减少请求次数。当有新的请求时,首先检查本身的缓存摘要,如果其摘要里有文档信息,则向代理缓存器请求己取得文档,如果没有,则直接向web服务器发送请求。摘要必需周期的刷新。当客户与代理服务器连接后,所提交的请求主要有4种:get,head,put,post。其中,get和head请求是最多的也是最频繁的,大约占90%以上。put和post请求要向远程服务器提交数据,而且post请求还要启动cgi应用程序,因此利用缓冲区的意义不大。在该系统中,只对get请求作缓冲处理,其他的请求则直接由代理服务器发送给远程服务器。用于代理服务器的cache一般比较庞大。在一个过大的cache文件表中,查找某一个文件,将消耗系统资源,降低系统性能。所以,如何合适的存储和检索摘要己达到快速的定位文件,以提高系统的性能,是cache技术的核心。对此,国内外有好多相关的算法来实现该项技术。在该系统中,采用文本缓冲的存储方式。代理服务器利用缓冲区头数据结构来管理存在硬盘上的web页面。缓冲区的数据结构如下:struct buffer- webint index;/ 请求的索引值int num;/访问的次数char* url ; /请求的url值char szpath max_ path;/存储在硬盘上的路径char szexpire 20:;/请求文档过期日期串systemtime sztime; /存入硬盘上的时间struct buffer web* pnext; /指向下一个节点*lpbuffer_ web, buffer _ web;结构buffer_web标识了一个web页面在本地缓冲区的物理地址,文档的失效口期串以及存入缓冲区的时间等。为了提高系统的效率,采用hash散列算法散列客户请求的url,不同的索引值对应不同的hash链表,代理服务器维护着由这个结构组成的多个hash链表,并不断更新这些链表。szexpire只是在http进行请求web远程服务器后,作为响应传回来的。当表中的szexpire超出规定范围时,代理服务器删除此buffer_ web节点。在代理服务器接收到一个get请求后,解析出服务器名与路径和文件,通过服务器名求出索引,然后在该索引值所对应的链表中查询是否有此url如果有,则通过buffer_ web结构中的元素szpath去定位文件。如果请求得网页己过期或不存在,则需要重新向远程的web服务器请求后交给客户端并更新本地缓冲区。代理服务器的缓冲区是不断更新的。当客户端所请求的在代理缓冲区的页面己经过期时,代理服务器必须向web服务器请求相关的新的信息。而且,在将新的信息送到客户端的同时,刷新缓冲区,并刷新相应的参数(sztime,szexpire),确保保存的页面是最新的。由lru算法可知,对于一些更新周期很慢的页面以sztime和num作为衡量标准),说明该页面访问次数较少,因此需要进行清理。缓冲区不是无限大的,因此,在代理服务器启动、退出、定时或空闲时的时间内,代理服务器要对缓冲区进行清理,去掉一些失效的页面。第三章 总体设计3.1框架结构整个代理服务系统主要由3个模块组成:主守护进程模块、代理服务模块和缓存管理模块。主守护进程模块:负责代理服务器的初始化,监听提供http代理服务的端口,启动一定数量的代理服务子进程并对进程池进行管理;代理服务模块:负责处理客户端的请求,提供代理服务;缓存管理模块:负责提供对缓存的快速查询、添加和删除等维护操作。如图3-1所示。图3-1 框架结构在这个设计框架中,采用了进程池技术和缓存机制两个关键技术,下面将详细阐述。3.2关键技术3.2.1进程池管理普通的代理服务器是这样工作的:主进程在某个绑定的端口上监听,一旦有客户请求到达,就通过fork ()系统调用创建一个子进程,而主进程则继续监听,由该子进程完成对客户请求的代理服务,服务完成后子进程自动终止。这种代理服务器有一个明显的缺点,由于fork()系统诵用需花费较多的cpu时间,这样当客户比较多时,主进程就疲于创建子进程,代理服务器对客户的响应速度就会相慢。为了尽可能加快连接的响应速度,采用了预先派生子进程的方法。主守护进程启动后,先创建监听套接字,并对该套接字调用listen(),然后派生一组子进程,形成进程池。各个子进程会复制主进程的描述符字。子进程启动后对从主进程继承而来的套接字描述符调用accepts,没有客户请求时,所有子进程都进入睡眠,当一个客户请求来到时,所有子.进程被内核同时唤醒,但只有最先被调度的子进程才能获得与客户的连接,而其它的子进程再次进入睡眠。 因为一个请求的到来唤醒了所有的子进程,而最后只有一个子进程被调用,这种现象叫做惊群现象(thundering herd),虽然这样工作可行,但对系统性能的影响是显著的。由于同时醒来的进程过多,内核在进程调度上会花费更多的时间。解决的办法是在调用accept前后设置某种形式的锁,如信号量锁或文件锁,这样就只有一个accept阻塞在套接字描述符上了。对进程池中进程的数量也需要管理,如果进程池中空闲进程太多,则浪费系统资源;空闲进程太少,就会因为客户连接的突发增加而使池中的子进程耗尽需要创建子进程,从而影响响应速度。主守护进程除了负责创建进程池,还负责对进程池的管理。它定时检查进程池中空闲进程数,当空闲进程数低于某一闽值时,则派生额外的子进程;当空闲进程数大于某一闽值时,则终止部分派生的子进程。主守护进程与进程池的通讯可采用共享内存方式。在共享内存中存入一个数组,数组的每一项对应进程池中一个子进程,记录该子进程的状态。每个子进程有3个状态(empty、idl、busy) 。empty表示该位的子进程没有创建,idl表示该位的子进程处于空闲,busy表示该位的子进程正在处理客户请求。进程池中的子进程向共享内存传递自己的状态信息(empty。idl。busy),主守护进程便可通过共享内存检测到各个进程的状态。对共享内存的操作要加锁(可采用文件锁)。另外,在处理客户请求过程中涉及到许多内存申请释放操作。为避免内存泄漏问题,子进程每处理一定数量的连接,就自杀掉。3.2.2缓存管理缓存是代理服务器用于保存远端服务器的网页,以便客户端能够直接从缓存中读取,加快响应速度。如果缓存中的网页过期或不存在,则由代理服务器重新下载,再转发给客户端。采用缓存机制能够有效地降低internet的信息流量,提高用户的访问速率。缓存中的网页是以文件的形式存储的,笔者首先定义了一个数据结构记录每个文件的信息。该结构定义如下:对应每个url存储了映射的文件名、网页的过期时间、最近访问时间、最后修改时间以及文件大小等信息。记录最近访问时间是为了对缓存实行lru (least-recently-used)替换策略,即当缓存的剩余空间小于一定阐值时,要替换掉一部分最近一直没有被访问的文件。为了快速定位与某个url对应的文件、高效地查询文件的相关信息以及方便地实行缓存替换策略,笔者设计了hash链表结构和按时间排序的双向链表结构。设计hash链表结构是为了快速查询与url对应的文件的信息,具体实现是定义一个数组,数组的每一项指向上面定义的文件信息结构struct webfile_digest。当查询网页文件时,先将url做hash处理,hash的结果即为数组的下标,然后查找该项数组指向的链表,查找是否有与url匹配的结构。设计时间双向链表结构是为了方便实现lru的缓存替换策略。该链表是以文件的最近访问时间排序,采用双向链表是为了便于快速插入和删除。具体结构即上面定义的文件信息结构struct webfile_digest。也就是说,hash链表结构与时间双向链表结构共享同一数据结构。hash链表结构和时间双向链表结构以及缓存替换策略由缓存管理进程实现和维护。代理服务进程要与缓存管理进程通讯,进行缓存的查询和更新等操作。通讯方式可采用消息队列机制。第四章 核心模块的实现4.1主守护进程的实现主守护进程负责代理服务器的初始化、监听端口、启动一定数量的代理服务子进程并对进程池进行管理,实现流程如下:首先将进程初始化为守护进程,守互进程的特点是,在后台运行,没有与之相关联的终端;建立socket套接字,绑定ip地址和端口,并监听代理服务端口;建立共享内存和文件锁,申请一块共享内存,大小为最大进程数,每个字节代表相应进程的状态,将共享内存中每个状态初始化为empty;启动进程池,启动一定数量的子进程,并在共享内存中对应位置存入idle状态;定时检查进程池中空闲进程数,当空闲进程数低于某一阂值时,则派生额外的子进程;当空闲进程数大于某一闽值时,则终止部分派生的子进程。4.2代理服务模块的实现代理服务模块负责处理客户端的请求,提供代理服务。每个代理服务子进程的流程如下:初始化连接数cone=0:进入循环体;调用accept ()接收连接,要对系统调用accept()加锁,解决惊群问题;向共享内存对应位置传递busy状态:读取客户请求,解析请求并进行相应处理(具体处理细节如图2所示);将连接数递增conn+,检查处理的连接数是否到达最大数。如果已经到达,则向共享内存对应位置传递empty状态并退出程序;否则向共享内存对应位置传递idle状态,再进入。对客户请求的解析处理,采用流程图的形式表示,如图4-所示。图4- 客户请求处理流程图代理服务子进程在接收到客户的请求后,首先判断该请求是否可从缓存读取,判断的根据是如果请求的类型是get,且请求头中不含用来表示不可缓存的cache-control:no-cache或pragma: no-cache字段,则可以从缓存读取;否则直接连接远端服务器,获取响应后直接转发给客户端。如果可以从缓存读取,则开始查询缓存文件。根据查询结果做不同的处理。查询结果分为两种情况。一种情况是查到该缓存文件且文件没有过期,此时判断客户的请求是否是条件请求,即客户端询问客户机器上保存的文件是否己经修改,如果是条件请求,则判断文件的有效性,如果有效,则返回给客户端304响应,告诉客户端客户机器上保存文件依旧有效:若无效则读取缓存文件返回给客户;如果客户请求不是条件请求,则可以直接读取缓存文件返回给客户端。另一种情况是没有查到该缓存文件或查到的缓存文件已经过期,此时也要判断是否是条件请求,如果是条件请求,则连接远端服务器,转发该请求,获取响应后,判断该响应是否是已更新的网页,如果是,则判断该网页是否可以缓存(判断依据是,如果响应为200,且请求头中不包含用来表示不可缓存的cache-control:no-cache或pragma:no-cache字段,则可以缓存,否则不可以),可以缓存则更新缓存并将结果返回给客户端,不可以缓存则直接将结果返回给客户端;如果获得的响应是其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能晾衣架课程设计
- 物业管理实习报告模板
- 2024年中国快捷式过滤机市场调查研究报告
- 水污染课程设计沼气储罐
- 2024年中国室内取暖器市场调查研究报告
- 2024年中国外胎再生胶市场调查研究报告
- 2024年中国伸缩门五金配件市场调查研究报告
- 建筑课程设计书
- 月饼包装印刷课程设计
- 文学类专业顶岗实习报告
- 新人教版八年级上册物理全册教学课件(2024年秋季新版教材)
- 网络安全测评整改投标方案(技术方案)
- 抗菌药物临床应用指导原则版
- 2024中考语文《儒林外史》历年真题专练(学生版+解析版)
- 小学必背古诗练习题(四年级上册)(含答案)
- 国企入职考试公共基础知识第一阶段综合测试卷(附答案)
- 学校自我内部控制评价范文
- 淘宝电商网页开发专员合同
- 粉蓝色简约卡通三好学生竞选
- 物理学业水平考必背知识点归纳
- 2024年安全员C证考试题库及解析(1000题)
评论
0/150
提交评论