代理服务器高性能HTTP代理服务器的设计与实现

qq代理服务器  时间:2021-03-02  阅读:()

理学院数学与应用数学系黄建林

学号: 2002144081

【 】本文在VC6.0环境下应用Windows完成端口I/O模型创建了一个高性能的HTTP代理服务器。整个HTTP代理服务器包含四个核心线程:主线程、管理线程、监听线程和服务线程,并由这四个线程控制整个代理服务器系统的运行。由于本文应用了Windows内核对象——完成端口来实现HTTP代理服务器,解决了线程上下文切换所带来的大量资源耗费,并同时保留了线程池模型的优势,所以该服务器具有极高的响应性能和稳定性。本文所讨论的完成端口I/O模型的应用方法和开发流程对开发大规模的高性能服务器有一定的参考意义。

【 】完成端口;完成键;单I/O操作数据;事件对象; HTTP协议

【 】代理服务器在局域网内应用越来越广泛,这要求代理服务器能够经得住大规模请求的考验并具有很高的性能。本文作者深入研究HTTP代理服务器,在VC6.0环境下应用Windows完成端口I/O模型创建了一个高性能的HTTP代理服务器。由于服务器应用了Windows内核对象——完成端口来实现HTTP代理服务器,解决了线程上下文切换所带来的大量资源耗费,并同时保留了线程池模型的优势,所以该服务器具有极高的响应性能和稳定性。本篇论文组织合理,叙述清晰,文字简洁流畅,理论与实践结合得较好。达到了本科生毕业论文要求。 (点评教师:王保华讲师)

1

The Design and Implementationof HTTP Proxy Server of High Performance

This thesis applies the IOCP model to a HTTP Proxy Server of highperformance based on the VC6.0.This HTTP Proxy Server contains four important threads: themain thread, the administrant thread, the listen thread and the service thread, and these threadscontrol the running of the Proxy Server. Because of the application of Windows kernelhandle——IOCP, this Proxy Server solve the problem that much resource would be cost whileswitching the thread context, and in the same time, it holds the advantage of the threads-poolmodel, this Proxy Server has high performance and stability. The apply methods andprogramming procedure of the IOCP model discussed in this thesis can give some reference tothe programming of the Large-scale server that has high performance.

Completion Port; Completion Key; Single I/O Management Data EventHandle; HTTP Protocol

代理服务器(Proxy Server) [1]是建立在T C P/ I P协议应用层上的一种服务软件,作为个人网络和因特网服务商之间的中间代理机构,它负责转发合法的网络信息,并对转发进行控制和登记。 WWW服务器使用的主要协议是HT TP协议,而代理服务器是介于浏览器和W e b服务器之间的一台服务器。代理服务器作为一种中间媒体,可为WWW服务器和用户都提供帮助,减少一些不必要的通信。例如,代理服务器可以有一个自己的高速缓存,这样便可在不涉及原始WWW服务器的情况下向客户浏览器直接回传响应。当代理服务器离客户机近时,客户机感觉到延迟时间会变得短一些。因为消息只须传输一个较短的距离, 网络的负载也降低了。 同时,代理服务器也降低了WWW服务器的负载, 因为这时WWW服务器只需处理更少的消息了。代理服务器可以与始发请求在同一机器上,也可在不同的机器上。

对于使用代理服务器上网的用户来说,合理设置并使用它有很多好处:能加快对网络的浏览速度、节省IP开销、可以作为防火墙、提高访问速度、方便对用户的管理等等。

代理服务器是接收或解释客户端连接并发起到服务器的新连接的网络节点,它是客户端/服务器关系的中间人,这意味着代理服务器必须实现以下功能:

(1)接收和解释客户端的请求;

(2)创建到服务器的新连接;

(3)接收服务器发来的响应;

(4)发出或解释服务器的响应并将该响应传回给客户端;

2

这是代理服务器的四个基本功能, 因此实现代理服务器必须要同时实现服务器和客户端两端的功能,代理服务器本身具有双重身份:对客户端来说,代理服务器是服务器;对WWW服务器来说,代理服务器又是客户。代理服务器的工作过程如图1所示:

