本章主要介绍网关、隧道、中继。都是属于通过HTTP访问不同资源的实现方法。
1 网关
网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法。网关是资源和应用程序之间的粘合剂。
有些网关会自动将 HTTP 流量转换为其他协议,这样 HTTP 客户端无需了解其他协议,就可以与其他应用程序进行交互了,如下图所示:
一般来说,Web网关在一侧使用HTTP协议,另一侧使用其他协议,可以使用一个斜杠(/)来分割客户端和服务端的协议,如下:
客户端协议/服务端协议
我们用术语服务器端网关和客户端网关来说明对话是在网关的哪一侧进行的。
- 服务器端网关:通过HTTP与客户端进行对话,用其他协议与服务器进行对话
- 客户端网关:通过其他协议与客户端进行对话,用HTTP协议与服务器进行对话
下面介绍常用的两种网关——协议网关和资源网关
1.1 协议网关
协议网关就是如其名字所说,主要用于协议转换的,比如将HTTP协议转为FTP协议进行文件资源获取。常见的如下几种:
- 服务器端Web网关(HTTP/*):请求流入原始服务器时,服务器端 Web 网关会将客户端 HTTP 请求转换为其他协议。如下图,收到一个对FTP资源的HTTP请求的处理。
- 服务器端安全网关(HTTP/HTTPS):一个组织可以通过网关对所有的输入 Web 请求加密,以提供额外的隐私和安全性保护。客户端可以用普通的 HTTP 浏览 Web 内容,但网关会自动加密用户的对话
- 客户端安全网关(HTTPS/HTTP):这些 HTTPS/HTTP 网关位于 Web 服务器之前,通常作为不可见的拦截网关或反向代理使用。它们接收安全的 HTTPS 流量,对安全流进行解密,并向服务器发送HTTP请求。
1.2 资源网关
除了上面说的协议网关,常见的另一种网关是资源网关。该种网关是一种应用程序服务器,该网关同客户端通过HTTP进行通信,同时服务器应用程序相连。如:
两个客户端是通过 HTTP 连接到应用程序服务器的。但应用程序服务器并没有回送文件,而是将请求通过一个网关应用编程接口(Application Programming Interface,API)发送给运行在服务器上的应用程序。
较早的一个应用程序网关API就是通用网关接口(Common Gateway Interface,CGI)。只是现在用的没有那么多了,现在大多数使用java语言实现的服务器使用Servlet技术较多。
2 隧道
说完网关,接着说我们第二个重要的概念呢,Web隧道(Web tunnel)。通过隧道也可以达到使用HTTP协议访问非HTTP协议的应用程序。
Web 隧道允许用户通过 HTTP 连接发送非 HTTP 流量,这样就可以在 HTTP 上捎带其他协议数据了。使用 Web 隧道最常见的原因就是要在 HTTP 连接中嵌入非 HTTP 流量,这样,这类流量就可以穿过只允许 Web 流量通过的防火墙了。
2.1 建立隧道
可以通过用 HTTP 的 CONNECT 方法建立Web隧道。CONNECT 方法虽然不是 HTTP/1.1 核心规范的一部分,但是却得到了广泛的使用。CONNECT方法可以创建一条道任务服务器和端口的TCP连接,在建立起隧道后,隧道就会对服务器和客户端之间的数据进行盲转发。
CONNECT方法请求语法格式如下:
CONNECT home.netscape.com:443 HTTP/1.0
其和普通的HTTP方法差不多,只是将后面的URL替换成了一个主机名:端口号
格式的数据。
CONNECT的响应也同HTTP普通方法差不多,建立成功则返回200的状态码,只是后面的message一般显示为“Connection Established”。
HTTP/1.0 200 Connection Established
一条隧道的建立的整个过程如下图所示:
2.2 数据隧道和连接管理
隧道一旦建立起了,数据就可以在任意时间流向任意方向。隧道的两端必须做好任意时间接收数据的准备,并且需要将数据立即转发出去。因为隧道仅仅是进行数据的转发,对于数据之间的关系和顺序不能做任何假设和干预,而且有可能转发的数据之间存在有依赖关系,所以隧道不能忽略任何数据,而且要按照原顺序做及时转发,否则可能出现数据问题。如果数据的消费端出现数据消耗不足,就可能造成生成者这端的挂起。
为了提高CONNECT的效率,作为一种优化,允许客户端在发送完CONNECT请求之后,收到响应之前,先进行隧道数据的发送,但是前提是网关要能正确处理这一数据。同时我们的客户端在收到连接请求的响应如果不是200(但是不是一些致命错误),需要准备好重试的准备。
2.3 SSL隧道
SSL协议,其信息是加密的,虽然我们一般可以通过443端口直接进行SSL连接,但是无法通过传统的有HTTP防火墙的代理服务器转发。这个时候可以利用隧道通过一条 HTTP 连接来传输 SSL 流量,以穿过端口 80 的 HTTP 防火墙。
通过HTTP隧道建立SSL连接的过程如下:
前面在介绍网关的时候,提到客户端可以通过HTTP/HTTPS网关进行与服务器进行SSL会话,这里我们还可以通过隧道的方式进行SSL会话。那这两者有一定区别的:
- HTTP/HTTPS网关:客户端到网关之间的连接是普通的HTTP连接,所以这一段传输是不安全的,另外通过网关同服务器进行SSL认证的,所以我们的网关要支持完整的SSL。
- SSL隧道:这种方实现,HTTP仅仅作为传输了加密数据的作用,中间的代理无需实现SSL,只要转发数据即可,同时SSL会话是建立在客户端和服务器端之间的,所以整个会话的过程也更加安全。
实际使用过程中,我们是可以将两者结合起来使用的,可以对客户端建立隧道的请求进行认证。这样可以避免客户端乱用隧道的情况,如下:
3 中继
HTTP 中继(relay)是没有完全遵循 HTTP 规范的简单 HTTP 代理。中继负责处理 HTTP 中建立连接的部分,然后对字节进行盲转发。
所以中继的优点是实现简单,当我们只是提供一个简单的过滤、诊断或内容转换功能的代理的时候,可以考虑使用中继。但是由于其盲转发的特性,所以会引起很多互操作性的问题(如Connection首部等)。这个问题,在之前介绍代理的时候,已经说过了,这里就不再赘述了。
这篇内容不多,相当于是对前面代理中的一些特殊代理提取出来进行一个简单的介绍。但是本篇介绍的东西,在实际开发中遇到的不多,理解不是很清楚,透彻,所以可能语言组织和描述上有很多问题,甚至有错误的描述,还请谅解。