http缓存
我们可以通过设置http头部属性来对资源进行缓存,资源缓存分为强制缓存和协商缓存
-
强制缓存expire和cache-control
expires = max-age + 请求时间,这是一个绝对时间,如果时间当前时间超出这个时间,缓存失效。如果请求回来后,修改客户端时间,客户端时间跟expired时间差距比较大,则缓存失效。
cache-control:返回一个相对的时间值,比如cache-control:3600,则代表资源相对于客户端时间差在3600秒内不失效。cache-control优先级高于expires,cache-control取值:
max-age=3600,最大时间差不超过3600秒
public:可以缓存于任意中转代理服务器和用户浏览器端
private:只能缓存用户浏览器端
no-store:强制不缓存
no-cache:每次请求都要询问服务器,资源是否失效了 -
协商缓存,若未命中强缓存,则浏览器会将请求发送至服务器,服务器根据 last-modified / if-since-modified, Etag / if-since-modified判断缓存是否失效.
last-modified / if-since-modified:浏览器首次请求资源,服务器会返回last-modified字段,代表资源最后修改时间,再次请求资源时,会把上一次得到的last-modified转换为if-since-modified字段,放置在请求头部中,告诉服务器端,服务器根据这个字段跟资源最新修改时间对比。
Etag / If-None-Match:这种方式是服务器通过对每个资源链接生成一个唯一的Etag值,如果资源发生改变,则重新请求资源,判断方式跟last-modified一样。这种方式的好处在于,可以有效解决一个资源在一秒内多次修改导致资源变更,last-modifed只能精确到秒;另外有些资源是定期更新生成,也有可能文件内容并没有修改,但是通过last-modified还是判断为新资源。
这里我们通过nodejs来测试一下
1.Etag,原理就是通过对获取静态资源首次进行md5加密,加密过后写入header中if-none-match属性,下次再次获取资源,通过新旧标识对比,判断是否返回最新资源
app.use(conditional());
app.use(etag());
app.use(resource(path.join(__dirname, './views')));
// app.use(router.routes());
app.listen(3000, '0.0.0.0');

2.last-modified
const ifSinceModified = req.headers['if-modified-since'];
const lastModified = stat.ctime.toGMTString();
if (ifSinceModified === lastModified) {
res.writeHead('304');
res.end();
} else {
res.setHeader('Content-Type', mime.getType(filePath));
res.setHeader('Last-Modified', stat.ctime.toGMTString());
}
缓存的Nginx配置见:https://www.cnblogs.com/wenyule/p/11073277.html
https://www.codercto.com/a/74887.html

下面讲述http版本差异,http的共同点都是基于tcp协议进行三次握手。
- http1.0:这个版本http支持get/post/header,一个http只能请求一个资源。
- http1.1:在1.0 的基础上增加了Option/delete方法,并且支持http长连接,可以在头部的connection中设置为:keep-alive,如果设置了长连接,则代表一个请求链接可以重复利用,请求可以资源。
- http2.0:这1.1的基础上,应用层和传输层增加二进制分帧层,可以把请求数据进行二进制分帧,并行传输数据,通过首部压缩减少数据传输和首部映射表保证数据分帧并行传输到浏览器端能够有序。使用多路复用技术,一个链接可以并行处理多个请求,有效的减少服务器资源占用。http2.0是建立在HTTPS的基础上。这里又引出一个问题http和https的区别,HTTPS在应用层和传输层之间增加了SSL层。关于HTTPS的加密通讯过程如下:
1.客户端请求HTTPS链接,服务器端返回HTTPS证书,此证书包含有公钥。
2.客户端根据对称加密算法,随机生成一个私钥。
3.通过公钥加密私钥
4.将加密过后的私钥传送给服务器端。
网友评论