HTTP2中,多路复用的原理是什么?

在前端使用中,浏览器与服务器之间的网络请求数量也在不断增加。传统的HTTP1.1协议在处理这些请求时面临着性能瓶颈,尤其是对于需要大量资源加载的页面。HTTP2引入了多路复用(Multiplexing)的概念,这是该协议的一项核心特性

一、HTTP1.1的限制

1. 请求/响应阻塞(Head-of-Line Blocking)

在HTTP1.1中,客户端和服务器之间的每个HTTP请求都对应着一个独立的TCP连接。虽然一个TCP连接可以并发传输多个请求,但每个连接在同一时间只能传输一个请求/响应对。若某个请求的响应较慢,它将阻塞同一连接中的其他请求,导致整个连接的延迟增加。即使其他请求已经准备好响应,它们也不得不等待第一个响应完成后才能传输,这就是头部阻塞(Head-of-Line Blocking)问题。

2. 多个TCP连接

为了解决头部阻塞,很多浏览器采用了多连接技术,通过为每个请求开启不同的TCP连接来并发请求资源。然而,这种方法也存在问题:

  • 每个连接都需要消耗额外的TCP连接建立和管理开销。
  • 浏览器会遇到TCP连接数限制(通常每个域名最多允许6-8个并发连接)。
  • TCP连接的建立和关闭也会引入延迟,尤其在高延迟网络环境下,性能提升有限。

二、HTTP2的多路复用

为了克服HTTP1.1的这些问题,HTTP2引入了多路复用技术,这一特性大大改善了Web性能。

1. 概念:通过单一连接并发多个请求

HTTP2的多路复用允许在一个单一的TCP连接上并发发送多个请求和响应,而无需等待其他请求完成。这意味着一个TCP连接可以同时传输多个请求/响应对,彼此之间互不干扰。

具体来说,HTTP2通过(stream)和消息(message)的概念来实现多路复用:

  • (Stream):在HTTP2中,数据传输是以流为单位进行的。每个流都有一个唯一的标识符(Stream ID),并且可以包含多个请求/响应对。每个流是双向的,可以在一个连接上同时进行多个流的传输。
  • (Frame):流中的数据以帧的形式传输,每个HTTP2的请求/响应都会被分解成多个帧。帧是HTTP2的基本传输单元,包括数据帧、头部帧、设置帧等。
  • 消息(Message):由多个帧组成的完整请求或响应。例如,一个请求可能包含多个帧来传输请求的头部和数据内容。
2. 如何实现多路复用

在HTTP2中,当客户端发出多个请求时,这些请求并不会按顺序被发送,而是会被分解成多个帧并并发地通过单一的TCP连接发送。每个帧都会带有一个流标识符,标明该帧属于哪个请求。

  • 流的分配:每个请求在传输时,都会有一个唯一的流标识符。即使这些请求的响应顺序不同,HTTP2也能够在接收端将它们正确地重新组合成完整的请求/响应对。
  • 无阻塞传输:由于多个请求/响应可以并发传输,一个请求的延迟不会影响其他请求。这消除了HTTP1.1中的头部阻塞问题,提高了网络资源的利用率。
3. 流的优先级控制

HTTP2还提供了流的优先级机制,允许客户端指定不同流之间的优先级。客户端可以为不同的请求设置优先级,告诉服务器应该首先处理哪些请求,从而优化响应时间。这个特性有助于确保关键资源(如CSS、JavaScript文件等)优先加载,而非关键资源(如广告、图片等)可以稍后加载。

三、多路复用的优势

HTTP2中的多路复用技术相比HTTP1.1带来了显著的性能提升:

1. 降低延迟

由于多个请求/响应可以在同一个TCP连接中并发传输,避免了由于TCP连接建立和关闭所带来的延迟。所有请求和响应都可以在一个连接上并行传输,而不再需要等待其他请求完成。

2. 减少连接数

在HTTP1.1中,浏览器需要为每个请求打开多个TCP连接,而HTTP2仅需要一个TCP连接就可以处理所有请求。这显著减少了TCP连接的建立和维护成本,也减轻了服务器的负担。

3. 消除头部阻塞问题

HTTP2通过将请求和响应分解成多个帧并并发传输,彻底消除了HTTP1.1中存在的头部阻塞问题。在HTTP2中,即使某个请求的响应较慢,其他请求依然能够正常传输和处理。

4. 更高效的带宽利用

通过多路复用,HTTP2能够更高效地使用带宽。在一个TCP连接中并发传输多个流,避免了因连接数过多而产生的带宽浪费,并且减少了TCP连接竞争带宽的情况。

四、总结

HTTP2的多路复用特性通过将多个请求和响应并发传输在一个TCP连接中,极大地提高了Web应用的性能。它消除了HTTP1.1中的头部阻塞问题,减少了TCP连接的建立和关闭带来的延迟,同时提供了流的优先级控制,进一步优化了页面加载速度。

你可能感兴趣的:(http,网络安全,前端,网络,网络协议,tcp/ip)