人们已经从只在网上发送静态的在线文档,发展到共享更复杂的资源,比如数据库内容或动态生成的HTML页面。本章简要介绍了一些开发者用HTTP访问不同资源的方法,展示了开发者如何将HTTP作为框架启动协议和应用程序通信。
主要内容:
在HTTP和其他协议及应用程序之间起到接口作用的网关;
允许不同类型的web应用程序互相通信的应用程序接口
允许用户在HTTP连接上发送非HTTP流量的隧道
作为一种简化的HTTP代理,一次将数据转发一跳的中继
8.1 网关
单个应用程序无法处理所有这些能想到的资源。为了解决这个问题,开发者提出了网管的概念,网关可以作为某种翻译器使用,他抽象了一种能够到达资源的方法。
应用程序可以(通过HTTP或其它已定义的协议)请求网关来处理某条请求,网关可以提供一条响应。网关可以向数据库发送查询语句,或者生成动态的内容,就像一个门一样:进去一条请求,出来一个响应。
有些网关会自动将HTTP流量转换为其他协议,这样HTTP客户端无需了解其它协议就可以和其他应用程序进行交互了。
客户端和服务器端网关
Web网关在一侧使用HTTP协议,在另一侧使用另一种协议。
<客户端协议>/<服务器端协议>
服务器端网关(server-side gateway):通过HTTP与客户端对话,通过其他协议与服务器通信(HTTP/).
**客户端网关(client-side gateway)**通过其他协议与客户端对话,通过HTTP与服务器通信(、HTTP)。
8.2 协议网关
如何配置网关,可以手工配置。
8.2.1 HTTP/*:服务器端web网关
请求流入原始服务器时,服务器端网关会将客户端HTTP请求转换成其他协议。比如将HTTP请求转化成FTP请求并获得结果,最后用HTTP将结果返回给客户端。
8.2.2 HTTP/HTTPS:服务器端安全网关
客户端可以用普通的HTTP浏览web内容,但网关会自动加密用户的对话。
8.2.3 HTTPS/HTTP客户端安全加速器网关
它们接收安全的HTTPS流量,对安全流量进行解密,并向Web服务器发送普通HTTP请求。
8.3 资源网关
最常见的网关–应用程序服务器,会将目标服务器与网关结合在一个服务器中实现。应用程序服务器是服务器端网关,与客户端通过HTTP进行通信,并与服务器端的应用程序相连。
应用程序服务器可以将HTTP客户端连接到任意后台应用程序。
第一个流行的应用程序网关API就是通用网关接口(Common Gateway Interface, CGI )。CGI是一个标准接口集,Web服务器可以用它来装载程序以响应对特定URL的请求,并收集程序的输出数据,将其放在HTTP响应中回送。
8.3.1 CGI
CGI是第一个,可能仍然是得到最广泛使用的服务器扩展。在web上广泛应用于动态HTML、信用卡处理以及数据库查询等任务。
CGI应用程序独立于服务器,可以用任意语言来实现。
CGI的处理对用户来说是不可见的。
CGI优缺点,分离的结构导致如果为每条CGI请求引发一个新的进程的开销是很高的,会限制那些使用CGI的服务器的性能。为此,人们开发了新的CGI–快速CGI。这个借口模拟了CGI,但它是作为持久守护进程运行的,消除了为每个请求建立或拆除新进程所带来的性能损耗。
8.3.2 服务器扩展API
服务器开发者提供了几种服务器扩展API,为web开发者提供了强大的借口来提高性能,以便他们将自己的模块与HTTP服务器直接相连。扩展API允许程序员将自己的代码嫁接到服务器上,或者用自己的代码将服务器的一个组件完整地替换出来。
如微软的FPSE(FrontPage 服务器端扩展)。
8.4 应用程序接口和web服务
在两个应用程序之间进行协议接口的协商,以便这些应用程序之间可以进行数据交换。
8.5 隧道
web隧道可以通过HTTP应用程序访问使用非HTTP协议的应用程序。它允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上捎带其他协议数据了。这样这类流量就可以穿过只允许web流量通过的防火墙了。
8.5.1 用CONNECT建立HTTP隧道
web隧道是用HTTP的CONNECT方法建立起来的。CONNECT方法请求隧道网关创建一条到达任意目的服务器和端口的TCP连接,并对客户端和服务器之间的后继数据进行盲转发。
1.CONNECT请求
CONNECT home.netscape.com:443 HTTP/1.0
User-Agent: Mozilla/4.0
2.CONNECT响应
HTTP/1.0 200 Connection Established
Proxy-agent: Netscape-Proxy/1.1
8.5.2 数据隧道、定时及连接管理
管道化数据对网关是不透明的,所以网关不能对分组的顺序和分组流做任何假设。一旦隧道建立起来了,数据就可以在任意时间流向任意方向了。
8.5.3 SSL隧道
最初开发web隧道是为了通过防火墙传输加密的SSL流量。隧道会通过一条HTTP连接来传输SSL流量,以穿过端口80的HTTP防火墙。
这项特性可能会被滥用,使得恶意协议通过HTTP隧道流入某个组织内部。
8.5.4 SSL隧道与HTTP/HTTPS网关的对比
对于SSL隧道来说,无需在代理中实现SSL。SSL会话是建立在产生请求的客户端和目的(安全的)Web服务器之间的,中间的代理服务器只是将加密的数据经过隧道传输,并不在安全事务中扮演其他角色。
8.5.5 隧道认证
结合了代理的认证机制和隧道,对客户端使用隧道的权利进行认证。
8.5.6 隧道的安全性考虑
总的来说,隧道网关无法验证目前使用的协议是不是就是它本来打算经过隧道传输的协议。为了降低对隧道的滥用,网关应该职位特定的知名端口,如HTTPS的端口443打开隧道。
8.6 中继
HTTP中继(relay)是没有完全遵循HTTP规范的简单HTTP代理。中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。
因此会产生keep-alive导致的请求挂起问题。