http Cache-Control: If-None-Match ETag/If-Modifed-Since Last-Modified

这里最终决定采用chunked是为了和长连接[3]配合使用, 省去slow-start ack/congestion window
增加到正常大小的时间,还有3次握手时间(究竟是多少毫秒?)

对原先代码的改造,逻辑上从上到下分层为
file: >0 -- ok, 0 -- eof, -1 -- err, -11 -- eagain.
prepare: 0 -- ok, <0 -- err, >0 -- state change.
transfer: add chunked header and tail
send: using tcp or ssl

If-None-Match ETag:
ETag可以是任意值,比如用作用户标识目的等。
If-None-Match 意思是如果匹配服务端什么都不做,除了发304 Not Modified[1]。
另外304和200一样也要带ETag,Last-Modified。
测试发现"Date -- 服务端当前时间"是不必发的。
另外一定要发: Cache-Control:max-age=0, must-revalidate 不然浏览器不会再次来GET。
max-age=0 -- 有时可以使用过期的,(SHOULD revalidate),比如比赛结果。
no-cache -- 无论如果都不准使用过期的,(MUST revalidate),比如电商交易。
public -- 告诉代理可以缓存,默认是private。
对于文件系统里面的文件,使用Last-Modified;对于数据库查询结果,使用Etag = 内容的md5。

FF浏览器行为:
Firefox 3.5/Squid Cache把no-cache当成no-store。

IE浏览器行为:
IE8 收到https带no-cache响应时,会出现“不能下载”,解决办法就是"max-age=0, must-revalidate"。
Last-Modified 和ETag,只需发一个就行了,但是,IE6
在资源有gzip压缩同时有ETag头时,cache后再次发请求不会带If-None-Match头;如果都发,根据[2],优先使用ETag。
打开新窗口
如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5
表示当访问此网页后的5秒内再次访问不会去服务器
在地址栏回车
如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
按后退按扭
如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问
按刷新按扭
无论为何值,都会重复访问
当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。


[1] http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
[2] http://greenbytes.de/tech/webdav/rfc7232.html
[3] http://kb.cnblogs.com/page/209101/

你可能感兴趣的:(http)