vlambda博客
学习文章列表

HTTP2多路复用指什么


为什么要多路复用(HTPT1局限性)?



在HTTP1.1中,发起一个请求都需要建立一次HTTP连接,也就是常说的三次握手和四次挥手,每次请求都需要建立一次连接挺消耗性能的,为了解决这个问题,HTTP1.1中提供了 Keep-Alive,允许我们建立一次 HTTP 连接后,保存连接不断开,用于多次请求使用。但是这里仍存在两个问题:

  1. 实际上我们只是节省了建立连接的时间,实际数据传输的时间并没有减少,而且HTTP1.1 是基于文本传输数据的,数据表现不够灵活

  2. 最大并发数问题,假设我们在服务端中设置了最大并发数为 300,而因为浏览器本身的限制,最大请求数为 6,那么服务器能承载的最高并发为 50 ,当51个人访问时,就需要等待前面的某个请求处理完成

  3. HTTP1 队头阻塞问题,假如建立了一个 TCP 连接,三个请求组成一个队列发出去,服务器接收到这个队列之后会依次响应,响应的过程是需要排队处理的,也就是说一旦前面某个请求阻塞,后面的请求就会无法响应


HTTP2如果实现多路复用



而 HTTP2 引入二进制数据帧和流的概念。一个流可以包含多个帧进行传输,这样就可以实现并行的目的,其中帧对数据进行标识,当浏览器/服务器收到数据之后,可以根据标识对数据进行合并,保证数据的完整传输


基于二进制帧和流的概念,HTTP2 对于同一域名下所有请求只需要建一次连接,以上文服务端最大连接数为300为例,此时最大的并发就可以提升到300,比原来提升了6倍


总结



一:同域名下所有通信都在单个连接上完成,消除了因多个TCP连接而带来的延时的内在消耗


二:解决了头阻塞问题,单个连接上可以交错的请求和响应,之间互不干扰。不过注意的是这里的队头阻塞是指的HTTP队头阻塞,不是TCP的队头阻塞