代理服务器高性能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

Vultr新用户省钱福利,最新可用优惠码/优惠券更新

如今我们无论线上还是线下选择商品的时候是不是习惯问问是不是有优惠活动,如果有的话会加速购买欲望。同样的,如果我们有准备选择Vultr商家云服务器的时候,也会问问是不是有Vultr优惠码或者优惠券这类。确实,目前Vultr商家有一些时候会有针对新注册用户赠送一定的优惠券活动。那就定期抽点时间在这篇文章中专门整理最新可用Vultr优惠码和商家促销活动。不过需要令我们老用户失望的,至少近五年我们看到Vu...

HostHatch(15美元)大硬盘VPS,香港NVMe,美国、英国、荷兰、印度、挪威、澳大利亚

HostHatch在当地时间7月30日发布了一系列的促销套餐,涉及亚洲和欧美的多个地区机房,最低年付15美元起,一次买2年还能免费升级双倍资源。商家成立于2011年,提供基于KVM架构的VPS主机,数据中心包括中国香港、美国、英国、荷兰、印度、挪威、澳大利亚等国家的十几个地区机房。官方网站:https://hosthatch.com/NVMe VPS(香港/悉尼)1 CPU core (12.5%...

香港服务器促销:香港华为云混合服务器、高防服务器首月半价,普通110M大带宽服务器月付799,付5用6,付10用13

博鳌云是一家以海外互联网基础业务为主的高新技术企业,运营全球高品质数据中心业务。自2008年开始为用户提供服务,距今11年,在国人商家中来说非常老牌。致力于为中国用户提供域名注册(国外接口)、免费虚拟主机、香港虚拟主机、VPS云主机和香港、台湾、马来西亚等地服务器租用服务,各类网络应用解決方案等领域的专业网络数据服务。商家支持支付宝、微信、银行转账等付款方式。目前香港有一款特价独立服务器正在促销,...

qq代理服务器为你推荐
iphone5解锁捡了个苹果5怎么解锁手机区号打电话怎么加区号?数码资源网手机练习打字的软件iphone越狱后怎么恢复苹果越狱后如何恢复qq怎么发邮件怎么发送QQ邮件创维云电视功能创维新出的4K超高清健康云电视有谁用过,功能效果怎么样?免费qq空间装扮有办法免费装扮QQ空间吗??宽带接入服务器网络已连接,可无法连接到服务器为什么?网络已连接,可无法连接到服务声母是什么声母.韵母有哪些cisco防火墙如何进入cisco防火墙的配置窗口
猫咪永久域名收藏地址 中文域名申请 hawkhost优惠码 hawkhost 20g硬盘 哈喽图床 mobaxterm xfce 免费网站申请 我爱水煮鱼 架设服务器 工信部icp备案号 东莞数据中心 免费申请网站 新加坡空间 php服务器 godaddy空间 apnic 乐视会员免费领取 asp空间 更多