代理

Posted 空方块

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理相关的知识,希望对你有一定的参考价值。

1.Web的中间实体

Web上的代理服务器是代表客户端完成事务处理的中间人。HTTP的代理服务器既是Web服务器又是Web客户端。


1.1.私有和共享代理

#1.公共代理

大多数代理都是公共的共享代理,汇入同一个代理服务器的用户越多,它越有用。

#2. 私有代理

不常见,一般直接运行在客户端计算机上,扩展特性,提供性能。

1.2.代理与网关的对比

严格来说,代理连接的是俩个或多个使用相同协议的应用程序,而网关连接的是俩个或多个使用不同协议的端点。网关演绎“协议转换器”的角色。


2.为何使用代理

可以改善安全性,提高性能,节省费用。

可以监视流量,并对其进行修改,以实现很多有用的增值Web服务。

#1:儿童过滤器

可以利用过滤器代理,允许无限制访问教育性内容,但对于不适合儿童的站点要强行禁止访问。


#2:文档访问控制

代理服务器在大量Web服务器和Web资源之间实现统一的访问策略,创建审核跟踪机制。

在集中式代理服务器上可以对所有访问控制功能进行配置,则无需在众多由不同组织管理、不同厂商制造、使用不同模式的Web服务器进行经常性的访问控制升级。


#3:安全防火墙

代理服务器可以在网络中的单一安全节点上限制哪些应用层协议的数据可以流入或流出一个组织,还可以提供消除病毒的Web和E-mail代理使用的那种挂钩程序,以便对流量进行详细的检测。


#4:Web缓存

代理缓存维护了常用文档的本地副本,按需提供,减少缓慢且昂贵的通信。

>客户端1和客户端2会去访问附件Web缓存上的对象A,而客户端3和客户端4访问的则是原始服务器上的文档。


#5:反向代理

代理可以假扮Web服务器。这些被称为替代物或反向代理的代理接收发给Web服务器的真实请求,但是与Web服务器不同的是,他们可以发起通信,以便按需定位所请求的内容。

提供访问慢速Web服务器上公共内容时的性能,常被称为服务器加速器。还可以将替代物与内容路由功能配合使用,以创建按需复制内容的分布式网络。


#6:内容路由器

根据流量状况以及内容类型将请求导向特定的Web服务器,还可以用来实现各种服务级的请求。


#7:转码器

代理服务器在将内容发送给客户端前,可以修改内容的主体格式。


#8:匿名者

匿名者代理会主动从HTTP报文中删除自身特性(客户端的IP地址、From首部、Referer首部、cookie、URI的会话ID),提高私密性和匿名性。


3.代理部署

3.1.代理位置

#1:出口代理

固定在本地网络的出口点,控流;也可以提供防火墙保护,或降低带宽费用,提高流量的性能。

#2:访问(入口)代理

放在ISP访问点上,用来处理来自客户端的聚合请求。ISP使用缓存代理来存储常用文档的副本,以提高用户的下载速度,降低带宽耗费。

#3:反向代理

部署在网络边缘,作为Web服务器的替代物,处理所有传送给Web服务器的请求,并只在必要时向Web服务器请求资源。

#4:网络交换代理

具有足够处理能力的代理放在网络之间的Internet对等交换点上,通过缓存来减轻Internet节点的拥塞,并对流量进行监视。


3.2.代理的层次结构

代理的层次结构将代理级联起来。


层次不一定是静态的,可以根据不同的情况选择不同的代理转发。

>若是付费请求内容,代理会分发到附近的一个缓存服务器,这个服务器会返回缓存对象,若没有,则去取内容。

>请求特定类型的图片,访问代理转发给压缩代理,压缩代理获取图片,进行压缩,客户端下载时会速度快一点。


还有以下动态层次:

#1:负载均衡

子代理根据当前父代理的工作负载级别来决定如何选择一个父代理,以均衡负载。

#2:地理位置附件的路由

子代理可能会选择负责原始服务器所在物理区域的父代理。

#3:协议/类型路由

可能会根据URI将报文转发到不同的父代理和原始服务器上去。

#4:基于订购的路由

可以额外付费,URI会转发到大型缓存或压缩引擎上去,以提高性能。

3.3.代理如何获取流量

使客户端流量流向代理有4中常见方式:

#1:修改客户端

很多客户端都支持手工和自动的代理配置,将HTTP请求有意地直接发送给代理,而不是原始服务器。

#2:修改网络