图1代理服务器的工作过程

在现在的校园网等局域网内,局域网内的用户要连上Internet浏览信息,一般都要通过总的代理服务器, 比如学校提供的代理服务器,这就要向网络管理员申请一个上网账号(一般要交纳一定的费用) ,用户再通过这个账号连上Internet,而没有上网账号的用户是不能连到外面的Internet的。例如在深圳大学校园网内,老师或者学生要连接到外面的Internet,都要先到网络中心交纳一定的费用申请一个账号,在浏览器上的网络设置上设置为通过学校的代理服务器proxy. szu. edu.cn上网后,再通过账号来连接到Internet。但是由于经济问题,一些同学并没有申请有学校的账号,为使没有上网账号的用户也能够连到外面的Internet,一个可行的办法就是拥有账号的用户开一个代理服务器,允许没有账号的用户通过这个代理服务器上网,所以,用户的基本需求是能够连上Internet浏览信息。

在设计和实现代理服务器时,一个不能忽视的问题就是服务器的性能要求。在诸如校园网这些大型局域网内,要求代理服务器能够在短时间内为成百上千个客户提供代理服务,这时就要求代理服务器能够经得住大规模请求的考验。

综上,本文要实现一个基于HTTP协议的代理服务器,最重要的一点要求就是该代理服务器能够在短时间内为成百上千个客户提供代理服务,成为一个能够响应大规模请求的高性能HTTP代理服务器。

3

本文的HTTP代理服务器设计为TCP服务器[2] 。一般的TCP服务器可以分为迭代服务器和并发服务器[3] 。迭代服务器的最大问题就是它无法处理多个同时发生的客户端请求。如果有两个客户同时发送连接请求时,那么其中的一个必须等待到另一个请求处理完毕服务器才能对它进行服务。因此,迭代服务器架构通常只能用于一些简单的服务类型。而并发服务器于迭代服务器的最大区别是它可以同时处理多个客户端的请求,克服了迭代服务器的种种局限性。本文代理服务器就要设计成一个并发服务器,它的具体实现又有以下三种方式可供选择。

在每客户单线程的设一般的并发服务器是设计成由一个单独的线程等待客户端的连接请求,当有请求到来时,该线程再创建一个新的服务线程来进行处理,在新线程创建完毕后该主线程再回复到等待请求的状态继续等待客户端的连接请求,如此重复,这就是每客户单线程设计方式。但是在这种设计方式中,需要频繁创建服务线程,不符合本文代理服务器的性能要求。

在每客户单线程的设计方式中,需要频繁创建服务线程,但是需要指出的是,线程的创建并不是零耗费的,所以每客户单线程的方式并不是本文代理服务器的最佳实现方式。为了避免动态地频繁创建服务线程所引发的开销,可以采用线程池[4] , 即是在应用进程初始化的时候预先创建多个工作线程,当连接请求到来后,由已经存在的工作线程为之服务,不用再创建线程。

线程池模型的缺点是为了能同时满足多个客户请求,不管什么时候服务器系统中都必须有一定数目的线程在运行,但是由于系统中只能有CPU个数那么多个线程同时处于运行状态,因此线程池中同时存在很多工作线程并没有实际意义,相反由于几乎所以这些线程均处于可运行状态, Windows内核在调度处于运行态的线程时引起的线程上下文切换会带来很大的资源耗费。为了解决这个问题,并同时保留线程池模型的优势, Windows引入了完成端口模型

[5]

在Windows操作系统下,共有5种类型的套接字I/O模型可让Winsock应用程序对I/O进行管理,它们包括: select(选择)模型、WSAAsyncSelect(异步选择)模型、WSAEventSelect(事件选择)模型、 overlapped(重叠)模型和IOCP(IO完成端口)模型。 IOCP模型是目前Windows平台下的最复杂的一种I/O模型。然而,假如一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能。 IOCP从本质上来说仍然属于重叠I/O[6] ,它是目前为止Win32平台下效率最高的多线程网络编程模型,适用于具有高扩展性的高性能网络服务器的设计和实现。但是,需要注意的是,该模型仅能用于Windows NT、 Windows2000之后的操作系统。

