圓梦

激情燃燒的歲月
  博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

新手入门:了解WWW服务与HTTP协议5

Posted on 2007-04-26 10:51  szw104  阅读(331)  评论(0)    收藏  举报
带条件的GET

  Web高速缓存技术通过就近存取先前取得的对象来降低对象检索延迟,减少因特网上的web流量。Web的高速缓存既可以驻留在客户主机中,也可以驻留在中间网络高速缓存服务器主机中。我们将在稍后讨论网络高速缓存,这里只关注客户的高速缓存。

  Web高速缓存在降低用户可感知的响应时间的同时,却引入了一个新的问题——高速缓存中存放的对象的拷贝可能是过期的。换句话说,存放在web服务器中的对象可能己在客户高速缓存下它的一个拷贝之后被修改了。幸运的是,HTTP提供一个专门的机制,使得在允许客户进行高速缓存的同时,仍确保传递给浏览器的所有对象都是最新的。这个机制称为带条件的0ET(conditional GET)。满足条件(1)使用GET方法和(2)包含If-Modified-S1nce:头部的HTTP请求消息就是所谓的带条件的Get消息。

  我们通过查看一个例子来说明带条件的GET如何工作,向服务器请求一个尚未高速缓存的对象:

  GET /fruit/kiwi.gif HTTP/1.0
  User—agent: Mozilla/4.0

  接着,web服务器把带这个对象的一个响应消息发送给客户:

  HTTP/1.0 200 OK
  Date: Thu, 13 Oct 2005 05:33:47 GMT
  Server: Apache/2.0.54 (Unix)
  Last-Modified:Thu, 13 Oct 2005 02:32:47 GMT
  Content-Type:image/gif

  (数据 数据 数据 数据 数据……)

  客户把这个对象显示给用户,同时把它保存在自己的本地高速缓存中客户还随该对象本身高速缓存最后修改日期与时间。一个星期之后,同一个用户请求同一个对象,而该对象仍然存放在高速缓存中。既然web服务器中的该对象有可能已在最近一个星期被修改过,于是浏览器发出一个带条件的GET消息,执行判定高速缓存的对象拷贝是否为最新的检查;

  GET /fruit/kiwi.gif HTTP/1.0
  User—agent: Mozilla/4.0
  If—Modlfied—Since:Thu, 13 Oct 2005 02:32:47 GMT

  其中,If—Modlfied—Since:头部的值就等于一个星期前由服务器发送的Last-Modified:头部的值。这个带条件的GET消息告知服务器,只有在该对象自所指定的时间以来被修改了的前提下才发送它。假设该对象在这段时间内未曾被修改过,那么服务器将发送一个附属体为空的响应消息给客户;

  HTTP/1.0 304 Not Modified
  Date: Thu, 20 Oct 2005 05:33:47 GMT
  Server: Apache/2.0.54 (Unix)

  我们看到,web服务器仍然发送——个响应消息作为带条件的GET消息的响应,不过其中不包含所请求的对象。包含该对象只会浪费带宽,并延长用户可感知的响应时间,特别是在该对象很大的时候。注意,这个响应消息的状态为“304 Not Modified”,它告知客户可以放心使用所请求对象的高速缓存版本。