一、Http2多路复用
在 HTTP1.1 中,发起一个请求是这样的:浏览器请求url ->解析域名 -> 建立HTTP连接 -> 服务器处理文件 -> 返回数据 -> 浏览器解析、渲染文件
这个流程最大的问题是,每次请求都需要建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,而且逻辑上是非必须的。因为不间断的请求数据,第一次建立连接是正常的,以后就占用这个通道,下载其他文件,这样效率多高啊!
为了解决这个问题,HTTP1.1中提供了keep-alive,允许我们建立一次HTTP连接,来返回多次请求数据。但是这里有两个问题:
- HTTP 1.1 基于串行文件传输数据,因此这些请求必须是有序怼,所以实际上我们只是节省了建立连接的时间,而获取数据的时间并没有减少。
- 最大并发数问题,假设我们在Apache中设置了最大并发数 300,而因为浏览器本身的限制,最大请求数为6(chrome),那么服务器能承载的最大高并发数是5,当第51个人访问时,就需要等待前面某个请求处理完成。
而HTTP/2 引入二进制数据帧和流的概念。其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现数据合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据。
HTTP/2对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。同样Apache的最大连接数为 300,因为有了这个新特性,最大的并发就可以提升到3 00,比原来提升了6倍。HTTP2 采用二进制格式传输,取代了HTTP1.X的文本格式,二进制格式解析更高效。多路复用代替了HTTP1.X的序列和阻塞机制。在HTTP1.X中,并发多个请求需要多个TCP连接,而浏览器为了控制资源会有6-8个TCP连接都限制。
HTTP2 中:
- 同域名下所有通信都在单个连接上完成,消除了因多个TCP连接而带来延时和内存消耗。
- 单个连接上可以并行交错的请求和响应,之间互不干扰。
二、更形象的解析
队首阻塞是在计算机网络的范畴中是一种性能受限的现象。它的原因是一列的第一个数据包(队列)受阻而导致整列数据包受阻。例如它有可能在缓存式输入的交换机中出现,有可能因为传输顺序错乱而出现,亦有可能在HTTP流水线中多个请求的情况下出现。
-
HTTP/1:每位服务员只收到1个订单并提供正确的商品,然后就不再处理任何商品。所以如果10个商品,我们将不得不给10名服务人打电话。餐厅只需要雇佣劳动力,但需要花时间打电话给疲惫的人订购足够的食物。
-
HTTP/1/1:服务员经过改进能够收到更多的订单,但一次只收到1个订单。为了更快地订购,你可以根据你的需要打给2-3名服务人员。总的来说这是相当不错的,但还不是最优的。这些人被认为持久连接
- HTTP/2:如果餐厅改进了新的技术,员工仍然会记下所有订单,然后开始提货。但是这些人会更灵活,提出来的那些货物交替发送每个部分,并打上记号。因此,减少了大量的等待时间,只需要一个人就可以服务1桌,降低了人员成本。
多路复用 并行交错的发送多个请求和响应,互不干扰。多路复用对同一域名下所有请求都是基于流的,所以不存在同域并行阻的塞。