缓存字段
http1.0
强缓存
- Expires 响应头包含日期/时间, 即在此时候之后,响应过期。如果在Cache-Control响应头设置了 "max-age" 或者 "s-max-age" 指令,那么 Expires 头会被忽略。只包含在响应头中,字段值是一个日期。例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT。
如果服务器时间与浏览器时间不一致,此字段将失去意义。
协商缓存
- Last-Modified && If-Modified-Since
- 浏览器第一次请求服务器并且在服务器返回资源的同时,在response header中添加 Last-Modified的字段,值是这个资源在服务器上的最后修改时间,浏览器接收后缓存文件和和这个时间。
- 浏览器下一次请求这个资源,浏览器检测到有 Last-Modified这个header,于是添加If-Modified-Since这个header,值就是Last-Modified中的值。
- 服务器再次收到这个资源请求,会根据 If-Modified-Since 中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存读取。
- 如果If-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件有更新,于是返回新的资源文件和200。
http1.1
强缓存
- Cache-Control通用消息头字段
既可以被用于在http请求头中,也可以被用于响应头中
通过指定一系列逗号分隔的指令来实现缓存机制。
最常见于服务端响应头中的max-age指令,表示了body体中的数据的相对于请求时间点的过期时间,单位是秒。例如:cache-control: max-age=86400;
协商缓存
- Etag && If-None-Match
- Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成),只要资源有变化,Etag就会重新生成。
- 浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里。
- 服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。
- 如果服务器发现ETag匹配不上,那么直接以常规GET 200 形式将新的资源(当然也包括了新的ETag)发给客户端。
- 如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。
http连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
但此方式也有缺点,如果页面中有大量指向同一域名的http请求,每一次请求都要等待前面的请求完全处理完成才能进行。如果前面的请求发生卡顿,那么后续所有请求将会等待,效率甚至不如http1.0。http2.0解决了此问题。
Host
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
Range
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。