HTTP代理服务器在windows下的实现

时间:2024-02-23 10:01:05

HTTP 代理服务器在Windows下的实现
摘要:本文介绍了代理服务器的优点,HTTP 代理服务器在Windows 下的实现,最后
简单讨论实现代理服务器的意义。
关键字:
代理服务器(proxy)、HTTP、Windows、线程
普通的因特网访问是一个典型的客户机/服务器(Client/Server)结构:用户本地计算机
上的客户端程序如浏览器发生请求,远端WWW 服务器程序响应请求并提供相应的数据。
而代理(Proxy)处于客户机和服务器之间,对于服务器来说,Proxy是客户机,提出请求;
对于客户机来说,Proxy是服务器,它接受请求并提供数据。
代理服务器模型
代理服务器具有以下几个的优点:
(一)安全屏障
Proxy 是建立在应用层的软件,它的最主要功能是作为firewall 的重要组成部分,为它保
护的主机起到了安全屏障的作用。Proxy起到流量控制,包过滤,访问控制,和操作系统用
户集成等作用,所以Proxy可以成为简单网络管理软件的核心部分,同时它也是中小型企业
INTERNER访问解决方案的重要组成部分。
(二)提高网络性能
当Internet的用户以指数函数增长时,网络的拥挤是网络管理的一个重要问题。Proxy Server
就好像一个大储藏库, 它有很大的Cache空间。如果通过该Proxy有人去过了某个站点,传
输了某些内容,那么Proxy 会将相关的资料 (包含文字、图型、多媒体……)备份一份在Proxy
Server 中。当用户再要通过该Proxy访问相同地址时,可直接从Cache中获得数据。一个有
效的Proxy服务器将可能将90%的用量控制在Proxy 服务器之下。所以不仅用户的访问速度
将会提高,网络的拥挤状况也将会大大改观。
(三)多机共享一个IP地址
当一个局域网只有一个IP时,就可以在服务器上安装Proxy,整个局域网的用户就可通过一
个IP访问Internet了,这样将会给局域网用户节省大量申请IP的费用。
WWW 代理服务器包括主要代理gopher,http,ftp,Telnet等几种服务,各种代理服务
的基本工作原理是相同的。HTTP 代理服务器是WWW 代理服务器的一个最重要的组成部
分,同时HTTP 的代理服务器的实现比较简单,因此在这里以它为样本介绍Windows 下的
代理服务器的实现方法。本文只介绍的代理服务器数据包转发的实现方法,由于Cache的处
理比较复杂,所以本文不对其进行讨论。
1、Brower 通过proxy访问Web Server 头文件的数据格式
由于不可能在此解释HTTP协议,所以只给出最简单的数据格式的例子:
动作:Brower 获得http://202.196.48.9/index.htm
Brower 发送到proxy的数据:
Brower Proxy Server
Get http://202.196.48.9/index.htm HTTP/1.0
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01;Windows 95)
Host: 202.196.48.9
Proxy-Connection: Keep-Alive
Server 返回proxy的数据头
HTTP/1.0 200 OK
Server: Microsoft-IIS/2.0
Date: Thu, 02 Sep 1999 09:45:42 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Wed, 25 Aug 1999 00:10:35 GMT
Content-Length: 26402
2、HTTP代理服务器的建立过程:
1)Proxy启动监听Brower 的连接申请
2)Proxy接受Brower 的申请,Brower 向Proxy发数据
3)Proxy解析Brower 发的数据,确定服务类型(HTTP),服务器地址和服务端口号
4)Proxy连接服务器
5)Proxy启动B_P_S(brower to proxy to server)线程,该线程负责Brower 把数据传到
Proxy,再由Proxy传到Server
6)B_P_S启动S_P_B(Server to Proxy to Brower)线程,该线程负责Server 把数据传到
Proxy,再由Proxy传到Client
7)传输完毕结束B_P_S线程和S_P_B线程
8)循环启动线程,直到所有传输完成
Brower Proxy Server
1.监听
2.连接上,发数据
3.解析
数据
4.连接服务器5.启动线程
初始化
B_P_S线程
S_P_B 线程
数据
数据
Proxy_Server Socket
Brower_Proxy Socket
Brower_Proxy Socket
Brower_Proxy Socket
Proxy_Server Socket
Proxy_Server Socket
接收
发送 接收
发送
HTTP代理服务器的建立过程
3、程序框架结构
HTTP协议是各部分单独连接传送的,Web页面中的每个文本,图片都是作为独立单元
传送的,为了提高Proxy的效率防止主程序阻塞,特意启动三级线程。
各线程之间的关系
主线程在Proxy端口监听Brower 的申请,然后启动B_P_S线程;B_P_S线程负责接受
每个Brower 的申请(每个B_P_S都是独立的),在完成Brower 到Server 单向数据传送的同
时启动S_P_B 线程,然后由S_P_S 线程完成Server 到Brower 的单向数据传送。由于篇幅
所限,本文将简要介绍B发给P的数据分析函数、B_P_S线程函数和S_P_B线程函数
(I) B发给P的数据分析
这部分的主要功能是分析B发给P的数据,确定服务类型和服务器相关信息。
客户机向服务器申请接受HTTP 数据,它发出的HTTP 命令格式第一行一般是:命令
---URL---协议,例如上文提到的:
Get(命令) http://202.196.48.9/index.htm(URL) HTTP/1.0(协议)
Proxy程序需要通过查找“URL”中的“http://”串确定是否是HTTP服务,从URL部分中
解析到Web服务器的地址,作为Proxy连接的目的地址。同时将“http://服务器地址”部分
从URL部分剔除,这样可以避免某些Web服务器重定向URL。
int GetAddressAndPort( char * str, char *address, int * port)
{
//读出“Get”、“http://202.196.48.9/index.htm”和“HTTP1.0” 分别存入s_Cmd,s_Server,
s_Pro
//在s_Pro中查找“http://”如果没有找到,则表示非HTTP服务,返回-1
//*port=80 HTTP缺省端口
//从s_Server 中解析地址“202.196.48.9”存入*str
//把*str 中的服务器地址去掉,即“Get http://202.196.48.9/index.htm HTTP1.0”è“Get
/index.htm HTTP1.0”,返回1
}
(II) B_P_S线程
这部分的功能是:Brower 把数据传到Proxy,再由Proxy把数据传到Server。
B_P_S 线程由主线程启动,在整个Proxy 程序中负责协调该线程启动并同步S_P_B 线
程。该线程在Accept Brower 以后,复制自己,因为Accept 函数是阻塞的,在没有收到Brower
的连接申请时会阻塞,所以同时最多只有一个空闲(处于Accept阻塞状态)的线程。
UINT B_P_S(LPVOID pParm)
主线程
1 创建监听socket
2 监听Brower 的申请
3 启动B_P_S线程
B_P_S线程
Accpet Brower
复制自己
启动 S_P_B线程
S_P_B线程
{
//Accept Brower 的连接申请
// AfxBeginThread(B_P_S) 重新启动一个B_P_S线程
//收到一块Brower 发送的数据
// GetAddressAndPort分析数据并去掉数据中的服务器地址
//启动S_P_B线程
//等待60 秒或S_P_B线程连接上服务器
// Brower 把数据传到Proxy,再由Proxy传到Server,循环直到数据传输完毕
//等待S_P_B线程结束。因为B_P_S是线程S_P_B的父线程,所以在S_P_B结束以前B_P_S
不能提前结束
}
(III) S_P_B
这部分的主要功能是:Server 把数据传到Proxy,再由Proxy传到Client
S_P_B 线程由B_P_S 线程启动,是B_P_S 的子线程。不把S_P_B 线程合入B_P_S 线
程的原因是,S_P_B线程有一个阻塞的连接远端服务器的connect动作,当网络传输条件较
差时,该动作会占用很多时间,甚至使程序无法控制,于是在B_P_S 中加入时间控制以保
证程序正常运行。S_P_B相对简单一些,但是由于它与远端服务器连接,所以一定要注意错
误与例外的处理,本文仅介绍程序流程,错误与例外的处理请参考相关资料。
UINT S_P_B(LPVOID pParm)
{
//解析服务器的域名
//新建socket并连接到服务器
// Server 把数据传到Proxy,再由Proxy传到Brower,循环直到数据传输完毕
// 返回
}
从以上的程序可以看出,Proxy是Brower 访问Server 的中介,它可以监控Brower 发出的所
有的HTTP数据包,对这些数据包进行阻塞,转发和流量记录。同时,它也可以监控Server
发出的所有的HTTP数据包,对这些数据包进行阻塞,转发和流量记录。
对 Browser 而言,在HTTP服务上是连通的,但是在IP层却不通;然而对Server 而言,它
看到的只是一个IP节点。在Internet环境看,这是一个单向的数据传输模式。
所有这些特点,使Proxy成为网络接入管理的核心部分,对Proxy简单扩展,就可以完成许
多功能。如果对数据包进行过滤,就构成了一个Fierwall;如果对流量进行记录,就构成了
一个计费系统。
4、实现代理服务器的意义
HTTP 代理服务器是中小型企业Web 访问解决方案的重要组成部分,对它的功能进行
简单的扩展,就可以构成访问计费系统和管理系统,因此拥有代理服务器的内核对企业管理
和程序员都是很有意义的。
周翚 侯滨
(郑州信息工程大学计算机通信教研室)