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 首部,以便精细地调整缓存查询 | 从兄弟代理或父代理缓存中获取内容比从原始服务器上获取快 |