HTTP/1.0 HTTP/1.1 HTTP/2 主要特性对比
HTTP是一种无状态的【应用层】协议
无状态:同一个客户端连续两次发送请求给服务器,服务器也识别不出这是同一个客户端发送的请求。
HTTP/1.0
缺点
1、无法复用连接: HTTP/1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端,也不记录过去的请求。(无状态)
2、队头阻塞:响应完当前请求才能继续发送下一个请求
HTTP/1.1
继承了HTTP/1.0简单的特点,还解决了诸多HTTP/1.0性能上的问题
优点
1、长连接:HTTP/1.1增加了一个Connection字段,默认为Keep-Alive可以保持HTTP连接不断开,即不进行四次挥手。(可手动关闭)
2、管道化:可以支持并行发送多个请求,但是响应还是得按照先后顺序。(浏览器默认禁用,因为没有从根本上解决问题)
3、chrome对同一host最多允许6个并行TCP连接(源码写死)
HTTP/1.1下单个TCP连接对应单个http请求,现代浏览器允许同时进行多个TCP连接,同时维护多个TCP连接达到并发请求的目的。也就是现代浏览器对同一host下并行加载6~8个资源的限制。【通过建立多个TCP链接实现并行】
提示
HTTP/1.1实现的并发
- chrome在HTTP/1.1协议下对同一host有6个tcp连接并发的限制。如果所有资源部署在同一台机器上,意味浏览器在HTTP/1.1下同时最高并发6个http请求。想要同时并发达到更多的请求需要在不同的host服务上部署资源,也称域分片
如果已经部署HTTP/2的话,不要使用域分片概念,因为HTTP/2多路复用可以并发多个请求
HTTP/2实现的并发
- 得益于多路复用特性,浏览器在http/2协议下对单一tcp请求可以并行发送多个http请求
4、缓存处理(强缓存&协商缓存):参考文章
强缓存(本地缓存)使用响应头 Cache-Control或Expires(1.0版本,不推荐)控制。
Cache-Control: max-age=3600 // 缓存有效倒计时
Cache-Control: no-store/no-cache // 不使用缓存
协商缓存被下面两组配合控制
请求头If-Modified-Since: date 与 响应头Last-Modified【判断两组时间是否一致】
请求头If-None-Match: etag 与 响应头etag【判断两组标签是都一致】
HTTP/2
1、多路复用 【实现真正的并行传输】
一次TCP握手,多个同域并行请求,请求和响应同时发送与接收,然后再拼装组合,不阻塞。而这个强大的功能则是基于“二进制分帧”的特性。
2、头部压缩
注意
在 HTTP/1 中,HTTP 请求都是由「 请求行 + 请求头 + 请求体 」三部分组成 (响应也是三部分: 「 响应行 + 响应头 + 响应体 」)
一般而言,请求体 都会经过 gzip 压缩,但 请求行 和 请求头 却没有经过任何压缩,直接以纯文本传输。
每个页面产生的请求数也越来越多, 消耗在头部的流量就会越多,尤其是每次都要传输 UserAgent、Cookie 这类不会频繁变动的内容,完全是一种浪费。
3、服务器推送
主动向客户端推送,不需要客户端请求,nginx可配置,参见 HTTP/2 服务器推送教程
http2其他特性
HTTP/2移除了对101(切换协议)信息状态码的支持, 因为101(切换协议)的语义不适用于一个多路复用协议
伪报头字段
内置的伪头字段,浏览器http2发送请求时一般会默认带上
伪报头请求字段: :authority
(代替host字段)、:method
(请求方法)、:scheme
(http/https协议)、:path
(url path)
伪报头响应字段: :status