谈一谈HTTP代理

1. Web的中间实体
Web代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,扮演”中间人”的角色,在各端点之间来回传送HTTP报文。
代理服务器可以是某个客户端专用的,也可以是很多客户端共享的。单个客户端使用的代理被称为私有代理。众多客户端共享的代理被称为公共代理。
代理与网关的对比:严格的说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。
2. 为什么使用代理
代理服务器可以实现各种时髦且有用的功能。它们可以改善安全性,提高性能,节省费用。

儿童过滤器
文档访问控制
可以用代理服务器在大量Web服务器和Web资源之间实现统一的访问控制策略,创建审计跟踪机制
安全防火墙
网络安全工程师通常会使用代理服务器来提高安全性。代理服务器会在网络中的单一安全节点上限值哪些应用层协议的数据可以流入或流出一个组织。还可以提供用来消除病毒的Web和E-mail代理使用的挂钩程序,以便对流量进行详细的检查。
Web缓存
代理缓存维护了常用文档的本地副本,并将它们按需提供,以减少缓慢且昂贵的因特网通信。
反向代理
代理可以假扮Web服务器。这些被称为替换物(surrogate)或反向代理(reverse proxy)的代理接收发送给Web服务器的真实请求,但与Web服务器不同的是,它们可以发起与其他服务器的通信,以便按需定位所请求的内容。
可以用这些反向代理来提高访问慢速Web服务器上公共内容的性能。在这种配置中,通常将这些反向代理称为服务器加速器(server accelerator)。还可以将替换物与内容路由功能配合使用,以创建按需复制内容的分布式网络。
内容路由器
代理服务器可以作为”内容路由器”使用,根据因特网流量状况以及内容类型将请求导向特定的Web服务器。
内容路由器也可以用来实现各种服务级的请求。例如为付费的用户将请求转发到附近的复制缓存,为申请过滤服务的用户使用过滤代理来转发HTTP请求。
转码器
代理服务器在将内容发送给客户端之前,可以修改内容的主题格式。在这些表示法之间进行的透明转换被称为转码(transcoding)
匿名者
匿名者代理会主动从HTTP报文中删除身份特性(比如客户端IP地址,From首部,Referer首部,cookie,URI的会话ID),从而提供高度的私密性和匿名性。
E.g.
从User-Agent首部删除用户的计算机和OS类型
删除From首部以保护用户的E-mail地址
删除Referer首部来掩盖用户访问过的其它站点
删除cookie首部以剔除概要信息和身份的数据
3. 代理会去往何处
3.1 代理服务器的部署
出口代理
可以将代理固定在本地网络的出口点,以便控制本地网络与大型因特网之间的流量。
访问(入口)代理
代理常被放在ISP访问点上,用以处理来自客户的聚合请求。ISP使用缓存代理来存储常用文档的副本,以提高用户的下载速度,降低因特网带宽消耗。
反向代理
反向代理可以处理所有传送给Web服务器的请求,并只在必要时向Web服务器请求资源。反向代理可以提高Web服务器的安全性能,或者将快速的Web服务器缓存放在较慢的服务器之前,以提高性能。反向代理通常会直接冒用Web服务器的名字和IP地址,这样所有的请求就会被发送给代理而不是服务器了。
网络交换代理
可以将具有足够处理能力的代理放在网络之间的因特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监控。
3.2 代理的层次结构
可以通过代理层次结构(proxy hierarchy)将代理级联起来。
代理层次结构可以是静态的,也可以是动态的。代理服务器可以根据众多因素,将报文转发给一个不断变化的代理服务器和原始服务器集。
动态选择父代理的例子:

负载均衡
子代理可能会根据当前父代理上的工作负载级别来决定如何选择一个父代理,以负载均衡
地理位置附近的路由
子代理可能会选择负责原始服务器所在物理区域的父代理
协议/类型路由
子代理可能会根据URI将报文转发到不同的父代理和原始服务器上去。
基于订购的路由
在不同的产品中,动态父代理由逻辑的实现方式各有不同,包括使用配置文件、脚本语言和动态可执行插件等。
3.3 代理如何获取流量
修改客户端
如果将客户端配置为使用代理服务器,客户端就会将HTTP请求有意的直接发送给代理,而不是原始服务器。
修改网络
网络基础设施可以通过若干种技术手段,在客户端不知道或没有参与的情况下,拦截网络流量并将其导入代理。这种代理被称为拦截代理(intercepting).
修改DNS的命名空间
放在Web服务器之前的代理服务器——替换物,会直接假扮Web服务器的名字和IP地址,这样,所有的请求就会发送给这些替换物,而不是服务器了。
修改Web服务器
也可以将某些Web服务器配置为向客户端发送一条HTTP重定向命令(响应码305),将客户端请求重定向到一个代理上去。收到重定向命令后,客户端会与代理进行通信。

4. 与代理请求相关的一些棘手的问题

4.1 代理URI与服务器URI的不同


  • 没有设置客户端使用代理时,它会发送部分URI
  • 设置客户端使用代理时,它会发送完整URI
  • 4.2 URI客户端自动扩展和主机名解析
  • 没有代理时,浏览器会获取你输入的URI,尝试着去寻找响应的IP地址,如果找到了主机名,浏览器会尝试相应的IP地址直到获得成功的连接为止。

  • 5. 追踪报文
  • 现在,在将Web请求从客户端传送到服务器的路径上,经过两个或多个代理是很常见的。

  • 5.1 Via首部
  • Via首部字段列出了与报文途经的每个中间节点(代理或网关)有关的信息。报文每经过一个节点,都必须将这个中间节点添加到Via列表的末尾。
  • Via首部字段用于记录报文的转发,诊断报文循环,标识请求/响应链上所有发送者的协议能力。

  • Via的语法
  • Via的首部字段包含一个由逗号分隔的路标(waypoint)。每个路标都表示一个独立的代理服务器或网关,且包含与那个中间节点的协议和地址有关的信息。
  • 每个Via路标中最多包含四个组件:一个可选的协议名(默认为HTTP)、一个必选的协议版本、一个必选的节点名和一个可选的描述性注释。
  • E.g. Via = 1.1 cache.test.com, 1.1 proxy.isp.net
  • 5.2 TRACE方法
  • 通过HTTP/1.1的TRACE方法,用户可以跟踪经代理链传输的请求报文,观察报文经过了哪些代理,以及每个代理是如何对请求报文进行修改的。
  • 当TRACE请求到达目的服务器时,整条请求报文都会被封装在一条HTTP响应的主体中回送给发送端。
  • 通常,不管中间插入了多少代理,TRACE报文都会沿着整条路径传到目的服务器上。可以使用Max-Forwards(最大转发次数)首部来限制TRACE和OPTIONS请求所经过的代理次数。



  • 5.3 代理认证
  • 代理可以作为访问控制设备使用。HTTP定义了一种名为代理认证(proxy authentication)的机制,这种机制可以阻止对内容的请求,直到用户向代理提供了有效的访问权限证书为止。

  • 5.4 OPTIONS: 发现对可选特性的支持
  • 通过HTTP OPTIONS方法,客户端可以发现Web服务器或者其上某个特定资源所支持的功能。通过使用OPTIONS,客户端可以在与服务器交互之前,确定服务器的能力,这样它就可以更方便地与具备不同特性的代理和服务器进行互操作了。

  • 特别的: 当OPTIONS请求的URI是一个星号(*)时,请求的就是整个服务器所支持的功能。

  • 6. 参考资料
  • HTTP权威指南