代理服务器高性能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($4.25/月)俄罗斯/香港高防VPS

HostKvm又上新了,这次上架了2个线路产品:俄罗斯和香港高防VPS,其中俄罗斯经测试电信CN2线路,而香港高防VPS提供30Gbps攻击防御。HostKvm是一家成立于2013年的国外主机服务商,主要提供基于KVM架构的VPS主机,可选数据中心包括日本、新加坡、韩国、美国、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。俄罗斯VPSCPU:1core内存:2G...

PQ.hosting全线9折,1Gbps带宽不限流量VPS/€3/月,全球11大机房可选

Hostadvice主机目录对我们的服务进行了测试,然后给PQ.hosting颁发了十大WordPress托管奖。为此,宣布PQ.Hosting将在一周内进行折扣优惠,购买和续订虚拟服务器使用优惠码:Hostadvice ,全部优惠10%。PQ.hosting,国外商家,成天于2019年,正规公司,是全球互联网注册商协会 RIPE 的成员。主要是因为提供1Gbps带宽、不限流量的基于KVM虚拟的V...

舍利云30元/月起;美国CERA云服务器,原生ip,低至28元/月起

目前舍利云服务器的主要特色是适合seo和建站,性价比方面非常不错,舍利云的产品以BGP线路速度优质稳定而著称,对于产品的线路和带宽有着极其严格的讲究,这主要表现在其对母鸡的超售有严格的管控,与此同时舍利云也尽心尽力为用户提供完美服务。目前,香港cn2云服务器,5M/10M带宽,价格低至30元/月,可试用1天;;美国cera云服务器,原生ip,低至28元/月起。一、香港CN2云服务器香港CN2精品线...

qq代理服务器为你推荐
视频截图软件我想知道什么软件可以从视频中截图?邮箱怎么写邮箱地址怎么写绵阳电信绵阳电信营业厅哪家最大手机最全手游运营手册和平精英打到王者有什么要求中国论坛大全有谁知道国内人气最高的论坛排行榜?eset最新用户名密码ESET4.0最新用户名和密码显卡温度多少正常显卡温度多少正常vbscript教程vbs 学习方法以及 vbs 实例 有编程基础开机滚动条谁会调开机的滚动条创维云电视功能创维电视怎么用,我买了个创维云电视,现在不知道怎么用手机往电视上传照片,谁能解答以下,
上海服务器租用 网站备案域名查询 华为云服务 主机评测 国外php主机 网站监控 12u机柜尺寸 远程登陆工具 日本空间 双线主机 世界测速 phpmyadmin配置 四核服务器 免费mysql数据库 新加坡空间 独立主机 photobucket 1美元 阿里云邮箱申请 重庆服务器 更多