HTTP2 VS HTTP

5,110 阅读4分钟

HTTP/2协议在2015年就已经正式被发表了,但是现在有许多网站还是采用的http/1.1协议,都9102年了,确认不升级一下吗?想必该有人问了,为啥要升级,http/1.1用的好好的,http/2有啥优势?

首先来看一下http/1.1的缺点,也就是http/2的优势所在了。

HTTP/1.1 缺点

  1. 对头阻塞(Head-of-line blocking) HTTP/1.1协议虽然可以在同一个TCP连接上发送多个请求,但是这多个请求是有顺序的,必须处理完第一个请求才会响应下一个请求。如果第一个请求处理的特别慢,后面的所有请求就需要排队。

  2. TCP 连接数限制 对于同一个域名,浏览器最多只能同时创建 6 ~ 8 个TCP连接。如果一个页面有十个请求同时发送,那么只能等第一次的 6 ~ 8 个请求都返回了才能继续接下来的 2 ~ 4 个请求。这怎么能行?域名分片技术应运而生。就是把资源分配到不同的域名下(可以是二级子域名),这样就解决了限制,愉快~但是滥用域名分片技术也不行,因为每个TCP连接也是很费时的(这个大家都懂的)。

  3. Header 内容繁多,有时有可能会超过响应内容,并且每次有许多字段都是重复传输。

  4. HTTP/1.1是文本协议传输,不够安全。

基于以上缺点,也出现了许多优化手段:雪碧图、合并脚本和样式表、资源内联、域名分片等优化工作,但是如果HTTP协议足够好的话,本可以避免这些额外的操作。

HTTP/2

http2相比于http/1.1的新特性包括:

  1. 多路复用 (MultiPlexing),单一长连接,二进制格式传输,请求优先级设置
  2. 头部header压缩
  3. 服务端推送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编码。

静态字典表:

服务端推送

以前是客户端向服务器请求什么,服务器就发送什么,十分吝啬。现在有了服务端推送,客户端向服务端要了一滴水,服务端可以返回整个森林。 这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。比如浏览器向服务器请求一个页面,之前需要等到浏览器收到页面解析html后,发现里面引用了静态资源,浏览器再向服务器发送静态资源的请求。但是现在服务器可以直接将页面和所需的静态资源一并返回。

服务端推送需要开发人员手动配置,之前介绍的多路复用、头部header压缩这两项浏览器和服务器可以自行实现,不需要开发人员关心。

nginx如何配置

nginx开始HPPT/2非常简单,只需在HTTPS设置后加上http2即可。

server {
    listen 443 ssl http2;
}

讲了HTTP/2这么多的优点,客官确定不升级一下吗?升级之后就可以对雪碧图、合并脚本和样式表、资源内联、域名分片这些优化say goodbye了。以后谁再问你网站优化都有哪些方法,上面的几种就不要再说了。