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

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

firefox_zyw

贡献于2012-03-08

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf