与http协作的web服务器

1、虚拟主机

  一台web服务器可以搭建多个独立域名的web网站,也可以作为通信线路上的中转服务器提升传输效率。比如web托管服务供应商可以用一台服务器为多个不同域名的客户提供服务,这是利用了虚拟主机(virtual host,又称虚拟服务器)的功能。在发送http请求时,必须在Host首部内完整指定主机名或域名的URI,以确定要请求的web网站。

2、代理

  通信数据转发程序:代理、网关、隧道、中继。

  如下图,转发“客户端”和“服务器”之间的数据,使用代理服务器可以利用其缓存技术减少网络带宽流量,也可以控制内部对特定网站的访问。每次通过代理服务器转发请求或响应时,会追加写入via首部信息。代理不改变请求的URI,它直接发送给前方的目标服务器。转发时不对报文做任何加工则为透明代理,否则为非透明代理。

  

  代理服务器或客户端本地保存的资源副本称为缓存,缓存服务器是代理服务器的一种。即使存在缓存,也会因为缓存的有效期、客户端的要求等因素,向服务器确认资源的有效性。

3、网关

  网关工作机制与代理类似,但网关提供了http协议和其它协议之间的转换。可以将网关可以分为“协议网关”和“资源网关”。

  “协议网关”(如下图)主要有:http/ftp输入转换网关、http/pop网关、https/http安全加速器网关(通常作为拦截网关或反向代理使用,这种网关通常都包含专用的解密硬件,其解密速度比普通的https服务器要快,这样也可以减轻web服务器的负荷,网关与web服务器之间的网络应该确保是安全的,比如是受保护的内部LAN)、http/https输入安全网关(一个组织可以通过网关对普通的http请求加密,以提供额外的隐私和安全保护)。

  

  

  

  

  资源网关主要有“数据库网关”和“应用程序服务器”(如下图)。数据库网关:客户端通过http协议向服务器发送请求,当请求数据库资源的时候服务器与网关进行交互以获取资源,网关可以连接数据库,向数据库发送查询语句。应用程序服务器:将目标服务器和网关结合在一起的服务器,应用程序服务器(作为目标服务器)与客户端通过http通信,(作为网关)并与服务器端的应用程序相连。通用网关接口(Common Gateway Interface, CGI)是一个流行的应用程序网关API,CGI在Web上广泛用于数据库査询、信用卡结算处理、动态HTML等任务,CGI应用程序独立于服务器,几乎可以用任意语言来实现。

  

4、隧道

  Web隧道允许用户通过HTTP连接发送非HTTP流量,这样就可以在HTTP上捎带其他协议数据了。使用Web隧道最常见的原因就是要在HTTP连接中嵌入非HTTP流量,这样,这类流量就可以穿过只允许Web流量通过的防火墙了。HTTP 隧道的一种常见用途是通过 HTTP 连接承载加密的安全套接字层(SSL,Secure Sockets Layer) 流量, 这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了。

  比如,在一个网络中,防火墙禁止端口443上的连接,因此网络中的用户无法访问使用HTTPS协议的网站。但是,防火墙允许端口80上的连接。网络中的用户想要访问该服务器有两种方法:一种是使用http/https输入安全网关,一种是通过HTTP隧道。使用网关的方法有三个缺点:客户端到网关之间的连接是普通的非安全HTTP;客户端无法对远端服务器执行SSL客户端认证;网关要支持完整的SSL实现。使用隧道的话SSL流量被封装到一条HTTP报文中,并通过HTTP端口80上的连接发送, 最后被解封为普通的SSL流量。  使用隧道协议的流程是客户端发送一条CONNECT请求给网关请求打开一条TCP连接(在这里,打开的是到目标主机的标准SSL端口443的连接),一旦建立了TCP连接,网关就会发送一条HTTP 200 Connection Established响应来通知客户端;此时,隧道就建立起来了。如下图:

    

  

   前面描述了一条SSL隧道,其中的SSL流量是在一条HTTP连接上发送的,通过CONNECT方法可以与使用任意协议的任意服务器建立TCP连接。一些喜欢捣乱的用户可能会通过本打算用于SSL的隧道越过公司防火墙传递因特网游戏流量,而恶意用户可能会用隧道打开Telnet会话,或用隧道绕过公司的E-mail扫描器来发送E-mail。为了降低对隧道的滥用,网关应该只为特定的知名端口,比如HTTPS的端口443打开隧道。

5、中继

  中继负责处理HTTP中建立连接的部分,然后对字节进行盲转发。某些简单盲中继实现中存在的一个常见问题是,它们无法正确处理Connection首部,所以有潜在的挂起keep-alive连接的可能。

  如下图,Web客户端向中继发送了一条包含Connection: Keep-Alive首部的报文,如果可能的话要求建立一条keep-alive连接。客户端等待响应,以确定它要求建立keep-alive信道的请求是否被认可了。中继收到了这条HTTP请求,但它并不理解Connection首部,因此会将报文一字不漏地沿着链路传递给服务器。但Connection首部是个逐跳首部,只适用于单条传输链路,是不应该沿着链路传送下去的。这会导致客户端和服务器建立了长连接后中继器却不知道,它会在收到原始服务器的所有数据后转发给客户端,然后等待原始服务器关闭连接,这样,中继就会挂起,客户端再次在这条连接上发送请求的话,中继不会去理睬。

  

  要为某个特定目标构建简单的HTTP中继,一定要特别注意其使用方法。对任何部署来说,都要非常认真地考虑使用真正的、完全遵循HTTP的代理服务器。

  

  以上内容转载和参考自:代理、网关与隧道,https://blog.csdn.net/sjailjq/article/details/82287345

                                          前端学HTTP之网关、隧道和中继,https://www.cnblogs.com/xiaohuochai/p/6180941.html

原文地址:https://www.cnblogs.com/milanleon/p/10208482.html