依赖于监视HTTP流量的交换设备及路由设备,在客户端毫不知情下,拦截流量并将其导入代理,被称为拦截代理。

#3:修改DNS的命名空间

Web服务器的替代物。手工编辑DNS名称列表,或者用特殊的动态DNS服务器根据需要来确定适当的代理或服务器。

#4:修改Web服务器

Web服务器向客户端发送HTTP重定向(305),将客户端请求重定向代一个代理上去。收到重定向后,客户端会与代理进行通信。


4.客户端的代理设置

4.1.手工配置

很多Web客户端都允许用户手工配置代理。 为代理制定主机和端口

4.2.代理的自动配置(PAC)

PAC文件是一些小型的javascript程序,后缀通常是.pac,MIME类型通常是application/x-nx-proxy-autoconfig,可以在运行过程中计算代理设置,因而是一种更动态的代理配置解决方案。每个PAC文件都必须定义一个名为FindProxyForURL(url , host),用来计算访问URI时使用适当的代理服务器。 代理自动配置脚本的返回值:
代理自动配置本文示例:
function FindProxyForURL(url , host)
   if (url.substring(0 , 5) == "http:" ) 
      return "PROXY http-proxy.mydomain.com:8080";
    else if (url.substring(0 , 4) == "ftp:" )
      return "PROXY http-proxy.mydomain.com:8080";
    else 
      return "DIRECT";
   

4.3.WPAD的代理发现

WPAD协议的算法会使用发现机制的逐级上升策略自动帝为浏览器查找合适的PAC文件。
实现WPAD协议的客户端需要: #1:用WPAD找到PAC的URI; #2:从指定的URI获取PAC文件; #3:执行PAC文件来判定代理服务器; #4:为请求使用代理服务器。
WPAD协议规范按顺序尝试技术: #1:动态主机配置协议; #2:服务定位协议; #3:DNS知名主机名; #4:DNS SRV记录; TXT记录中的DNS服务URI。

5.一些棘手问题

5.1.代理URI与服务器URI的不同

客户端向Web服务器发送请求时,请求行中只包含部分URI(没有方案、主机及端口):
GET /index.html HTTP/1.0
User-Agent:SuperBrowser v1.3
但客户端想代理发送请求时,请求行中则包含完整的URI:
GET http://www.dawn.com/index.html HTTP/1.0
User-Agent:SuperBrowser v1.3
代理出现之后,使用部分URI就有问题了。代理需要知道目标服务器的名称,才能建立自己与服务器的连接。
#1:没有设置客户端使用代理时,它会发送部分URI; #2:设置客户端使用代理时,它会发送完整URI。

5.2.虚拟主机的问题

虚拟主机Web服务器的问题跟代理相似。虚拟主机Web服务器要求使用Host首部来承载主机和端口信息。

5.3.拦截代理会收到部分URI


在以下俩种情况,客户端都认为自己与Web服务器进行对话,不会发送完整URI: #1:反向代理是一个用来取代原始服务器的代理服务器,它通常会假扮服务器的主机名或IP地址来做到这点。 #2:拦截代理是网络流量中的代理服务器,会拦截从客户端发往服务器的请求,并提供缓存响应,或对其进行转发。

5.4.代理既可以处理代理请求,也可以处理服务器请求

使用完整和部分URI的规则: #1:提供完整的URI,代理就应该使用完整的URI; #2:提供部分URI,而且有Host首部,就应该用Host首部来确定原始服务器的名字和端口号; #3:如果只有部分URI,没有Host首部; #3.1.如果代理是反向代理,可以用真是服务器的地址和端口号来配置代理; #3.2.如果流量被拦截,而且拦截者也可以提供原始的IP地址和端口,代理就可以使用拦截技术提供IP地址和端口号; #3.3.都失败了,返回错误报文。

5.5.转发过程中对URI的修改

代理服务器要在转发报文时修改请求URI,微小的修改可能会影响互操作性问题。

5.6.没有代理时的URI解析


5.7.有显式代理时URI的解析


有显式代理时,浏览器不会对不完整主机名进行自动扩展。 因此,有些代理会尽力尝试去模仿浏览器的便携服务,包括www. .com自动扩展,以及添加本地域名后缀。

5.8.有拦截代理时URI的解析



