5月阅读周·HTTP权威指南:重定向与负载均衡之Web代理自动发现协议篇
引言
HTTP(Hypertext Transfer Protocol,超文本传输协议)是在万维网上进行通信时所使用的协议方案。HTTP有很多应用,但最著名的是用于Web浏览器和Web服务器之间的双工通信。
《HTTP权威指南》一书将HTTP中一些互相关联且常被误解的规则梳理清楚,并编写了一系列基于各种主题的章节介绍HTTP各方面的特性。纵观全书,对HTTP“为什么”这样做进行了详细的解释,而不仅仅停留在它是“怎么做”的。此外,这本书还介绍了很多HTTP应用程序正常工作所必需且重要的非HTTP技术。
这本书主要包括以下内容:
- 第一部分描述了Web的基础构件与HTTP的核心技术
- 第二部分重点介绍了Web系统的结构构造块:HTTP服务器、代理、缓存、网关以及机器人应用程序。
- 第三部分提供了一套用于追踪身份、增强安全性以及控制内容访问的技术和技巧。
- 第四部分涵盖HTTP报文主体和Web标准,前者包含实际内容,后者描述并处理主体内容。
- 第五部分介绍了发布和传播Web内容的技巧。
- 第六部分是一些很有用的参考附录,以及相关技术的教程。
重定向与负载均衡
Web代理自动发现协议
WPAD(Web代理自动发现协议)的目标是在不要求终端用户手工配置代理设置,而且不依赖透明流量拦截的情况下,为Web浏览器提供一种发现并使用附近代理的方式。由于可供选择的发现协议有很多,而且不同浏览器的代理使用配置也存在差异,因此定义Web代理自动发现协议时,普通的问题会被复杂化。本节包含了一个经过缩略,且重新组织过的WPAD因特网草案版本。现在,这个草案是作为IETF的Web中间人工作组的一部分开发的。
1.PAC文件自动发现
WPAD允许HTTP客户端定位一个PAC文件,并使用这个PAC文件找到适当的代理服务器的名字。WPAD不能直接确定代理服务器的名字,因为这样就无法使用PAC文件提供的附加功能了(负载均衡,请求路由到一组服务器上去,故障时自动转移到备用代理服务器等)。
WPAD协议发现了PAC文件URL,这个URL也被称为配置URL(CURL)。PAC文件执行了一个JavaScript程序,这个程序会返回合适的代理服务器地址。
实现WPAD协议的HTTP客户端:
· 用WPAD找到PAC文件的CURL;
· 根据这个CURL获取PAC文件(又名配置文件或CFILE);
· 执行PAC文件来确定代理服务器;
· 向PAC文件返回的那个代理服务器发送HTTP请求。
2.WPAD算法
WPAD使用了一系列资源发现技术来确定适当的PAC文件CURL。并不是所有的组织都可以使用所有技术的,所以WPAD指定了多种发现技术。在成功获得CURL之前,WPAD客户端会一个个地尝试每种技术。
当前的WPAD规范按序定义了下列技术:
· DHCP(动态主机配置协议);
· SLP(服务定位协议);
· DNS知名主机名;
· DNS SRV记录;
· DNS TXT记录中提供的服务URL。
在这5种机制中,要求WPAD客户端必须支持DHCP和DNS知名主机名技术。
WPAD客户端会按顺序用上面提供的发现机制发送一系列资源发现请求。客户端只会尝试它们所支持的机制。只要某次发现尝试成功了,客户端就会用得到的信息来构建PAC CURL。
如果从那个CURL上成功获取到PAC文件,这个过程就结束了。如果没有,客户端就从它在预定义的资源发现请求系列里中断的地方开始恢复。如果尝试了所有的发现机制之后,都没有获取到PAC文件,WPAD协议就失败了,客户端会配置为不使用代理服务器。
客户端首先会尝试DHCP,然后是SLP。如果没有获取到PAC文件,客户端会继续执行那些基于DNS的机制。
客户端会在DNS SRV、知名主机名和DNS TXT记录等方法中循环多次。每次都使DNS查询的QNAME变得越来越不具体。通过这种方式,客户端就可以定位出尽可能具体的配置信息,但也可能会转而使用一些不太具体的信息。每次DNS查找都会在QNAME前加上wpad,用以说明请求的资源类型。
考虑主机名为johns-desktop.development.foo.com的客户端。下面是一个完整的WPAD客户端会执行的发现尝试顺序:
· DHCP;· SLP;· 用QNAME=wpad.development.foo.com进行DNS A查找;
· 用QNAME=wpad.development.foo.com进行DNS SRV查找;
· 用QNAME=wpad.development.foo.com进行DNS TXT查找;
· 用QNAME=wpad.foo.com进行DNS A查找;
· 用QNAME=wpad.foo.com进行DNS SRV查找;
· 用QNAME=wpad.foo.com进行DNS TXT查找。
说明整个操作过程的详细伪代码请参见WPAD规范。
3.用DHCP进行CURL发现
要使用这种机制,就必须将CURL存储在WPAD客户端可以查询的DHCP服务器上。WPAD客户端可以通过向DHCP服务器发送DHCP查询来获取CURL。(如果DHCP服务器中配置了这种信息,)就可以在DHCP可选代码252中获取CURL。所有WPAD客户端实现都必须支持DHCP。RFC 2131详细介绍了DHCP协议。现存的DHCP选项列表参见RFC 2132。
如果WPAD客户端已经在其初始化过程中执行了DHCP查询,DHCP服务器可能就已经提供了那个值。如果无法通过客户端OS API获得这个值,客户端就向DHCP服务器发送一条DHCPINFORM报文,以获取这个值。
WPAD的DHCP可选代码252为STRING类型,可以是任意长度。这个字符串中包含了一个指向适当PAC文件的URL。比如:
"http://server.domain/proxyconfig.pac"
4.DNS A记录查找
要让这种机制工作,就必须将合适的代理服务器的IP地址存储在WPAD客户端可以查询的DNS服务器上。WPAD客户端会向DNS服务器发送一个A记录查询,以获取CURL。成功查询的结果中会包含合适的代理服务器的IP地址。
WPAD客户端实现必须支持这种机制。这应该是很简单的,因为它只要求基本的DNS A记录查找。用知名DNS别名进行资源发现的详细过程请参见RFC 2219。对WPAD来说,规范使用了“wpad”的“知名别名”来进行Web代理自动发现。
客户端执行了下列DNS查找:
QNAME=wpad.TGTDOM., QCLASS=IN, QTYPE=A
成功的查找中包含了IP地址,WPAD客户端根据这个地址构建CURL。
5.获取PAC文件
只要创建了候选的CURL, WPAD客户端通常都会向CURL发送一条GET请求。发出请求时,WPAD客户端必须要发送一些带有适当CFILE格式信息的Accept首部,这些CFILE格式都是它们所能处理的。比如:
Accept: application/x-ns-proxy-autoconfig
而且,如果CURL的结果是要进行重定向,客户端就必须跟随这些重定向到其最终目的地。
6.何时执行WPAD
至少要在出现以下情况的时候进行Web代理自动发现。
· 在Web客户端启动的时候——WPAD只在第一个实例启动的时候执行。后面的实例会继承这种设置。
· 只要有来自网络栈的通知,就说明客户端主机的IP地址改变了。
哪个选项在其环境中有意义,Web客户端就可以选择哪个。而且,客户端还必须根据HTTP的过期时间,为之前下载的PAC文件的过期时间尝试一个发现周期。PAC文件过期时,客户端遵循过期时间,重新运行WPAD过程是很重要的。
如果PAC文件没有提供替换方案,在当前配置的代理失效的情况下,客户端还可以选择重新运行WPAD过程。
只要客户端决定使当前的PAC文件失效,就必须重新运行整个WPAD协议,以确保它会发现当前正确的CURL。具体来说,就是协议不能有条件地获取PAC文件的If-Modified-Since。
WPAD协议广播与/或多播通信可能需要大量的网络环回时间。WPAD协议的激活频率不应该高于上面指定的频率(比如在每次获取URL时进行一次)。
7.WPAD欺骗
WPAD的IE 5实现允许Web客户端在没有用户干预的情况下,自动检测代理设置。WPAD使用的算法会在全称域名前加上主机名“wpad”,并会逐渐删除子域名,直到它找到能够响应主机名的WPAD服务器,或到达第三级域名。比如,域a.b.microsoft.com中的Web客户端会先查询wpad.a.b.microsoft、wpad.b.microsoft.com,然后再查询wpad.microsoft.com。
这样会暴露出一个安全漏洞,因为在国际应用(及其他特定的配置)中,第三级域名可能是不可信的。恶意用户可以建立一个WPAD服务器,并提供他选中的代理配置命令。后继(5.01及以后)的IE版本修正了这个问题。
8.超时
WPAD会经过多个级别的发现,客户端必须确保每个阶段都有时限保证。可能的情况下,将每个阶段都限制在10秒以内是比较合理的,但实现者可能会选择其他更适合其网络特性的值。比如,运行在无线网络上的设备实现,由于带宽较低或时延较长,可能就会使用更大的时限。
9.管理者的考虑
管理者至少应该在其环境中配置DHCP或DNS A记录查找方式中的一种,因为只有这两种方式是所有兼容客户端都必须实现的。除此之外,通过配置环境使其支持搜索列表中顺序靠前的机制,可以缩短客户端的启动时间。
使用这种协议结构的主要动力之一是支持客户端定位附近的代理服务器。在很多环境中,都会有多个代理服务器(工作组、公司网关、ISP、骨干网等)。
在WPAD框架结构中,可以在很多地方确定代理服务器是否“邻近”。
· 不同子网的DHCP服务器会返回不同的答案。还可以根据客户端的cipaddr字段或客户端标识符选项作出决定。· 可以对DNS服务器进行配置,使其为不同的域名后缀(比如,QNAME wpad.marketing.bigcorp.com和wpad.development.bigcorp.com)返回不同的SRV/A/TXT资源记录(RR)。
· 处理CURL请求的Web服务器会根据User-Agent首部、Accept首部、客户端IP地址/子网/主机名、附近代理服务器的拓扑分布等作出决定。可能由处理CURL的CGI可执行文件进行这种处理。如前所述,甚至可能是某个处理CURL请求的代理服务器来作出这些决定。
· PAC文件的表达能力可能足以在客户端运行时从一组候选的代理服务器中进行选择。CARP就是在此基础上实现缓存阵列的。PAC文件可以计算出到一组候选代理服务器的网络距离(或其他合理的度量方式),并选择“最近”或“响应最积极”的服务器,这并不是什么不可思议的事情。
总结
HTTP并不是独自运行在网上的。很多协议都会在HTTP报文的传输过程中对其数据进行管理。HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器、Web代理和缓存的网络世界中,HTTP报文的目的地不一定是直接可达的。
重定向技术涉及网络工具、重定向技术细节以及判定HTTP报文最终目的地的协议。重定向技术通常可以用来确定报文是否终结于某个代理、缓存或服务器集群中某台特定的服务器。重定向技术可以将报文发送到客户端没有显式请求的地方去。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)