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

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 访问解决方案的重要组成部分,对它的功能进行
简单的扩展,就可以构成访问计费系统和管理系统,因此拥有代理服务器的内核对企业管理
和程序员都是很有意义的。
周翚 侯滨
(郑州信息工程大学计算机通信教研室)

时间: 2024-12-21 17:26:52

HTTP代理服务器在windows下的实现的相关文章

Windows下配置Squid反向代理服务器

Squid是一款类Unix系统下非常流行的服务器软件,其最重要的功能就是在客户端和服务端之间建立缓存.因而Squid可以用作反向代理,部署多级缓存或者搭建CDN等,无论名称是什么,本质上都是一样的.目前Windows下也有Squid的移植版本,可以应对使用Windows环境的场景.这里是下载地址和文档,如果需要了解Squid技术细节可以看看<Squid: The Definitive Guide>这本书的翻译版本. 一.安装Squid 如果下载Binaries版本,直接解压到c:\squid.

Windows 下安装NPM

Windows 下安装NPM 标签: windowsnode.jsgitexpresspathcmd 2011-11-05 13:18 36528人阅读 评论(8) 收藏 举报 本文章已收录于: 分类: RIA(139) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允许不得转载. Node.js停火各大技术论坛都在讨论,前段时间工作太忙没时间学习,趁着周末空闲玩玩,在网上找了些资料发现Node.js本身有windows版和unix版下载和使用都挺方便但是其扩展模块依赖复杂通过手动到网站

Live555流媒体服务器编译(Windows下)

最近在回顾之前做过的相关项目,live555流媒体服务器也是其中之一,今天先把live555开源框架在Windows下的编译方法记录一下. live555是一套使用使用开放的标准协议(RTP/RTCP.RTSP.SIP)来处理多媒体流数据的开源C++库,使用LGPL协议.这些库可以编译为Unix(包括Linux和Mac OS X),Windows,和QNX(和其他POSIX系统)来构建流媒体应用.live555已经被用于如"Live555媒体服务器"和"live555代理服务

windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点(转)

windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点 平时需要查阅一些技术资料,光走VPN太浪费流量,所以这儿教大家一种使用火狐浏览器的插件 AutoProxy+MyEnTunnel+SSH 的方法,以下教程图片居多,不做特别过多介绍: 1.首先你得有一个镜外的SSH账号,可以是自己VPS的,也可以网上找找免费的SSH代理账号 2.安装一个火狐浏览器,并安装Firefox浏览器的扩展AutoProxy https://addons.mozilla.org

eclipse下使用cygwin的方法(Windows下用eclipse玩gcc/g++和gdb)

明天就回国了,今晚回国前写写如何配置eclipse和CDT.这个配置方法网上讨论不是很多,可能用的人少,毕竟Windows上写C++程序多数喜欢VS,即使写的是Linux程序,很多人仍然会用VS(说只喜欢用VI的人我佩服).的确VS很强大,但我也geek一回,使用eclipse做C++程序(用VI才是真正的geek?好吧,我就这水准了,反正我会用VI,但不习惯VI).希望这篇小小的文章能帮助想在Windows平台上使用gcc/g++和gdb并利用IDE调试程序的人.也希望我们谈到g++和gcc的

[转]Windows 下常用盗版软件的替代免费软件列表

当您看完这篇文章,我相信您完全可以把您 Windows 系统里安装的盗版软件清理干净而不影响您的任何工作.如果您仍然希望并且喜欢.享受做一个盗版软件用户的话,那也没有办法,但是请您记住,非常非常重要的一点:您已经不是一个历史清白的人,因为一打开电脑,您就在犯罪(侵犯知识产权,侵犯软件版权).以后像“我是一个遵纪守法的好公民”这种话,想想再说吧! 目录: 压缩解压缩软件 文本编辑软件 杀毒软件 软件防火墙 辞典软件 FTP 下载工具 邮件客户端 & RSS 阅读器 办公软件 图片查看器 集成开发环

在windows下安装hadoop

本博文完全引用于http://blog.csdn.net/nazarite_wen/article/details/34409923.防止引用博文被删除,重新copy一遍. Windows下运行Hadoop,通常有两种方式:一种是用VM方式安装一个Linux操作系统,这样基本可以实现全Linux环境的Hadoop运行:另一种是通过Cygwin模拟Linux环境.后者的好处是使用比较方便,安装过程也简单.在这里咱们就来看看第二种方案:如何再Windows下快速安装一个Hadoop环境,并结合Ecl

Windows下运行Hadoop

Windows下运行Hadoop,通常有两种方式:一种是用VM方式安装一个Linux操作系统,这样基本可以实现全Linux环境的Hadoop运行:另一种是通过Cygwin模拟Linux环境.后者的好处是使用比较方便,安装过程也简单.在这里咱们就来看看第二种方案:如何再Windows下快速安装一个Hadoop环境,并结合Eclipse开发环境研究和调整Hadoop代码. 整个安装过程包括以下三大步骤: 安装和配置Cygwin(http://cygwin.com/install.html) 安装和配

【转】Nginx windows下搭建过程

Nginx windows下搭建过程 内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统资源的消耗而闻名.2