Skip to content

Latest commit

 

History

History
118 lines (72 loc) · 5.84 KB

6-代理.md

File metadata and controls

118 lines (72 loc) · 5.84 KB

代理

什么是代理,代理是网络的中间实体,代理位于客户端与服务器之间。扮演 “中间人” 的角色,在各个端点之间传送 HTTP 报文。

代理的分类

  • 公共代理,大多数代理都有公共的共享代理,集中式代理的费用更实惠,更容易管理。公共代理可以利用用户间共同的请求,汇入同一个代理服务器,汇集访问频率高的资源内容。这样代理服务器的价值高。

  • 私有代理,专用的私有代理不常见,有些浏览器辅助产品,以及一些 ISP 服务,会在用户的 PC 上直接运行一些小型的代理,以便扩展浏览器特性。

代理与网关的对比,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。网关扮演的是 “协议转换器” 角色。

为什么使用代理

改善安全性,提供性能,节约费用。

比如:

  1. 儿童过滤器
  2. 文档访问控制
  3. 安全防火墙
  4. Web 缓存
  5. 反向代理
  6. 内容路由器
  7. 转码器
  8. 匿名者

代理会去往何处

代理服务器的部署

根据不同的用途,代理服务器会部署到不同的位置。

  • 出口代理,可以将代理固定在本地网络的出口点,用于控制本地网络与大型因特网之间的流量。可以是在公司或者大学网络中使用出口代理,提供防火墙保护。

  • 入口代理,代理服务器常被放在 ISP 访问点上,用以处理来自客户的聚合请求,ISP 一般使用缓存代理来储存常用文档的副本,以提高用户的访问和下载速度。

  • 反向代理,通常是部署到网络的边缘,在 Web 服务器之前,作为替代源服务器。

  • 网络交换代理,可以将具有足够处理能力的代理放在网络之间的因特网对等交换点上,通过缓存来缓解网络节点的拥塞。

代理的层次结构

代理的层次结构中的代理服务器被赋予了 父 和 子 的关系。下一个入口代理(靠近服务器的)的被称为父代理,下一个出口代理被称为子代理。

Image text

上图中的代理层级结构是静态的,代理1报文转发给代理2,代理2给代理3。

下面介绍下,代理的动态层次。

Image text

来些动态层次的例子:

  1. 负载均衡,子代理可能会根据当父代理上的工作负载级别来决定如何选择一个父代理,来均衡负载。
  2. 地理位置附加的路由,子代理可能会选择负责原服务器所在物理区域的父代理。
  3. 协议/类型路由,子代理可能会根据 URI 将报文转发到不同的父代理和原始服务器上去。
  4. 基于订购的路由,如果发布者为高性能服务额外付费了,它们的 URI 会被转发到大型缓存上去。

代理是如何获取流量的

客户端的通常是直接与 Web 服务器进行通信,如何让 HTTP 的流量首先流入代理了。下面是常见的四种方式:

  1. 修改客户端,Web 客户端比如浏览器,都支持手动和自动的配置代理。
  2. 修改网络,网络基础设施可以通过若干技术手段,早客户端不知道的情况下,拦截网络流量将其导入代理。
  3. 修改 DNS 的命名空间,反向代理服务器-替代物,会直接扮演 Web 服务器的名字和 IP 地址,这样,所用的请求就会发送的替代物。
  4. 修改 Web 服务器,重定向到其他服务器。

与代理请求有关的一些棘手问题

代理 URI 与服务器 URI 的不同

除了了这一点之外,Web 服务器报文和 Web 代理报文的语法是一样的。客户端向服务器发送请求时,请求行中只包含部分 URI(没有方案、主机、端口),如下例所示:

GET /index.html HTTP/1.0
User-Agent: SuperBrowser v1.3

但当客户端向代理发送请求时,请求行中则包含完全的 URI:

GET http:/test.com/index.html HTTP/1.0
User-Agent: SuperBrowser v1.3

因为在原始的设计中,客户端和服务器直接进行对话,不存在代理。所以为了避免冗余信息,客户端只需发送部分 URI 即可,无需方案、主机、端口。 代理出现之后,使用部分 URI 就有问题了。代理需要知道目标服务器的名称,这样它才能与服务器建立连接。

与虚拟主机一样的问题

代理服务器 “缺少方案、主机、端口” 的问题与虚拟主机 Web 服务器面临的问题相同。

解决方案是:显示的代理要求在请求报文中使用完整 URI 来解决这个问题

拦截代理会收到部分 URI

客户端并不知道有代理服务器的存在,所以在请求中不包含完整的 URI。

代理即可以处理代理请求,也可以处理服务器请求

由于将流量重定向到代理服务器的方式有所不同,通用的代理服务器既应该支持请求报文中的完整 URI,也应该支持部分 URI。如果是显式的代理请求,代理就应该使用完整的 URI,如果是 Web 服务器请求,就应该使用部分 URI 和虚拟 Host 首部。

追踪报文

Via 首部

Via 首部字段列出了与报文途径的每个节点(代理、网关)有光的信息。

Via 语法:

Via = 1.1 cache.joes..... , 1.1 proxy.irenes......

  1. 协议名,如果协议名是 HTTP ,那就是可选的,否则就要在版本前面加上协议名,中间用 “/” 分隔。
  2. 协议版本
  3. 节点名
  4. 节点注释

TRACE 方法

在 HTTP/1.1 的 TRACE 方法,用户可以跟踪经过代理传输的请求报文,观察报文经过了哪些代理,以及每个代理的如何对请求报文进行修改的。当 TRACE 请求到达目标服务器是,整体请求报文会封装到一条 HTTP 响应中,返回给客户端。客户部拿到响应报文可以检查经过的代理列表(Via 首部中)