zoukankan      html  css  js  c++  java
  • tit.Atitit. http 代理原理  atiHttpProxy  大木马 h

    Atitit. http 代理原理  atiHttpProxy  大木马

     

     

    1. 面这张图可以清晰地阐明HttpProxy的实现原理:1

    2. 代理服务器用途1

    3. 其中流程具体如下:2

    4. 设计规划3

    5. 结束语4

     

     

    1. 面这张图可以清晰地阐明HttpProxy的实现原理: 


    2. 代理服务器用途

    代理服务器看成是一种扩展浏览器功能的途径。例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据

    调试器

    数据搜集器

    木马病毒

    3. 其中流程具体如下:

     
    1、客户端通过浏览器向代理服务器发送HttpRequest(GET/POST);
    2、代理服务器读取请求头,抽取出请求的具体目标服务器HOST和PORT;
    3、代理服务器把请求头发送给目标服务器;
    4、代理服务器建立管道,供客户端和目标服务器通过两个Socket通信。

     

     

    不管以哪种方式应用代理服务器,其监控HTTP传输的过程总是如下:

    · 步骤一:内部的浏览器发送请求给代理服务器。请求的第一行包含了目标URL

    · 步骤二:代理服务器读取该URL,并把请求转发给合适的目标服务器。

    · 步骤三:代理服务器接收来自Internet目标机器的应答,把应答转发给合适的内部浏览器。

    例如,假设有一个企业的雇员试图访问www.cn.ibm.com网站。如果没有代理服务器,雇员的浏览器打开的Socket通向运行这个网站的Web服 务器,从Web服务器返回的数据也直接传递给雇员的浏览器。如果浏览器被配置成使用代理服务器,则请求首先到达代理服务器;随后,代理服务器从请求的第一 行提取目标URL,打开一个通向www.cn.ibm.comSocket。当www.cn.ibm.com返回应答时,代理服务器把应答转发给雇员的 浏览器。

    当然,代理服务器并非只适用于企业环境。作为一个开发者,拥有一个自己的代理服务器是一件很不错的事情。例如,我们可以用代理服务器来分析浏览器和Web 服务器的交互过程。测试和解决Web应用中存在的问题时,这种功能是很有用的。我们甚至还可以同时使用多个代理服务器(大多数代理服务器允许多个服务器链 接在一起使用)。例如,我们可以有一个企业的代理服务器,再加上一个用Java编写的代理服务器,用来调试应用程序。但应该注意的是,代理服务器链上的每 一个服务器都会对性能产生一定的影响。

     

     

    4. 设计规划

    正如其名字所示,代理服务器只不过是一种特殊的服务器。和大多数服务器一样,如果要处理多个请求,代理服务器应该使用线程。下面是一个代理服务器的基本规划:

    1. 等待来自客户(Web浏览器)的请求。

    2. 启动一个新的线程,以处理客户连接请求。

    3. 读取浏览器请求的第一行(该行内容包含了请求的目标URL)。

    4. 分析请求的第一行内容,得到目标服务器的名字和端口。

    5. 打开一个通向目标服务器(或下一个代理服务器,如合适的话)的Socket

    6. 把请求的第一行发送到输出Socket

    7. 把请求的剩余部分发送到输出Socket

    8. 把目标Web服务器返回的数据发送给发出请求的浏览器。

    当然,如果考虑细节的话,情况会更复杂一些。实际上,这里主要有两个问题要考虑:第一,从Socket按行读取数据最适合进一步处理,但这会产生性能瓶 颈;第二,两个Socket之间的连接必需高效。有几种方法可以实现这两个目标,但每一种方法都有各自的代价。例如,如果要在数据进入的时候进行过滤,这 些数据最好按行读取;然而,大多数时候,当数据到达代理服务器时,立即把它转发出去更适合高效这一要求。另外,数据的发送和接收也可以使用多个独立的线 程,但大量地创建和拆除线程也会带来性能问题。因此,对于每一个请求,我们将用一个线程处理数据的接收和发送,同时在数据到达代理服务器时,尽可能快速地 把它转发出去。

     

     

     

    当代理服务器连接到Web服务器之后,我用一个简单的循环在两个Socket之间传递数据。这里可能出现一个问题,即如果没有可操作的数据,调用read 方法可能导致程序阻塞,从而挂起程序。为防止出现这个问题,我用setSoTimeout方法设置了Socket的超时时间(参见Listing 2)。这样,如果某个Socket不可用,另一个仍旧有机会进行处理,我不必创建一个新的线程。

     

     

    和所有线程对象一样,HttpProxy类的主要工作在run方法内完成(见Listing 2)。run方法实现了一个简单的状态机,从Web浏览器每次一个读取字符,持续这个过程直至有足够的信息找出目标Web服务器。然后,run打开一个通 向该Web服务器的Socket(如果有多个代理服务器被链接在一起,则run方法打开一个通向链里面下一个代理服务器的Socket)。打开 Socket之后,run先把部分的请求写入Socket,然后调用pipe方法。pipe方法直接在两个Socket之间以最快的速度执行读写操作。

    如果数据规模很大,另外创建一个线程可能具有更高的效率;然而,当数据规模较小时,创建新线程所需要的开销会抵消它带来的好处。

    Listing 3显示了一个很简单的main方法,可以用来测试HttpProxy类。大部分的工作由一个静态的startProxy方法完成(见Listing 4)。这个方法用到了一种特殊的技术,允许一个静态成员创建HttpProxy类(或HttpProxy类的子类)的实例。它的基本思想是:把一个 Class对象传递给startProxy类;然后,startProxy方法利用映像APIReflection API)和getDeclaredConstructor方法确定该Class对象的哪一个构造函数接受一个Socket参数;最 后,startProxy方法调用newInstance方法创建该Class对象。

     

     

    利用这种技术,我们可以在不创建startProxy方法定制版本的情况下,扩展HttpProxy类。要得到给定类的Class对象,只需在正常的名字 后面加上.class(如果有某个对象的一个实例,则代之以调用getClass方法)。由于我们把Class对象传递给了startProxy方法,所 以创建HttpProxy的派生类时,就不必再特意去修改startProxy。(下载代码中包含了一个派生得到的简单代理服务器)。

     

     

    5. 结束语

    利用派生类定制或调整代理服务器的行为有两种途径:修改主机的名字,或者捕获所有通过代理服务器的数据。processHostName方法允许代理服务 器分析和修改主机名字。如果启用了日志记录,代理服务器为每一个通过服务器的字符调用writeLog方法。如何处理这些信息完全由我们自己决定――可以 把它写入日志文件,可以把它输出到控制台,或进行任何其他满足我们要求的处理。writeLog输出中的一个Boolean标记指示出数据是来自浏览器还 是Web主机。

    和许多工具一样,代理服务器本身并不存在好或者坏的问题,关键在于如何使用它们。代理服务器可能被用于侵犯隐私,但也可以阻隔偷窥者和保护网络。即使代理 服务器和浏览器不在同一台机器上,我也乐意把代理服务器看成是一种扩展浏览器功能的途径。例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据;未 来的代理服务器甚至还可能把页面从一种语言翻译成另一种语言……可能性永无止境。

     

     

    多线程Http代理服务器 Java实现 - 独上高楼 - ITeye技术网站.htm

    用Java开发代理服务器.htm

  • 相关阅读:
    jquery操作iframe
    KindEditor编辑器——在上传图片中选一张为焦点图片
    js查看浏览器类型和版本
    ASP.Net防止页面刷新重复提交
    js获取url参数
    sql游标简单试用
    jQuery跨域
    两款实用免积分下载工具,支持百度文库、豆丁网等
    Asp.Net 无法解析此远程名称"www.xxx.com"
    android中使用DisplayMetrics获取屏幕参数
  • 原文地址:https://www.cnblogs.com/attilax/p/5419210.html
Copyright © 2011-2022 走看看