I/O完成端口是应用程序使用线程池处理异步I/O请求的一种机制。处理多个并发异步I/O请求时,使用I/O完成端口比在I/O请求时创建线程更快更有效。 I/O完成端口最初的设计是应用程序发出一些异步I/O请求, 当这些请求完成时,设备驱动将把这些工作项目排序到

4

完成端口,这样,在完成端口上等待的线程池便可以处理这些完成I/O[7] 。完成端口实际上是一个Windows I/O结构,它可以接收多种对象的句柄,如文件对象、套接字对象等。

所以,作为一个具有高性能的能够在短时间内响应大量HTTP请求的HTTP代理服务器, I/O完成端口无疑是在Windows下的最佳实现方式,本文代理服务器的实现正是采用这种高效的实现方式。

本文HTTP代理服务器的运作过程就是一个利用HTTP协议的通信过程, HTTP协议是基于请求/响应模式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

当一个或多个代理出现在请求/响应链中时,情况就变得复杂一些。一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过URI的标识把已格式化过的请求发送到服务器。本文的HTTP代理服务器的设计和实现就是这种情况。

HTTP规范1.0[RPcl945]和1. 1 [RFC 2616]定义了HTTP消息的格式。 HTTP消息分为请求消息和响应消息两类。下面就在本文中的应用分别作简单介绍。

HTTP请求消息:

下面是一个典型的HTTP请求消息[8] :

GET/somedir/page.html HTTP/1. 1

Host:www.yesky.com

Connection:close

User-agent:Mozilla/4.0

Accept-language:zh-cn

(额外的回车符和换行符)

HTTP响应消息:

下面是一个典型的HTTP响应消息[8] :

HTTP/1. 12000K

Connection:close

Date:Thu, 13Oct200503: 17:33GMT

Server:Apache/2.0.54(Unix)

Last—Nodif ied:Mon,22Jun199809;23;24GMT

Content—Length:682l

Content—Type:text/html

(数据……)

5

HTTP代理服务器与客户端的通信交互包括以下两大部分:

(1) HTTP代理服务器接受客户端的HTTP请求消息并对客户端进行身份验证。对接收到的客户端请求消息, 本文的HTTP代理服务器首先分析其身份验证段“Proxy-Authorization:”,如果该请求消息所包含的代理服务器验证信息(用户名和密码)不符合本HTTP代理服务器的设定的话,则拒绝该HTTP请求并回送一个需要身份验证(Proxyauthorization required)的消息以请求客户端重新输入使用本代理服务器的身份验证信息。对符合验证的请求消息则由HTTP代理服务器进行部分重组后再发送给二级代理。

(2) HTTP代理服务器转发二级代理返回的数据信息给客户端。将二级代理返回的数据信息直接转发给客户端的浏览器。

HTTP代理服务器与二级代理的通信交互包括以下部分:

(1)代理服务器对二级代理发起连接。

(2)代理服务器向二级代理发送HTTP请求消息。

这部分的信息交互分三次进行: 首先,代理服务器将客户端的请求消息的“Proxy-Authorization”段之前的部分发送给二级代理;其次,代理服务器发送对二级代理的身份验证信息;最后,代理服务器继续发送客户请求消息的余下部分。

(3)代理服务器接收二级代理返回的数据信息。代理服务器接收二级代理返回的响应消息,并立即转发给客户端。

根据一般局域网的管理状况,本文所设计的代理服务器界面所涉及的界面内容包括三大部分:

(1)二级代理服务器选项。 内容包括局域网总的代理服务器地址和服务端口、用户已经向局域网总代理申请了的账号和密码;本地代理服务器就是凭这些参数连接到局域网的总代理服务器。

