20.3 重定向协议概览

重定向的目标是尽快地将 HTTP 报文发送到可用的 Web 服务器上去。在穿过因特网的路径上,HTTP 报文传输的方向会受到 HTTP 应用程序和报文经由的路由设备的影响,参见以下示例。

  • 配置创建客户端报文的浏览器应用程序,使其将报文发送给代理服务器。

  • DNS 解析程序会选择用于报文寻址的 IP 地址。对不同物理地域的不同客户端来说,这个 IP 地址可能不同。

  • 报文经过网络传输时,会被划分为一些带有地址的分组;交换机和路由器会检查分组中的 TCP/IP 地址,并据此来确定分组的发送路线。

  • Web 服务器可以通过 HTTP 重定向将请求反弹给不同的 Web 服务器。

浏览器配置、DNS、TCP/IP 路由以及 HTTP 都提供了重定向报文的机制。注意,有些方法,比如浏览器配置,只有在将流量重定向到代理的时候才有意义,而其他一些方法(比如 DNS 重定向),则可用于将流量发送给任意服务器。1

1:DNS 也不能随便重定向,目标 IP 地址的服务器上没有托管所需的虚拟主机的话,就和浏览器代理配错一样,毫无意义。(译者注)

表 20-1 总结了用来将报文重定向到服务器的重定向方法,本章稍后逐一讨论每种方法。

表20-1 通用的重定向方法

机  制 工作方式 重新路由的基础 局 限 性
HTTP 重定向 最初,HTTP 请求先到第一台 Web 服务器,这台服务器会选择一台“最佳”的 Web 服务器为其提供内容。第一台 Web 服务器会向客户端发送一条到指定服务器的 HTTP 重定向。客户端会将请求重新发送到选中的服务器上 选择最短路径时可用的选项很多,包括轮转(round-robin)负载均衡和最小化时延等 可能会很慢——每个事务都包含了附加的重定向步骤。而且,第一台服务器一定要能够处理请求负载
DNS 重定向 DNS 服务器决定在 URL 的主机名中返回多个 IP 地址中的哪一个 选择最短路径时可用的选项很多,包括轮转(round-robin)负载均衡和最小化时延等 需要配置 DNS 服务器
任播寻址 几台服务器使用相同的 IP 地址。每台服务器都会伪装成一个骨干路由器。其他路由器会将共享 IP 地址分组发送给最近的服务器(认为它们将分组发送给最近的路由器) 路由器有内建的最短路径路由功能 需要拥有 / 配置路由器。有地址冲突的风险。如果路由变化了,与已建立的 TCP 连接相关的分组会被发送到其他的服务器,可能会使 TCP 连接断裂
IP MAC 转发 交换机或路由器这样的网元会读取分组的目的地址。如果应该将分组重定向,交换机会将服务器或代理的目标 MAC 地址赋予分组 节省带宽,提高QOS。负载均衡 服务器或代理的跳距必须是1
IP 地址转发 第四层交换机会评估分组的目的端口并将重定向分组的 IP 地址改成代理或镜像服务器的 IP 地址 节省带宽,提高QOS。负载均衡 服务器或代理可能看不到真正的客户端 IP 地址

表 20-2 总结了将报文重定向到代理服务器的重定向方法。

表20-2 代理与缓存重定向技术

机  制 工作方式 重新路由的基础 局 限 性
显式浏览器配置 配置 Web 浏览器,使其将 HTTP 报文发送给附近的一个代理,通常是缓存。可以由终端用户或管理浏览器的服务进行配置 节省带宽,提高 QoS。负载均衡 取决于配置浏览器的能力
代理自动配置(PAC) Web 浏览器从配置服务器中解析出PAC 文件。这个 PAC 文件会告诉浏览器为每个 URL 使用什么代理 节省带宽,提高 QoS。负载均衡 必须配置浏览器,使其去查询配置服务器
Web Proxy 代理自动发现协议(WPAD) Web 浏览器向配置服务器查询一个 PAC 文件的URL。与单独使用 PAC 不同,不需要将浏览器配置为使用特定的配置服务器 配置服务器,将 URL 建立在客户端 HTTP 请求首部提供的信息之上。负载均衡 只有部分浏览器支持 WPAD
Web 缓存协调协议(WCCP) 路由器会评估一个分组的目的地址,并用代理或镜像服务器的 IP 地址将重定向分组封装起来。可以与很多现有路由器共同工作。可以将分组封装起来,这样客户端的 IP 地址就不会丢失了 节省带宽,提高 QoS。负载均衡 必须使用支持 WCCP 的路由器。有些拓扑结构方面的限制
因特网缓存协议(ICP) 代理缓存会在一组兄弟代理缓存中查询所请求的内容。还支持缓存的分层结构 从兄弟代理或父代理缓存中获取内容比从原始服务器中获取更快 请求内容时只使用了 URL,所以会降低缓存命中率
缓存分组路由协议(CARP) 一种代理缓存散列协议。允许缓存将请求转发给一个父缓存。与 ICP 不同的是,高速缓存上的内容是不相交的,这组缓存会像一个大型缓存那样工作 从附近的对等高速缓存中获取内容要比从原始服务器上获取快 CARP 无法支持兄弟关系。所有 CARP 客户端都必须在配置上达成一致;否则,不同的客户端就会向不同的父代理缓存发送相同的URI,降低命中率
超文本缓存协议(HTCP) 参与的代理缓存可以向一组兄弟缓存查询所请求的内容。支持 HTTP 1.0 和 1.1 首部,以便精细地调整缓存查询 从兄弟代理或父代理缓存中获取内容比从原始服务器上获取快