HTTP2.0关于多路复用的研究

关于HTTP2中其他特性的研究可以参考我之前写的文章

关于Server Push的研究

问题一:什么是keep live?


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:

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

Nginx服务器:

nginx.conf:

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

Node.js

https://nodejs.org/api/http.html#http_class_http_agent

 

问题4:多路复用是什么?


1)HTTP2的请求的TCP的connection一旦建立,后续请求以stream的方式发送。

2)每个stream的基本组成单位是frame(二进制帧),每种frame又分为很多种类型例如HEADERS Frame(头部帧),DATA Frame(内容帧)等等。

3)请求头HEADERS Frame组成了resquest,返回头HEADERS Frame和DATA Frame组成了response,request和response组成了一个stream。

 

问题5:多路复用和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的唯一标识来相应对应的请求。

 

问题6:多路复用就不会关闭了么?


多路复用使用的同一个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有相关的配置:

Apache:

1
2
3
4
5
6
7
8
9
Syntax: http2_idle_timeout time;
Default:
http2_idle_timeout 3m;
Context: http, server
Syntax: http2_recv_timeout time;
Default:
http2_recv_timeout 30s;
Context: http, server

http://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_idle_timeout

参考资料:


  1. HTTP2官方标准:https://tools.ietf.org/html/rfc7540

  2. https://cascadingmedia.com/insites/2015/03/http-2.html