HTTP是基于TCP/IP协议的应用层协议,用于客户端和服务器之间的通信,默认80端口。我们按照他的发展历程的时间顺序开始说。
1. HTTP/0.9
1990年提出的,是最早期的版本,只有一个命令GET。
2. HTTP/1.0
缺点:每个TCP连接只能发送一个请求。
解决方法:Connection:keep-alive
3.HTTP/1.1
1997年1月提出,现在使用最广泛的。
特性
- 长连接:TCP连接默认不关闭,可以被多个请求复用。对于同一个域名,大多数浏览器允许同时建立6个持久连接。默认开启Connection:keep-alive。
- 管道机制:在同一个TCP连接里,可以同时发送多个请求。但是服务器还是要按照请求的顺序进行响应,会造成“队头阻塞”。
在google 中在同一个域名下,能够实现了一个连接进行并发请求 (多路复用)
通用首部字段
1、Cache-Control:操作缓存的工作机制
- public:明确表明其他用户也可以利用缓
- private:缓存只给特定的用户
- no-cache:客户端发送这个指令,表示客户端不接收缓存过的响应,必须到服务器取;服务器返回这个指令,指缓存服务器(客户端)不能对资源进行缓存。其实是不缓存过期资源,要向服务器进行有效期确认后再处理资源。
- no-store:指不进行缓存
- max-age:缓存的有效时间(相对时间)
- s-maxage: 代理服务器的缓存
2、Connection:
- Connection:keep-Alive (默认持久连接)
- Connection:不再转发的首部字段名
3、Pragma:兼容http1.0,与Cache-Control:no-cache含义一样。但只用在客户端发送的请求中,告诉所有的中间服务器不返回缓存。形式唯一:
Pragma:no-cache
请求首部字段
- Accept:通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级 q表示优先级的权重值,默认为q = 1.0,范围是0~1(可精确到小数点后3位,1为最大值)当服务器提供多种内容时,会先返回权重值最高的媒体类型
- Accept-Charset:支持的字符集及字符集的相对优先顺序,跟Accept一样,用q来表示相对优先级。这个字段应用于内容协商机制的服务器驱动协商。
- Accept-Encoding:支持的内容编码及内容编码的优先级顺序,q表示相对优先级。内容编码:gzip、compress、deflate、identity(不执行压缩或者不会变化的默认编码格式)。可以使用*作为通配符,指定任意的编码格式。
- Accept-Language:能够处理的自然语言集,以及相对优先级。
- Referer: 能知道请求URI从哪个页面发起
- HOST: 明确支出请求的主机名(请求头中必须存在的字段)
响应首部字段
- ETag:资源的匹配信息
- Location: 令客户端重定向至指定URI
实体首部字段
- Allow 资源可支持的HTTP方法
- Content-Encoding 实体主体适用的编码方式
- Content-Language 实体主体的自然语言
- Content-Length 实体主体的大小(单位:字节)
- Content-Location 替代对应资源的URI
- Content-Type 实体主体的媒体类型 Expires 实体主体过期的日期时间
- Last-Modified 资源的最后修改日期时
HTTP缓存机制
缓存分类
- 强制缓存
在缓存数据未失效的情况下,可以直接使用缓存数据;在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据和缓存规则一并返回,缓存规则信息包含在响应header中。
- Expires:缓存过期时间(HTTP1.0)
缺点:生成的是绝对时间,但是客户端时间可以随意修改,会导致误差 - Cache-Control :HTTP1.1,优先级高于Expires
private: 客户端可以缓存
public: 客户端和代理服务器都可缓存
max-age=xxx: 缓存的内容将在 xxx 秒后失效
no-cache: 需要使用协商缓存来验证缓存数据(后面介绍)
no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发
Expires和Cache-Control决定了浏览器是否要发送请求到服务器,ETag和Last-Modified决定了服务器是要返回304+空内容还是新的资源文件。
- 协商缓存
浏览器第一次请求数据时,服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可以使用缓存数据。
- Last-Modified / If-Modified-Since
Last-Modified:服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:再次请求服务器时,通过此字段通知服务器上次请求时,服务器返回的资源最后修改时间。
缺点:Last-Modified 标注的最后修改时间只能精确到秒,如果有些资源在一秒之内被多次修改的话,他就不能准确标注文件的新鲜度了。如果某些资源会被定期生成,当内容没有变化,但 Last-Modified 却改变了,导致文件没使用缓存;有可能存在服务器没有准确获取资源修改时间,或者与代理服务器时间不一致的情形。
- Etag / If-None-Match(优先级高于Last-Modified / If-Modified-Since)
Etag:给资源计算得出的一个唯一标志符。
If-None-Match:再次请求服务器时,通过此字段通知服务器客户端缓存数据的唯一标识。
缓存判断顺序
- 先判断Cache-Control,在Cache-Control的max-age之内,直接返回200 from cache;
- 没有Cache-Control再判断Expires,再Expires之内,直接返回200 from cache;
- Cache-Control=no-cache或者不符合Expires,浏览器向服务器发送请求;
- 服务器同时判断ETag和Last-Modified,都一致,返回304,有任何一个不一致,返回200。
具体过程如下图: