记录HTTP2.0多路复用

3,444 阅读3分钟

一、什么是keep alive?

HTTP持久连接(HTTP persistent connection,也称作HTTP keep-alive或HTTP connection reuse)是使用同一个TCP连接来发送和接收多个HTTP请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

二、keep alive和传统的区别?


一图胜千言,由图可知引入的keep alive的链接不必在每次请求都开启一个新的链接。

三、keep alive如何配置?

Apache服务器:

httpd.conf:

KeepAlive On             // 是否打开keep aliveMaxKeepAliveRequests 300 // 每个连接最大可复用的请求数KeepAliveTimeout 3       // 每个请求可复用的time时间s

Nginx服务器:

nginx.conf:

keepalive_timeout //服务器接收在10s以内的所有connection复用超过10则关闭建立一个新的connection 0代表关闭keepalive

Node.js

nodejs.org/api/http.ht…

四、多路复用是什么?


  1. HTTP2的请求TCP的connection一旦建立,后续请求以stream的方式发送。
  2. 每个stream的基本组成单位是frame(二进制帧),每种frame又分为很多种类型例如HEADERS Frame(头部帧),DATA Frame(内容帧)等等。
  3. 请求头HEADERS Frame组成了request,返回头HEADERS Frame和DATA Frame组成了response,request和response组成了一个stream。
五、多路复用和keep alive的区别?


  1. 线头阻塞(Head-of-Line Blocking),HTTP1.X虽然可以采用keep alive来解决复用TCP的问题,但是还是无法解决请求阻塞问题。
  2. 所谓请求阻塞意思就是一条TCP的connection在同一时间只能允许一个请求经过,这样加入后续请求想要复用这个链接就必须等到前一个完成才行,正如上图左边表示的。
  3. 之所以有这个问题就是因为HTTP1.X需要每条请求都是可识别,按顺序发送,否则server就无法判断该响应哪个具体的请求
  4. HTTP2采用多路复用是指,在同一个域名下,开启一个TCP的connection,每个请求以stream的方式传输,每个stream有唯一标识,connection一旦建立,后续的请求都可以复用这个connection并且可以同时发送,server端可以根据stream的唯一标识来响应对应的请求。
六、多路复用就不会关闭了么?

多路复用使用的同一个TCP的connection会关闭么,什么时候关闭,这是个问题?从标准上看到一段文字:

HTTP/2 connections are persistent. For best performance, it is
expected that clients will not close connections until it is
determined that no further communication with a server is necessary
(for example, when a user navigates away from a particular web page)
or until the server closes the connection.

意思就是说关闭的时机有2个:

  1. 用户离开这个页面
  2. server主动关闭connection。
但是标准总归标准,不同的服务器实现时有了自己的约定,就像keep alive一样,每种服务器都有对自己多路复用的这个connection有相关的配置

Syntax:	http2_idle_timeout time;Default:	
http2_idle_timeout 3m;
Context:	http, 
serverSyntax:	http2_recv_timeout time;
Default:	http2_recv_timeout 30s;
Context:	http, server

nginx.org/en/docs/htt…