我们知道,http协议是无状态,无连接的。有如下特点:
- 无状态
每次连接只处理一个请求,服务端处理完客户端一次请求,等到客户端作出回应之后便断开连接。 - 无连接
是指服务端对于客户端每次发送的请求都认为它是一个新的请求,上一次会话和下一次会话没有联系。
【状态】的含义可以这样理解
客户端与浏览器在某次会话中产生的数据
【无状态】则意味着这些数据不会被保留(翻脸不认人)
但是,通过利用cookie和session机制,现在的网络请求是有‘状态’的(你还是那个你)
缓存的好处
- 减少冗余的数据传输,节省带宽
- 减少服务端的负担
- 加快客户端加载网页的速度,用户体验更好
Cache-Control和Expires
属于强制缓存,即在有效期内,浏览器不会向服务器发送数据请求(通常情况)
Cache-Control是HTTP/1.1,Expires是HTTP/1.0,两者若同时出现,前者优先级更高
Cache-Control是一个时间段(max-age),Expires是一个时间点
Cache-Control : max-age = 1000
Expires : Wed, Jan 10 2018 00:27:04 GMT
Cache-Control可以再报文头部取不同的值:
- private:客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age=t:缓存内容的有效时间
- no-cache:需要使用协商缓存来验证数据
- no-store:禁止浏览器缓存数据
协商缓存(Last-Modified和Etag)
协商缓存需要进行对比判断是否使用缓存,这个由服务器承担。浏览器第一次请求数据时,服务器会将缓存标识与数据一起响应给客户端,客户端将它们备份至缓存中。再次请求时,客户端会将缓存中的标识发送给服务器,服务器根据此标识判断。若未失效,返回304状态码,浏览器拿到此状态码就可以直接使用缓存数据了。有两组分别是:Last-Modified/if-Modified-Since(基于资源修改的时间标识)与Etag/if-None-Match(利用md5摘要算法生成的一段字符串标识)。两者的流程很类似,区别在于根据什么来判断资源是否更新,是否需要下载资源。两者都是需要发送请求的。
如果对比后一致,那么服务器会返回304(Not Modified)
Last-Modified 与 If-Modified-Since
第一次请求返回的响应头:
Last-Modified: Wed, Jan 10 2018 00:27:04 GMT
第二次请求的请求头信息:
If-Modified-Since: Wed, Jan 10 2018 00:27:04 GMT
基于资源的修改时间来判断资源有无更新
Etag/if-None-Match
基于资源内容的摘要信息(md5)来判断
第一次请求返回的响应头:
ETag: "15f0fff99ed5aae4edffdd6496d7131f"
第二次请求的请求头信息:
If-None-Match: "15f0fff99ed5aae4edffdd6496d7131f"