HTTP/ 2 协议在 2015 年就已经正式被发表了,但是现在有许多网站还是采用的 http/1.1 协议,都 9102 年了,确认不升级一下吗?想必该有人问了,为啥要升级,http/1.1 用的好好的,http/ 2 有啥优势?
首先来看一下 http/1.1 的缺点,也就是 http/ 2 的优势所在了。
HTTP/1.1 缺点
- 对头阻塞(Head-of-line blocking)
HTTP/1.1 协议虽然可以在同一个 TCP 连接上发送多个请求,但是这多个请求是有顺序的,必须处理完第一个请求才会响应下一个请求。如果第一个请求处理的特别慢,后面的所有请求就需要排队。 - TCP 连接数限制
对于同一个域名,浏览器最多只能同时创建 6 ~ 8 个 TCP 连接。如果一个页面有十个请求同时发送,那么只能等第一次的 6 ~ 8 个请求都返回了才能继续接下来的 2 ~ 4 个请求。这怎么能行?域名分片
技术应运而生。就是把资源分配到不同的域名下(可以是二级子域名),这样就解决了限制,愉快~ 但是滥用域名分片技术也不行,因为每个 TCP 连接也是很费时的(这个大家都懂的)。 - Header 内容繁多,有时有可能会超过响应内容,并且每次有许多字段都是重复传输。
- HTTP/1.1 是文本协议传输,不够安全。
基于以上缺点,也出现了许多优化手段:雪碧图、合并脚本和样式表、资源内联、域名分片等优化工作,但是如果 HTTP 协议足够好的话,本可以避免这些额外的操作。
HTTP/2
http2 相比于 http/1.1 的新特性包括:
- 多路复用 (MultiPlexing),单一长连接,二进制格式传输,请求优先级设置
- 头部 header 压缩
- 服务端推送 Server Push
下面来一一介绍。
多路复用 (MultiPlexing)
HTTP/2 复用 TCP 连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,这些请求或回应在逻辑上分成了很多流(stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。而且不用按照顺序一一对应(但是同一个请求或响应的帧必须是有序的,不同的可以无序),这样就避免了 ” 队头堵塞 ”,减少了 TCP 连接数量和 TCP 连接慢启动造成的问题。http2 还可以对 stream 指定优先级,优先级越高的越先响应。比如可以把 js 和 css 的优先级设置的高一些,让他们优先下载并执行。优先级也能动态的修改。
多路复用图:
头部 header 压缩
HTTP 是无状态的,每次请求都需要附带一些信息。但是许多字段都是重复的,会浪费带宽影响速度。
HTTP/ 2 对头部信息采用 HPACK 压缩算法来减少报文头的大小。具体做法是把报文头信息中常见的名和值对应一个索引,维护了一张静态字典,index 从 1 到 61,比如把:method:GET 映射成 2,这样就能达到压缩头部的作用。但是对于一些动态的资源,比如,user-agent,需要维护一份可动态添加内容的共同动态字典,这份动态字典在数据传输的过程中逐步建立,index 从 62 开始。然后将映射之后的数据用 huffman 编码。
静态字典表:
服务端推送(Server Push)
以前是客户端向服务器请求什么,服务器就发送什么,十分吝啬。现在有了服务端推送,客户端向服务端要了一滴水,服务端可以返回整个森林。
这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。比如浏览器向服务器请求一个页面,之前需要等到浏览器收到页面解析 html 后,发现里面引用了静态资源,浏览器再向服务器发送静态资源的请求。但是现在服务器可以直接将页面和所需的静态资源一并返回。
nginx 如何配置
nginx 开始 HPPT/ 2 非常简单,只需在 HTTPS 设置后加上 http2 即可。
server {listen 443 ssl http2;}
讲了 HTTP/ 2 这么多的优点,客官确定不升级一下吗?升级之后就可以对雪碧图、合并脚本和样式表、资源内联、域名分片这些优化 say goodbye 了。以后谁再问你网站优化都有哪些方法,上面的几种就不用说了。