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

    欢迎关注我的微博:@机器学习日记 https://weibo.com/6382778167/profile?rightmod=1&wvr=6&mod=personinfo
  • 相关阅读:
    Delphi-基础(for循环)
    Delphi-基础(运算符)
    Delphi-基础
    python 序列化
    python 模块、包
    time,datetime,random,os,sys,hashlib,logging,configparser,re模块
    第一章.Python环境安装&Pycharm日常使用
    第一章.变量.常量.注释.运算符.if流程控制
    Redis持久化数据介绍&主从复制和哨兵模式环境部署
    Redis缓存应用安装部署&常见的数据类型
  • 原文地址:https://www.cnblogs.com/danscarlett/p/4156811.html
Copyright © 2011-2022 走看看