HTTP/0.9 --> HTTP/1.0 --> HTTP/1.1 --> SPDY --> HTTP/2web
主要新特性:ajax
为何提出HTTP/2?api
网页请求的资源愈来愈大,愈来愈多,人们对于网页加载的速度的容忍度愈来愈低,要求愈来愈高。而HTTP/1.1的协议仍是20年前的协议,当时的背景是网页请求数少,网页中资源小。所以,亟需升级协议以提升网站的性能。HTTP/2的主要任务就在于此。缓存
+首部性能优化
+响应码服务器
+重定向cookie
+错误网络
+条件请求socket
+内容编码(压缩)async
+更多的请求方法(GET POST ...)
......
×缺乏强制的Host首部
×不能让多个请求共用一个链接
×缓存的选择简陋
相比于HTTP/1.1
当前web应用每一个页面可能引用数百个对象,关联数十个域名,网络环境相差迥异,设备处理能力良莠不齐。这种状况下提供表现一致且迅速的web体验不简单。保证用户在网站上交互体验的流畅性,得重视理解客户端获取页面和渲染页面步骤,从而使得在协议上作出的改进实实在在的提高web的性能。
web页面请求
资源请求/获取
把待请求url放入队列 --> 解析url中域名的IP地址 --> 创建与目标TCP链接 --> 若是是HTTPS,初始化并完成TLS握手 --> 向页面对应的url发送请求
资源响应/渲染
接收响应-->是HTML,则解析-->对页面引用进行有限排序-->添加引用资源到请求队列-->等待
-->不是HTML,判断关键资源没有接收完成 --> 等待
关键资源接受完成 --> 渲染页面 --> 还要继续接受其余资源 --> 等待
--> 无其余资源,页面渲染结束
关键性能指标
H1面临的问题
DNS查询优化
ajax.googleapis.com
:页面中加入标签<link rel="dns-prefetch" href="//ajax.googleapis.com">
, 这样在下载处理主页面的同时,预取指令就能开始解析指定的域名。优化TCP链接
<link rel="preconnect" href="//fonts.example.com">
避免重定向
客户端缓存
客户端缓存TTL(生存时间),设置HTTP首部cache-control及max-age(单位秒),或者expires首部。
网络边缘缓存
hold'til told!
条件缓存
304 Not Modified状态码,若请求资源发生了变化,则直接返回资源;若请求资源未发生变化,则直接返回内容没变的提示消息:HTTP首部包含Last-Modified-Since, 请求体中包含实体校验码ETag。
压缩和代码极简化
极简化 --> 无损压缩(gzip,deflate, brotli)
CSS资源放在JS资源和图片以前
图片优化
针对于HTTP/1.1适用,但对于H2来讲拔苗助长的作法,由于HTTP/2对于每一个域名只会开启一个链接。HTTP/2能够并行处理多个请求。