在因特网上,要与很多Web应用程序警醒交互,其中有些比较重要的应用程序,如:HTTP服务器、代理、缓存、网关、隧道、Agent代理、中继等。
Web服务器
Web开发人员接触最多的应该是Web服务器,它实现了HTTP和相关的TCP连接处理,又复杂的服务器也有简单的web服务器,但他们执行了同样的任务:建立连接-接受请求-处理请求-访问资源-构建响应-发送响应-记录事务处理过程。
Web服务器在接受请求报文时,不同的Web服务器结构会以不同的方式为请求服务,有如下几种服务器:
单线程Web服务器:一次只处理一个请求,一个事务处理完后采取处理下一个请求。
多进程及多线程Web服务器:为每个连接分配一个线程/进程,会消耗太多内存资源,很多线程web服务器会对线程/进程的最大数量进行限制。
复用I/O的服务器:为支持大量连接,很多web服务器采用此结构,在复用结构中,同时监视所有连接上的活动,当连接状态变化(有数据,或错误),就对那条连接分配线程处理,处理完成后,将连接返回到连接列表中,在空闲连接上不会绑定线程或进程。
复用的多线程Web服务器:将多线程和复用结合在一起。
代理
HTTP代理服务器既是Web服务器又是Web客户端,称为Web的中间实体,代理用途很广,比如儿童过滤器、文档访问控制、安全防火墙、Web缓存、反向代理(假扮Web服务器,代理收发给Web服务器的请求,与web服务器不同,它可以发起与其他服务器的请求,以便按需定位所请求的内容)、内容路由器、转码器、匿名者(从报文删除身份信息,提供私密性)。
根据代理目标用途,可以将代理放在任意位置,如:
出口代理:固定在本地网络出口点,控制本地与外部网络流量,防止恶意黑客攻击。
访问(入口)代理:放在ISP访问点上,用以处理来自客户的聚合请求。ISP使用缓存代理来存储常用文档的副本,以提高下载速度。
反向代理:部署在网络边缘,在web服务器之前,通常会直接冒用web服务器的名字和ip地址,这样所有的请求就会被发送给代理,他会处理所有请求,并只在必要时想web服务器请求资源。
网络交换代理:将具有足够处理能力的代理放在网络之间的因特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监视。
那如何将流量导向代理呢?有四种方式:修改客户端(修改浏览器设置)、修改网络(监视HTTP流量的交换设备及路由设备,对其拦截,然后将流量导入代理)、修改DNS的命名空间(如反向代理,直接编辑DNS,将代理假扮为Web服务器)、修改Web服务器(配置服务器,将接受的请求,重定向至代理)。
一般查看一个请求经过了多少代理,可从via首部获悉相关信息,如:
Via:1.1 proxy-62.irenes-isp.net,1.0cache.joes-hardware.com
表示经过了两个代理,响应报文和请求报文的顺序正好相反。Via也会记录协议的转换,比如有些代理会为非HTTP协议的服务器提供网关功能,如下:
Via:FTP/1.o proxy.irenes-isp.net (Traffic-Server/5.0.1-17882[cMs f ])
还有我们之前说过的TRACE方法,可以便捷的观察在通过HTTP代理网络逐跳转发报文的过程中,报文是怎么样变化的。
缓存
Web缓存是可以自动保存常见文档副本的HTTP设备,是HTTP的仓库,是常用页面的副本保存在离客户端更近的地方。当web请求滴答缓存时,如果本地有“已缓存”副本,就可以从本地存储设备而不是原始服务器中提取这个文档。代理缓存一般有层次结构,一级缓存、二级缓存等,一般大部分用户都希望命中一级缓存,但如果没有则较大的二级缓存会处理请求,除了这种比较简单的还有网状缓存、内容路由一级对等缓存。
缓存一般的处理过程是:接受-解析-查询-新鲜度检测-创建响应-发送-日志。因为是缓存,因此会存在副本过期的情况,一般是通过HTTP特殊的Cache-Control首部和Expires首部,HTTP让院士服务器想每个文档附加了一个“过期日期”,由于Cache-Control使用的是相对时间,所以更倾向于使用它。
仅仅是已缓存文档过期了并不意味着它和原始服务器上目前处于活跃状态的文档有实际的区别,这意味着要进行核对的工作,这种称之为“服务器再验证”,来说明缓存是否需要更新。用条件方法可以有效进行再验证,缓存向服务器发送一个“条件GET”,请求服务器只有与缓存不一致才会返回现有副本,对缓存再验证最有用的两个首部是If-Modified_since和If-None-Match。
服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先递减的顺序,服务器可以附加一个首部到响应中去:Cache-Contorl:no-store;Cache-Contorl:no-cache; Cache-Contorl:must-revalidate;max-age;Expires,具体首部用法就不一一解释了。不同的Web服务器为HTTPCache-Control和Expiration首部的设置提供了一些不同的机制,详细的设置可百度。