blog
blog copied to clipboard
简单讲解一下 http2 多路复用
简单讲解一下 http2 多路复用
多路复用是 http2 提供的一个功能,在同一个 tcp 连接中客户端和服务端都可以同时发送多个请求或回应。而且两端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
帧和流
HTTP/2 是一个二进制协议, 每一个请求和响应都有一个唯一的 id,叫做流 id。每个请求和响应的数据会被划分为帧。帧是二进制数据块,流id用于标识一个帧属于哪个请求或响应。流是具有相同流id的帧的集合。
要发出HTTP请求,客户端首先将请求划分为二进制帧,并将请求的流ID分配给帧。然后,它与服务端建立TCP连接。连接成功后客户端开始向服务端发送帧数据。一旦服务端准备好响应,它就将响应划分为帧,并为响应帧提供相同的响应流id。服务端以帧的形式发送响应。
在 HTTP/2 中给请求流和响应流分配唯一 id 是必须的,因为多个不同的请求会使用同一个 TCP 连接发送。所以流 id 可以标识出一个帧属于哪个请求或响应。这样就能同步的发送多个 http 请求而不造成阻塞。
多路复用
一个 TCP 连接只能向同一个源发送 HTTP 请求,对于多个源需要建立多个 TCP 连接。
一旦建立了 TCP 连接,对该源所有的请求都将通过这个 TCP 连接完成。多个 HTTP/2 的请求会被划分成帧,并分配它们各自的流 ID。来自客户端多个请求流的帧是异步发送到,服务端的响应也是异步发送的。因此如果一个响应会花费大量的时间,其他的响应并不会被阻塞。客户端通过流 id 来区分和排列帧。
请求和响应都是并行的。当客户端发送请求的帧时,服务端同时也会返回响应的帧。
对特定源的所有请求完成后,TCP 连接将保持打开一段时间,然后关闭。
帧中的其他信息
流(或请求)可以具有优先级值。使用优先级值 server 决定需要为请求分配多少内存、CPU 时间和带宽。默认情况下,服务器不按任何顺序异步发送多个请求的帧,并并行处理它们。但是在请求时带上额外的 priority 信息可以强制服务器在其他响应之前发送响应的帧。