1.对HTTP代理进行解释,将其与web网关进行对比,并说明如何部署代理;
2.给出一些代理所能提供的帮助;
3.说明在现实网络中是怎样的部署代理以及如何将网络流量导向代理服务器;
4.说明如何配置浏览器来使用代理;
5.展示HTTP的代理请求,说明他们与服务器请求的区别,以及代理是如何微妙地改变浏览器行为的。
6.解释如何通过via首部和TRACE方法来记录报文传输路径上的代理服务器链;
7.描述基于代理的HTTP访问控制方法;
8.解释代理如何与客户端和服务器进行交互,每个客户端和服务器支持的特性和使用的版本都有可能有所不同。
6.1 web的中间体
HTTP的代理服务器既是Web服务器又是web客户端。
6.1.1 私有和共享代理
私有:单个客户端专用的代理。
共享:众多客户端共享的代理。
公共代理:大多数代理都是公共的共享代理。集中式代理的成本效率更高,更容易管理。
私有代理:有些浏览器辅助产品以及一些ISP服务,会在用户的PC上直接运行一些小型的代理,以便扩展浏览器特性。
6.1.2 代理与网关的对比
严格来说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。
其实代理和网关之间的区别很模糊。商业化的代理服务器可能具有一些网管的功能,如支持SSL安全协议,sock防火墙,FTP访问等。
6.2 为什么使用代理
可以实现各种时髦有用的功能。完善安全性,提高性能,节省费用。可以看到并接触到所有流过的流量,所以代理可以监视流量并对其进行修改。以实现很多有用的增值web服务。
儿童过滤器:
文档访问控制:可以用代理服务器在大量Web服务器和web资源之间实现统一的访问控制策略,创建审核跟踪机制。在集中式代理服务器上可以对所有访问控制功能进行设置,而无需在众多由不同组织、不同厂商制造、使用不同模式的Web服务器上进行经常性的访问控制升级。
安全防火墙:网络安全工程师通常使用代理来提高安全性。代理服务器会在网络中的单一安全节点上限制哪些应用层协议的数据可以流入或流出一个组织。还可以提供用来消除病毒的web和E-mail代理使用的那种挂钩程序,以便对流量进行详细的检查。
web缓存:代理缓存维护了常用文件的本地副本,并将它们按需提供,以减少缓慢且昂贵的因特网通信。
反向代理:代理可以假扮Web服务器。这些被称为替代物(surrogate)或反向代理(reverse proxy)的代理接收发给Web服务器的真实请求,但与Web服务器不同的是,它们可以发起与其他服务器的通信,以便按需定位所请求的内容。
内容路由器:根据因特网流量状况以及内容类型将请求导向特定的Web服务器。比如可以将付费用户导向缓存服务器而普通用户导向源端服务器。
转码器:代理服务器在将内容发送给客户端之前,可以修改内容的主体格式。在这些数据表示法之间进行的透明转换被称为转码(transcoding)。
典型应用是:将图片进行编解码、压缩。将英语转换成其他语言,将HTML页面重新格式化为较简单的文本。
匿名者:匿名代理会主动从HTTP报文中删除身份特性(如客户端IP地址、from首部、Referer首部、cookie、URI的会话ID),从而提供高度私密性和匿名性。
6.3 代理会去往何处
在一个网络结构中部署代理的时候,他会位于何处。
1。怎样将代理部署到网络中去
2。怎样将代理以层级方式连接在一起
3。怎样先将网络流量直接导入代理服务器中。
6.3.1 代理服务器的部署
出口代理:可以将代理固定在本地网络的出口点,以便控制本地网络与大型因特网之间的流量。
访问(入口)代理:代理常被放在ISP访问点上,用来处理来自客户的聚合请求。
反向代理:代理通常会被部署到网络边缘,在Web服务器之前,作为替代物使用,在那里它们可以处理所有传给Web服务器的请求,并只在必要时向Web服务器请求资源。
网络交换代理:可以将具有足够处理能力的代理放在网络之间的英特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监视。
6.3.2 代理的层次结构
可以通过代理层级结构(proxy hierarchy)将代理级联起来。连续转发直到到达原始服务器。
代理层次结构的内容路由:几个代理之间可以根据内容和规则配置等转发到特定代理上。
比如如果请求的是特定类型的图片,访问代理会将请求转发给一个特定的压缩代理,这个代理会去获取图片,然后对其进行压缩,这样通过到客户端的慢速Modem下载时,速度会快一些。
负载均衡:子代理可能会根据当前父代理上的工作负载来决定如何选择一个父代理。
地理位置附近的路由:子代理可能会选择负责原始服务器所在物理区域的父代理。
协议/类型路由:子代理可能会根据URI将报文转发到不同的父代理和原始服务器上去。
基于订购的路由:如果发布者为高性能服务额外付费了,他们的URI就会被转发到大型缓存或压缩引擎上去。
在不同的产品中,动态路由逻辑的实现方式各有不同,包括使用配置文件、脚本语言和动态可执行插件等。
6.3.3 代理是如何获取流量的
也就是说怎么让客户端的请求先到达代理服务器而不是直接访问原始服务器。
1.修改客户端:如手工设置和自动的代理配置。
2.修改网络:通过交换设备和路由设备拦截流量,导向代理服务器。
3.修改DNS的命名空间:可以手工编辑DNS名称列表,或者用特殊的动态DNS服务器根据需要来确定适当的代理或服务器。
4.修改Web服务器:Web服务器发送一个重定向将客户端导向代理。
6.4 客户端的代理设置
6.4.1 手工配置
浏览器手工设置代理。
6.4.2 PAC文件
是一些小型的JavaScript程序,可以在运行过程中计算代理设置,因此是一种动态的代理配置解决方案。访问每个文档时,JavaScript函数都会选择合适的代理服务器。
6.4.3 WPAD
WPAD协议。该算法会使用发现机制的逐级上升策略自动滴为浏览器查找合适的PAC文件。一系列资源发现技术可以用来判定适当的PAC文件。包括:
动态主机配置协议DHCP
服务定位协议SLP
DNS知名主机名
DNS SRV记录
TXT记录中的DNS服务URI。
6.5 与代理请求有关的一些棘手问题
6.5.1 代理URI与服务器URI的不同
除了一点之外,Web服务器报文和web代理报文的语法是一样的。客户端向服务器而不是代理发送请求时,HTTP请求报文中的URI会有所不同。
客户端向Web服务器发送请求时,请求行中只包含部分URI(没有方案、主机或端口),如下例子所示:
GET /index.html HTTP/1.0
User-Agent: SuperBrowser v1.3
但当客户端向代理发送请求时,请求行中则包含完整的URI。例如:
GET http://www.marys-antiques.com/index.html HTTP/1.0
User-Agent: SuperBrower v1.3
原因是:与源端服务器直接通信时双方建立连接就知道对方的一些信息如主机名和端口。但是代理服务器需要知道源端服务器的URI才能建立连接。
6.5.2 与虚拟主机一样的问题
虚拟主机也会遇到该如何确定发送到那个虚拟站点的问题,可以通过要求设置Host首部的方式来承载主机和端口信息。
6.5.3 拦截代理会收到部分URI
如果客户端不知道正在和代理进行通信,就会只发送部分URI,比如反向代理服务器。
拦截代理也会遇到上述类似的情况。
6.5.4 代理既可以处理代理请求也可以处理服务器请求
通用的代理服务器既应该支持请求报文中的完整URI,也应该支持部分URI。
6.5.5 转发过程中对URI的修改
代理服务器要在转发报文时修改URI的话,需要特别小心。因为可能会引发问题,导致本来正常的通信不能进行。
6.5.6 URI的客户端自动扩展和主机名解析
根据是否有代理,浏览器对请求的解析会有所不同。在没有代理的情况下,浏览器进行主机名自动扩展。
6.5.8 有显式代理时URI的解析
使用显式代理时,用户的URI会直接发送给代理,所以浏览器就不再执行所有这些便捷的扩展功能了。
6.5.9 有拦截代理时URI的解析
使用不可见的拦截代理时,对主机名的解析会有所不同。客户端直接发送完整URI获取到了IP列表,会尝试一个一个的IP地址,但是第一个发往拦截代理的IP就会被拦截代理转发,当发现该IP已经是一个停用的服务器时,会出现问题。为了提供与浏览器相同级别的容错机制,代理可以通过解析Host首部的主机名,也可以通过对IP地址的反向DNS查找来尝试其他IP地址。将浏览器配置为使用显式代理时,他们会依赖代理的容错机制,所以对拦截和显式代理来说,在DNS解析到以停用服务器时,提供容错机制是很重要的。
6.6追踪报文
随着代理的流行,我们要能够追踪经过代理的报文流,以检测出各种问题,其重要性就跟追踪经过不同交换机和路由器传输的IP分组流一样。
6.6.1 Via首部
via首部列出了与报文途经的每个中间节点(代理或网关)有关的信息。报文每经过一个节点,都必须将这个中间节点添加到via列表的末尾。
1.Via的语法
Via首部包含一个由逗号分隔的路标(waypoint)。每个路标都表示一个独立的代理服务器或网关,且包含与那个中间节点的协议和地址有关的信息。
2.Via的请求和响应路径
请求和响应报文都要经过代理进行传输,所以,请求和响应报文中都有Via首部。
3.Via与网关
有些代理会为使用非HTTP协议的服务器提供网关功能。Via首部记录了这些协议转换,这样HTTP应用程序就会了解代理链上各个点的协议处理能力以及所能做的协议转换了。
4.Server和Via首部
Server响应首部字段对原始服务器使用的软件进行了描述。如果响应报文是经过代理转发的,一定要确保代理没有修改server首部。代理应该添加的是Via首部。
5.Via的隐私和安全问题
除非显式地允许了这种行为,否则,当代理服务器作为网络防火墙的一部分使用时,是不应该转发防火墙后面那些主机的名字和端口号的,因为防火墙后面的网络结构信息可能会被恶意群体利用。
6.6.2 TRACE方法
通过HTTP/1.1的TRACE方法,用户可以跟踪经过代理链传输的请求报文,观察报文经过了哪些代理,以及每个代理是如何对请求报文进行修改的。
当TRACE请求到达目的服务器时,整条请求报文都会被封装在一条HTTP响应的主体中发送给发送端。客户端可以检查服务器收到的确切报文,以及它所经过的代理列表(在Via首部)。
Max-Forwards
最大转发次数,首部用来限制TRACE和OPTIONS请求所经过的代理跳数。Max-Forwards请求首部字段包含了一个整数,用来说明这条请求报文还可以被转发的次数。如果它为0,那么即使接受者不是原始服务器,它也必须将TRACE报文回送给客户端,而不应该继续转发。
6.7 代理认证
代理可以作为访问控制设备使用。HTTP定义了一种称为代理认证(proxy authentication)的机制,这种机制可以阻止对内容的请求,直到用户向代理提供了有效的访问权限证书为止。
下面是代理服务器可能返回的要求使用访问证书的响应报文:
HTTP/1.0 407 Proxy Authorization Required
Proxy-Authenticate: Basic realm="Secure Stuff"
客户端可能发送的带有证书的请求:
GET http://server.com/secret.jpg HTTP/1.0
Proxy-Authorization: Basic YnJpOmZvbw==
6.8 代理的互操作性
代理服务器、客户端和服务器之间实现的协议可能有所不同,可能存在着很棘手的问题。
6.8.1 处理代理不支持的首部和方法
代理服务器可能无法理解所有经其传输的首部字段。一般直接转发下去就好。
6.8.2 OPTIONS:发现对可选性的支持
通过HTTP OPTIONS方法,客户端(或代理)可以发现Web服务器或其上某个特定资源所支持的功能(比如,它们所支持的方法)。从而知道服务器的能力。
6.8.3 Allow首部
Allow实体首部字段列出了请求URI标识的资源所支持的方法列表。可以将Allow首部作为请求首部,建议在新的资源上支持某些方法。并不要求服务器支持这些方法,但应该在相应的响应中包含支持的方法。
代理一般不能去修改Allow首部,即使它们不能理解指定的所有方法。