概述

最近对http很感兴趣,于是开始看《http权威指南》。别人都说这本书有点老了,而且内容太多。我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做,还告诉你为什么这么做。于是我把学到的知识点记录下来,供以后开发时参考,相信对其他人也有用。

缓存

1.缓存有以下优点:

  • 减少了冗余的数据传输,节省了你的网络费用。
  • 缓解了网络瓶颈的问题,不需要更多的带宽就能够更快的加载页面。
  • 降低了对原始服务器的要求,服务器可以更快地响应,避免过载的出现。
  • 降低了距离时延,因为从较远的地方加载页面会更慢一些。

2.可以用已有的副本为某些到达缓存的请求提供服务,这被称为缓存命中;其它一些到达缓存的请求可能会由于没有副本可用,而被转发给原始服务器,这被称为缓存未命中。原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看它们保存的副本是否仍是服务器上最新的副本。

3.缓存对缓存的副本进行再验证时,会向原始服务器发送一个小的再验证请求,如果内容没有变化,服务器会以一个小的304 Not Modified进行相应。只要缓存知道副本仍然有效,就会再次将副本标识为暂时新鲜的,并将副本提供给客户端,这被称为再验证命中缓存命中

4.由于文档并不全是同一尺寸的,所以文档命中率并不能说明一切。有些大型对象被访问的次数可能较少,但由于尺寸的原因,对整个数据流量的贡献却更大,因此有些人更愿意使用字节命中率作为度量值。

5.客户端有一种方法来判断响应是否来自缓存,就是使用Date首部。将响应中Date首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端通常就可以认为这是一条缓存的响应。

6.私有缓存是单个用户专用的,通常内建在web浏览器中;公有缓存是特殊的共享代理服务器。

7.在实际中,缓存实现了层次化。在较小缓存中未命中的请求会被导向较大的父缓存。有些网络会构建复杂的网状缓存,这种代理缓存会决定选择何种路由对内容进行访问、管理和传送,因此可将其称为内容路由器

8.缓存的处理步骤

  1. 接收,从网络中读取抵达的请求报文。
  2. 解析,对报文进行解析,提取出URL和各种首部。
  3. 查询,查看是否有本地副本可用,如果没有,就获取一份副本。
  4. 新鲜度检测,查看已缓存的副本是否足够新鲜,如果不是就询问服务器是否有更新。
  5. 创建响应,用新的首部和已缓存的主体来构建一条响应。
  6. 发送,通过网络将响应发送给客户端。
  7. 日志,可选地创建一个日志文件。

9.缓存不应该调整Date首部,Date首部表示的是原始服务器最初产生这个对象的日期。

10.文档过期:通过http/1.0+的Expires首部和http/1.1的Cache-Control:max-age首部,http让原始服务器向每个文档加了一个过期时间。

11.仅仅是已缓存文档过期了并不意味着它和原始服务器上的文档有什么不同。所以在过期的时候需要服务器再验证,询问原始服务器文档是否发生了变化。

12.所有以“If-”开头的条件首部,都是缓存再验证条件首部。其中最重要的是If-Modified-Since和If-None-Match。

13.有时,服务器希望在对文档进行一些非实质性或不重要的修改时,不要使所有的已缓存副本都失效。HTTP/1.1支持弱验证器,如果只对内容有少量修改,就允许服务器声明那是足够好的等价体。服务器会用前缀“W/”来标识弱验证器。比如:ETAG:W/"v2.6"或者If-None-Match: W/"v2.6"

14.Cache-Conrol:no-store会禁止缓存;Cache-Conrol:no-cache表示可以缓存,但是每次使用缓存前需要进行新鲜度再验证

15.Refresh按钮会发布一个附加了Cache-Control请求首部的GET请求,这个请求会强制进行再验证,或者无条件从服务器获取文档。

16.文档过期系统并不是一个完美的系统,如果发布者不小心分配了一个很久之后的过期日期,那么在文档过期之前,它要对文档所做的所有修改都不会出现在任何缓存中。因此,很多发布者甚至都不使用过期日期。

17.发布广告者的两难处境,虽然缓存有利于更快的显示,但是很多内容提供商的收益都是通过广告实现的,每向用户显示一次广告内容,内容提供商就会获得相应的收益。这就是缓存的问题,如果缓存做的很好,原始服务器根本收不到任何HTTP访问,因为这些访问都被因特网缓存吸收了。所以一般内容提供商都会在内容上加上no-cache首部,让用户每次访问时都与服务器进行再验证。

最新文章

  1. dSYM 文件分析工具
  2. sharepoint 相关<httpHandlers>
  3. Java生成随机验证码
  4. android之服务
  5. JavaScript深入浅出2-表达式和运算符
  6. 【摘自网络】陈奕迅&&杨千嬅
  7. iconfont阿里妈妈前端小图标使用方法详解
  8. -_-#【JS】defer / async
  9. Vijos1352 NOI2006 最大获利 最小权闭合图
  10. Java 装箱、拆箱 包装器
  11. 使用java的wsimport.exe工具生成wsdl的客户端代码
  12. C++面向对象编程初步
  13. MUI——页面的创建、显示、关闭
  14. 1613: [Usaco2007 Jan]Running贝茜的晨练计划
  15. Spring Boot 配置文件详解
  16. 使用控制台对Redis执行增删改查命令
  17. C#设计模式之五原型模式(Prototype Pattern)【创建型】
  18. 深入理解消息中间件技术之RabbitMQ服务
  19. 解决Ubuntu Chrome浏览器很卡不响应的问题
  20. 如何让html中的td文字只显示部分

热门文章

  1. python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出
  2. 201771010134杨其菊《面向对象程序设计(java)》第十七周学习总结
  3. 32. pt-visual-explain
  4. python基础之Day21
  5. python基础之Day14
  6. [AI]SKLearn章1 快速入门
  7. PM学习梳理--搭建产品架构
  8. NOIP刷题建议(未完结)
  9. Effective C++ 笔记:条款 34 实现继承和接口继承
  10. 通过GPLOT过程制作图形