第 15 题:简单讲解一下 http2 的多路复用
在 HTTP/1
中,每次请求都会建立一次 HTTP
连接,也就是我们常说的 3 次握手 4 次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive
,解决了多次连接的问题,但是依然有两个效率上的问题:
- 第一个:串行的文件传输。当请求
a
文件时,b
文件只能等待,等待a
连接到服务器、服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是 1 秒,那么a
文件用时为 3 秒,b
文件传输完成用时为 6 秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输) - 第二个:连接数过多。我们假设
Apache
设置了最大并发数为 300,因为浏览器限制,浏览器发起的最大请求数为 6,也就是服务器能承载的最高并发为 50,当第 51 个人访问时,就需要等待前面某个请求处理完成。
HTTP/2
的多路复用就是为了解决上述的两个性能问题。
在 HTTP/2
中,有两个非常重要的概念,分别是 帧(frame)
和 流(stream)
。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
多路复用,就是在一个 TCP
连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP
旧版本中的队头阻塞问题,极大的提高传输性能。
HTTP2
采用二进制格式传输,取代了 HTTP1.x
的文本格式,二进制格式解析更高效。
多路复用代替了 HTTP1.x
的序列和阻塞机制,所有的相同域名请求都通过同一个 TCP
连接并发完成。在 HTTP1.x
中,并发多个请求需要多个 TCP
连接,浏览器为了控制资源会有 6-8 个 TCP
连接都限制。
HTTP2
中:
- 同域名下所有通信都在单个连接上完成,消除了因多个
TCP
连接而带来的延时和内存消耗。 - 单个连接上可以并行交错的请求和响应,之间互不干扰