(2)本地代理服务器选项。该选项的内容就是本地代理服务器的参数内容,这些内容是客户端要设置填入的内容,包括服务器端口、用户名和密码。只有客户端正确填入了这三个验证内容才能使用此代理服务器。

(3)界面的其他部分。包括代理服务器状态描述项、复选项和一个服务器总控按钮,以及一些有关菜单选项和软件运行时的任务栏图标显示。

本文的代理服务器应用软件的设计界面分别如图2、 图3和图4所示:

6

7

图3代理服务器运行界面

图4代理服务器任务栏显示图

整个项目采用VC6.0的MFC架构,属于基于对话框的应用程序。本代理服务器系统界面部分的代码由VC6.0自动生成外,其他的代码全部由手工设计添加实现,这些代码也是实现整个项目通信的核心代码。本文代理服务器的实现牵涉到基本的Winsock API和多线程编程,还应用了标准模板库(STL)。

8

本文用IOCP模型设计代理服务器,其设计和实现流程[9]如下:

(1)使用CreateIoCompletionPort函数创建完成端口,并以该I/O完成端口为参数创建多个服务线程;

(2)创建监听套接口;

(3)接受客户端连接请求,返回服务套接口;

(4)将服务套接口与完成端口绑定,并在该套接口上投递初始的I/O请求;

(5)返回步骤(3) 。

而服务线程的执行流程则如下:

(1)调用GetQueuedCompletionStatus函数等待获取完成信息;

(2)根据需要对数据进行处理并投递后续的I/O操作请求;

(3)返回步骤(1) 。

本文的HTTP代理服务器实现与工作流程图如图5所示:

9

HostKvm新上联通CUVIP线路VPS,八折优惠后1G内存套餐$5.2/月起

最近上洛杉矶机房联通CUVIP线路主机的商家越来越多了,HostKvm也发来了新节点上线的邮件,适用全场8折优惠码,基于KVM架构,优惠后最低月付5.2美元起。HostKvm是一家成立于2013年的国人主机商,提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,君选择国内直连或优化线路,延迟较低,适合建站或者远程办公等。以洛杉矶CUVIP线路主机为例,...

ZJI全新上架香港站群服务器,4C段238个IP月付1400元起

ZJI本月新上线了香港葵湾机房站群服务器,提供4个C段238个IPv4,支持使用8折优惠码,优惠后最低每月1400元起。ZJI是原Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月更名为ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务,所选数据中心均为国内普遍访问速度不错的机房。葵湾二型(4C站群)CPU:I...

HostKvm - 夏季云服务器七折优惠 香港和韩国机房月付5.95美元起

HostKvm,我们很多人都算是比较熟悉的国人服务商,旗下也有多个品牌,差异化多占位策略营销的,商家是一个创建于2013年的品牌,有提供中国香港、美国、日本、新加坡区域虚拟化服务器业务,所有业务均对中国大陆地区线路优化,已经如果做海外线路的话,竞争力不够。今天有看到HostKvm夏季优惠发布,主要针对香港国际和韩国VPS提供7折优惠,折后最低月付5.95美元,其他机房VPS依然是全场8折。第一、夏...

qq代理服务器为你推荐
微信对骂群请帮我查一下微信骂人是不是违法的外网和内网内网和外网是什么意思啊??赵雨润星辰变电影是真的启动了吗?依赖注入Spring 的依赖注入是什么意思?qq空间装扮qq空间的装扮空间在哪?iphone越狱后怎么恢复iPhone越狱后怎么恢复?畅想中国用“心系祖国情,畅想中国梦”为题目的800字作文创维云电视功能创维新出的4K超高清健康云电视有谁用过,功能效果怎么样?srv记录SRV记录的简介系统分析员系统分析师是什么职业?主要做什么工作?
免费国内空间 asp虚拟空间 已备案未注册域名 godaddy域名解析 瓦工 vpsio 美元争夺战 realvnc 国外php空间 亚洲小于500m 777te 老左正传 183是联通还是移动 服务器是干什么用的 视频服务器是什么 云服务器比较 贵阳电信 godaddy空间 镇江高防服务器 标准机柜 更多