#1:第(1)步中,用户在浏览器URI地址窗口中输入oreilly; #2:第(2a)步中,浏览器通过DNS查找主机oreilly,但DNS失败了,并回送说明主机未知(2b); #3:第(3a)步中,浏览器进行自动扩展,oreilly转换成www.oreilly.com。在(3b)步中,浏览器通过DNS查找主机www.oreilly.com。(3c)所示,DNS服务器成功了,并将IP地址返回给了浏览器; #4:第(4a)步中,客户端已经成功解析了主机名,并有了一张IP地址列表,尝试每个IP地址,直至成功为止。对于拦截代理,连接请求会被代理服务器拦截成功,不会连接到原始服务器上去。客户端认为他在与Web服务器进行成功的对话,实际上Web服务器可能甚至不处于活跃状态; #5:第(5b)步中,代理最终准备好与真正的原始服务器进行交互是,代理可能会发现这个IP地址实际指向的是一个已停用的服务器。代理可以通过解析Host首部的主机名,也可以通过对IP地址的反向DNS查找来尝试其他IP地址。

6.追踪报文

6.1.Via首部

Via首部会列出与报文听的每个中间节点(代理或网关)有关的信息。
Via: 1.1 proxy-62.irenes-isp.net, 1.0 cache.joes-hardware.com
上面说明了,途径了第一个代理proxy-62.irenes-isp.net,实现了HTTP/1.1;第二个代理cache.joes-hardware.com实现了HTTP/1.0。
6.1.1.Via语法
每个Via路标中最多包含4个组件: #1:协议名 如果协议是HTTP,协议名是可选的,否则,要在版本签名加上协议名,中间用"/"分隔。如HTTPS、FTP; #2:协议版本 #3:节点名 出于隐私考虑,有些组织可能不愿意给出真是的主机名,在这种情况下可以用假名来替换; #4:节点注释 描述这个中间节点的可选注释。

6.1.2.Via的请求和响应路径
请求和响应报文都会经过代理进行传输,所以请求和形影报文中都有Via首部。


6.1.3.Via与网关

有些代理会为使用非HTTP协议的服务器提供网关功能。
Via: FTP:/1.0 proxy.irenes-isp.net (Traffice-Server/5.0.1-17882 [cMs f ])


6.1.4.Via与Server首部

Server响应首部是对原始服务器使用的软件进行描述。 如:
Server: Netscape-Enterprise/4.1
Server: Microsoft-IIS/5.0

6.1.5.Via的隐私和安全问题
有时候,不希望Via使用确切的主机名。 对于强烈隐私要求,需要隐藏内部网络设计和拓扑结构,代理应将一个有序Via路标合并成一个联合条目,接收协议值不同的条目不能合并。 如:
Via: 1.0 foo, 1.1 devirus.company.com, 1.1 access-logger.company.com
压缩成:
Via: 1.0 foo, 1.1 concealed-suff

6.2.TRACE方法

整条报文会被封装在一条HTTP相应的主体中回送发送端。当TRACE相应到达时,客户端可以坚持服务器收到的确切报文,以及它所经过的代理列表(Via首部)。

Max-Forwards首部可以限制TRACE和OPTIONS请求所经过的代理跳数,测试代理链是否在无限循环中转发报文,或者查看链中特定代理服务器的效果时,很有用。 Max-Forwards首部字段包含一个整数,用于说明这条请求报文可以被转发的次数,如果代理接收到Max-Forwards大于0,则减一,否则即使接收者不是原始服务器,也必须回送给客户端,不应该继续转发。

7.代理认证

HTTP定义了代理认证机制来阻止对内容的请求,知道用户想代理提供了有效的访问权限证书为止。 #1:对受限内容的请求到达一台代理服务器时,代理服务器可以返回一个要求使用访问证书的407 Proxy Authorization Required状态码,以及描述怎么提供这些证书的Proxy-Authenticate首部;
#2:客户端接收到407,只要在Proxy-Authorzation首部字段中提供要求的证书; #3:若证书有效,代理会将原始请求沿着传输链路向下传送,否则就发送另一条407。

8.OPTIONS

若OPTIONS请求的URI为(*),请求的是整个服务器所支持的功能。 OPTIONS * HTTP/1.1 若URI是个实际资源地址,OPTIONS请求就是在查询这个特定资源的可用特性: OPTIONS http://www.joes-hardware.com/index.html HTTP/1.1

代理无法修改Allow首部字段。

以上是关于代理的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 之 首部行介绍

HTTP请求首部字段释义

4-2-面试必备-nginx实现网站动态php请求代理

计网网络层首部

计网网络层首部

计网网络层首部