一、什么是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时间sNginx服务器:
nginx.conf:
keepalive_timeout //服务器接收在10s以内的所有connection复用超过10则关闭建立一个新的connection 0代表关闭keepaliveNode.js
四、多路复用是什么?

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

- 线头阻塞(Head-of-Line Blocking),HTTP1.X虽然可以采用keep alive来解决复用TCP的问题,但是还是无法解决请求阻塞问题。
- 所谓请求阻塞意思就是一条TCP的connection在同一时间只能允许一个请求经过,这样加入后续请求想要复用这个链接就必须等到前一个完成才行,正如上图左边表示的。
- 之所以有这个问题就是因为HTTP1.X需要每条请求都是可识别,按顺序发送,否则server就无法判断该响应哪个具体的请求
- 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个:
- 用户离开这个页面
- server主动关闭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