HTTP是一种在传输层或会话层上交换消息的无状态的请求/响应协议,HTTP使用URI定位资源和资源间的关系,通常请求会包含 请求行、请求首部和请求体。
HTTP1.x => HTTP2.0 => HTTP3.0变更
HTTP1.0
特点:HTTP1.0使用的是非持久连接,主要缺点是客户端必须为每一次待请求的对象建立并维护一个新的连接,即每请求一个文档就要有两倍RTT(Round Trip Time:一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值)的开销。
HTTP1.1
特点:
- 支持长连接
- 在HTTP1.0的基础上引入了更多的缓存控制策略
- 引入了请求范围设置,优化了带宽
- 在错误通知管理中新增了错误状态响应码
- 增加了Host头处理,可以传递主机名称
缺点:
传输内容是明文,不够安全
HTTP2.0
特点
-
HTTP2.0支持明文传输,而HTTP1.X强制使用SSL/TLS加密传输
-
和HTTP1.x使用的header压缩方式不同
-
HTTP2.0基于二进制格式进行解析,而HTTP1.x基于文本格式进行解析
-
多路复用,HTTP1.1是多个请求串行化单线程处理,HTTP2.0是并行执行,一个请求超时并不会影响其他请求
-
在HTTP1中浏览器限制了同一个域名下的请求数量,当在请求很多资源的时候,由于对头阻塞,当浏览器达到最大请求数量时,剩余的资源需等待当前的请求完成之后才能发起请求
-
HTTP2中引入了多路复用的技术,这个技术可以只通过一个TCP链接就可以传输所有的请求数据,多路复用可以绕过浏览器限制同一个域名下的请求数量的问题,进而提高了网页的性能。
HTTP3.0(QUIC)
特点:
-
线头阻塞问题的解决更为彻底
-
切换网络时的连接保持
-
当移动端的应用环境,用户的网络可能经常切换,wifi-4g,基于TCP的协议,由于奇幻网络之后,IP会改变,因而之前的链接不可能继续保持,而基于UDP的QUIC协议,则可以内建与TCP中不同的连接标识方法,从而在网络完成切换之后,恢复之前与服务端的连接。
HTTP缓存
总结
http缓存包含强缓存和协商缓存,区别在于强缓存优先于协商缓存,强缓存不会发送请求,强缓存通过Expires和Cache-control标识,优先级Cache-control>Expires,Expires是服务端返回的过期时间,由于客户端和服务端的时间可能存在误差,所以大多数被Cache-control取代,Cache-control通过属性标识决定是客户端(private)可以缓存,客户端和代理服务器(public)都可以缓存,或者是缓存在多少秒(max-age)之后失效,或者由协商缓存(no-cache)来验证,或者所有内容(no-store)都不会被缓存;协商缓存通过Last-Modified和Etag标识,优先级Etag>Last-Modified,服务端在响应请求时会告诉浏览器Last-Modified(最后修改时间),浏览器再次请求时,会在请求头包含if-Modified-Since,服务端校验如果一致则返回304,但是Last-Modified可能存在资源被修改但是内容发生改变的情况,Etag是http1.1的产物,是服务端生成的资源唯一标识,浏览器再次请求时会包含If-none-Match字段,服务器进行对比,相同则返回304,Etag是服务端通过算法计算得出,所以比较占用服务端的计算资源。
强缓存(过期机制)
标识字段:header中的Expes和Cache-control
Expires
Expires是http1.0的产物,服务端返回的过期时间,由于客户端和服务端的时间可能存在误差,所以大多数被Cache-control替代
Cache-control
private:客户端可以缓存
public:客户端和代理服务器都可以缓存
max-age:缓存将会在t秒后失效
no-cache:需要使用协商缓存来验证缓存数据
no-store:所有内容都不会被缓存
协商缓存(验证机制)
协商缓存需要对比判断是否可以使用缓存,Last-Modified和Etag
Last-Modified
如果资源被修改,但是内容没有发生改变,则时间匹配不上,为了解决这个问题,http1.1推出Etag
Last-Modified 服务端在响应请求时,会告诉浏览器最后修改时间
if-Modified-Since 浏览器再次请求时,请求头会包含此字段,后面跟随缓存中获得的最后修改时间,服务端判断存在if-Modified-Since,则与资源被修改最后的时间,进行对比,如果一致返回304,浏览器可以从缓存中读取资源
Etag
实际情况是Etag是服务器计算算法得来,所以比较占用资源,很少用
服务器在响应请求时,通过Etag告诉浏览器当前资源在服务器上生成的唯一标识
If-None-Match:浏览器请求资源时请求报文头包含此字段,值为缓存中的标识,服务器进行对比,无需修改则返回304状态码
参考链接
腾讯blog