站点工具

用户工具


HTTP的keep-alive和多路复用

图片来源图解HTTP

Http1.0 版本

每次请求,都要建立连接,需要三步握手和四步挥手

能不能改进一下,三步握手建立连接之后,后面可以发多个请求,等没请求可发了最后再四步挥手断开连接呢?

Http1.1 版本

改进1:连接可以复用。一次连接,多个请求响应(对应多个资源)

改进2:增加流水线(pipeline)操作。下一个请求可不用等上一个响应来之后再发送。(但响应到来的顺序不变 FIFO)

http1.1中默认开启keep-alive,通过http请求头设置“connection: close”关闭。 http1.0中keep-alive默认是关闭的,通过http请求头设置“connection: keep-alive”进行开启

依旧存在的问题:

  1. 请求按次序,后来者需要排队等待
  2. 请求头都类似,重复传输浪费资源
  3. 同一域名浏览器有最大并行请求限制

设想:以报文字符串的形式来表示一个请求数据太过笼统了,可以把请求拆分成更小的单元,该复用的复用,甚至不用关心先后次序,甚至数据都不需要是字符串的形式

HTTP2

基于二进制流。 将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。 将 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装。

  • 并行交错地发送多个请求,请求之间互不影响。
  • 并行交错地发送多个响应,响应之间互不干扰。
  • 使用一个连接并行发送多个请求和响应。

参考

若愚 · 2021/09/16 16:29 · http_keep-alive.txt