Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。
Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。
可以配置用户的浏览器,使得用户的所有HTTP请求首先指向Web缓存器。
一旦某浏览器被配置,每个对某对象的浏览器请求首先被定向到该Web缓存器。
举例来说,假设浏览器正在请求对象http://www.someschool.edu/campus.gif,将会发生如下情况:
(1) 浏览器创建一个到Web缓存器的TCP连接,并向Web缓存器中的对象发送一个HTTP请求。
(2) Web缓存器进行检查,看看本地是否存储了该对象副本。如果有,Web缓存器就向客户浏览器用HTTP响应报文返回该对象。
(3) 如果Web缓存器中没有该对象,它就打开个与该对象的初始服务器(即www.someschool.edu)的TCP连接。Web缓存器则在这个缓存器到服务器的TCP连接上发送一个对该对象的HTTP请求。在收到该请求后,初始服务器向该Web缓存器发送具有该对象的HTTP响应。
(4) 当Web缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用HTTP响应报文发送该副本。
值得注意的是Web缓存器既是服务器又是客户。
当它接收浏览器的请求并发回响应时,它是一个服务器。
当它向初始服务器发出请求并接收响应时,它是一个客户。
尽管高速缓存能减少用户感受到的响应时间,但也引入了一个新的问题,即存放在缓存器中的对象副本可能是陈旧的。
换句话说,保存在服务器中的对象自该副本缓存在客户上以后可能已经被修改了。
HTTP协议有一种机制,允许缓存器证实它的对象是最新的。这种机制就是条件GET(conditional GET)方法。
如果:①请求报文使用GET方法;并且②请求报文中包含一个“If-Modified-Since:”首部行。那么, 这个HTTP请求报文就是一个条件GET请求报文。
为了说明GET方法的操作方式,列举一个例子。
首先,一个代理缓存器(proxy cache)代表一个请求浏览器,向某Web服务器发送一个请求报文:
其次,该Web服务器向缓存器发送具有被请求的对象的响应报文:
该缓存器在将对象转发到请求的浏览器的同时,也在本地缓存了该对象。
重要的是,缓存器在存储该对象时也存储了最后修改日期。
最后,一个星期后,另一个用户经过该缓存器请求同一个对象,该对象仍在这个缓存器中。
由于在过去的一个星期中位于Web服务器上的该对象可能已经被修改了,该缓存器通过发送一个条件GET执行最新检查。
具体来说,该缓存器发送:
值得注意的是If-Modified-Since:首部行的值正好等于一星期前服务器发送的响应报文中的Last-Modified:首部行的值。
该条件GET报文告诉服务器,仅当自指定日期之后该对象被修改过,才发送该对象。
假设该对象自2015年9月9日09:23:24后没有被修改。接下来的第四步,Web服务器向该缓存器发送一个响应报文:
作为对该条件GET方法的响应,该Web服务器仍发送一个响应报文,但并没有在该响应报文中包含所请求的对象。
《计算机网络——自顶向下方法》 —— 2 应用层