HTTP学习笔记:代理

Web代理(proxy)服务器时网络的中间实体。代理位于客户端和服务器之间,扮演“中间人”的角色,在各端点之间来回传送HTTP报文。本文介绍与HTTP代理服务器有关的内容,包括:代理能做什么,代理一般位于何处,与代理请求有关的一些问题以及如何追踪报文等等。

1. Web的中间实体

Web上的代理服务器是代表客户端完成事务处理的中间人。有了代理,客户端就可以与代理进行对话,然后由代理代表客户端与服务器进行交流,客户端仍然会完成对事务的处理,但它是通过代理服务器提供的优质服务来实现的。注意代理服务器既是Web服务器又是Web客户端,必须正确地处理请求和连接。

代理服务器可以是某个客户端专用,称为私有代理。私有代理比较少见,一般用于扩展浏览器特性,提高性能,或为免费ISP服务提供主机广告灯。大多数代理都是众多客户端共享的公共代理。某些代理应用,比如高速缓存代理服务器,会利用用户间共同的请求,当汇入同一个代理服务器的用户越多,它就越有用。

严格来说,代理连接的是多个使用相同协议的应用程序,而网关连接的则是多个使用不同协议的端点。例如HTTP代理与客户端和服务器之间都使用HTTP协议,而HTTP/E-mail网关则把HTTP前台与POP E-mail的后端连接起来,很多基于Web的E-mail程序都是HTTP/E-mail网关。

由于代理服务器可以看到并接触到所有流过的HTTP流量,所以代理可以监视流量并对其进行修改,以实现很多有用的Web增值服务。下面是常见的一些代理使用例子:

  • 儿童过滤器:阻止儿童访问成人内容
  • 文档访问控制:在大量Web服务器和资源之间实现统一的访问控制策略,创建审核跟踪机制
  • 安全防火墙:在网络中的单一安全节点上对流量进行详细检查,限制哪些应用层协议的数据可以流入或流出一个组织。
  • 反向代理:接收客户端发给服务器的真实请求,但与Web服务器不同的是,它们可以发起与其他服务器的通信,以便按需定位所请求的内容。此时代理对外就表现为一个服务器。

2. 代理所处的位置

可以根据目标用途将代理放在任意位置。通常有以下几种部署代理服务器的方式:出口代理(固定在本地网络的出口点)、入口代理(放在ISP访问点上)、反向代理(在真正的Web服务器之前作为替代物)、网络交换代理(位于因特网对等交换点上)。

可以通过代理层次结构将代理级联起来,报文会从一个代理传给另一个代理,直到最终抵达原始服务器为止。越靠近服务器的代理称为父代理,越靠近客户端的称为子代理。层次结构可以是静态的——即转发路径是固定不变的——也可以是动态的,访问代理会根据不同情况选择往何处转发。

客户端通常会直接与Web服务器进行通信而不会与代理通信,有4种常见方式可以使客户端流量流向代理:修改客户端(手动或自动配置浏览器的代理选项,也可以通过设置PAC代理自动配置文件来实现)、修改网络(配置交换设备或路由设备对流量进行拦截并导入一个代理)、修改DNS(使所有请求发送给替代物)、修改Web服务器(配置为向客户端发送重定向命令,将客户端重定向到代理上去)。

3. 与代理请求有关的一些问题

  1. 代理URI与服务器URI不同:客户端向Web服务器发送请求时,请求行只包含部分URI,如/index.html,而向代理发送请求时则包含完整的URI。因为代理需要知道目标服务器的名称才能建立自己与服务器的连接。
  2. 缺少方案/主机/端口问题:与虚拟主机Web服务器面临的问题相同,包含部分URI的请求到达时,代理需要知道目的Web站点的主机名。显式的代理要求请求报文包含完整URI,而虚拟主机要求使用Host首部来承载主机和端口信息。
  3. 代理既可以处理代理请求,也可以处理服务器请求:通用的代理服务器应支持报文中的完整URI和部分URI。如果是显式的代理请求,代理就应该使用完整URI;如果是Web服务器请求,就应使用部分URI和虚拟Host首部。
  4. 转发过程中对URI的修改:对URI的微小修改(如用显式的“:80”代替默认HTTP端口),甚至是看起来无害的修改,都可能给下游服务器带来一些互操作性问题。因此修改URI需要特别小心。
  5. 没有代理时URI的自动扩展:没有代理时,浏览器会自动扩展用户输入的URI,如自动加上“www.”和“.com”,甚至将未解析出来的URI传递给第三方站点(如搜索引擎)。

4. 追踪报文

将Web请求从客户端传送到服务器的路径上,经过两个或多个代理是很常见的。因为代理是由不同厂商开发的,有不同的特性和缺陷,随着代理的逐渐流行,我们要能够追踪经过代理的报文流,以检测出各种问题。

4.1 Via首部

报文每经过一个节点,都必须将这个中间节点添加到Via列表的末尾。Via = 1.1 cache.joes-hardware.com, 1.1 proxy.irenes-isp.net这个例子表明了报文经过了两个代理(包括协议的版本号及主机名)。注意,每个Via路标最多包含4个组件:协议名(默认HTTP,可选),协议版本,节点名和描述性注释(可选)。

Via有时会涉及隐私和安全问题,例如代理作为网络防火墙的一部分使用时,是不应该转发防火墙后面那些主机名字和端口号的。若不允许进行Via节点名转发,代理应适当的假名来取代主机名;对那些非常需要隐藏内部网络设计和拓扑结构的组织来说,代理应该将一个接收协议值相同的有序的Via路标条目合并成一个联合条目。

4.2 TRACE方法

HTTP/1.1的TRACE方法,对代理流的调试非常有用。当TRACE请求到达目的服务器时,整条请求报文都会被封装在一条HTTP响应的主体中回送给客户端。客户端就可以检查服务器收到的确切报文,以及它所经过的代理列表(在Via首部)。此外,可以使用Max-Forwards(最大转发次数)首部来限制TRACE和OPTIONS请求所经过的代理跳数,若该值为0,那么即使接收者不是原始服务器,也必须马上将TRACE报文回送给客户端,而每转发一次,该值就会减一。

5. 代理的互操作性

代理可能无法理解所有经其传输的首部字段,它必须对不认识的首部字段进行首部,并且维持同名首部字段的相对顺序。在当今的大部分网络中,如果代理不能转发它不支持的方法,可能就无法生存下去。通过HTTP OPTIONS方法,客户端或代理可以发现Web服务器或者其上某个特定资源所支持的功能。这样就可以在于服务器进行交互前确定服务器的能力,以便与具备不同特性的代理和服务器进行互操作。

如果OPTIONS请求的URI是星号(*),请求的就是整个服务器支持的功能,如果URI是个实际资源地址,则查询那个特定资源的可用特性。HTTP/1.1在响应中唯一指定的首部字段是Allow首部。例如Allow: GET, HEAD, PUT表明了请求URI支持的方法有GET、HEAD、PUT三种。

参考文献:人民邮电出版社《HTTP权威指南》第6章

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器