Http1.x版本中keep-alive有什么作用?HTTP2对此又有什么优化

324 阅读3分钟

作用

使客户端到服务器端的连接持续有效(长连接),当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

早期HTTP/1.0在每次请求的时候,都要创建一个新的连接,而创建连接的过程需要消耗资源和时间,为了减少资源消耗、缩短响应时间,就需要复用已有连接。

在后来的HTTP/1.0以及HTTP/1.1中引入了复用连接的机制,也就是在请求头中加入Connection: Keep-Alive,以此告诉对方这个请求响应完成后不要关闭连接,下一次还用这个请求的连接进行后续交流。

协议规定,如果想要保持连接,则需要在请求头中加上Connection: Keep-Alive。 image.png

keep-alive 的优点

  • 较少的CPU和内存的占用(因为要打开的连接数变少了,复用了连接)
  • 减少了后续请求的延迟(无需再进行握手)
  • ......

keep-alive 的缺点

  • 因为在处理的暂停期间,本来可以释放的资源仍旧被占用。请求已经结束了,但是还一直连接着也不合适

解决

Keep-Alive: timeout=5, max=100

  • timeout: 过期时间5秒,(对应httpd.conf里的参数是:KeepAliveTimeout),
  • max是最多一百次请求,强制断掉连接。
    • 就是在timeout时间内又有新的连接过来,同时max会自动减一,直到为0,强制断掉。

HTTP2对比HTTP/1的优化

多路复用

在HTTP/2中会有一个多路复用对这个连接的问题进行了优化。 在HTTP1.X中如果想并发多个请求的话,必须使用多个TCP连接,但是浏览器为了控制资源,会对单个域名有6-8个TCP链接的数量限制。而在HTTP/2中:

  • 同域名下的所有通信,都在单个连接上完成
  • 单个连接可以承载任意数量的双向数据流
  • 数据流以消息的形式发送,而消息又由一个或多个帧组成(多个帧可以乱序发送,因为可以根据帧首部的流标识来重新组装)

image.png

⼆进制格式分帧

HTTP 1.x 采用的⽂本格式,HTTP/2 采⽤⼆进制格式来传输数据,二进制对于计算机来说,计算机是更喜欢二进制的,解析起来也更高效。

帧:HTTP/2 数据通信的最⼩单位消息,是指 HTTP/2 中逻辑上的 HTTP 消息(例如请求、响应等)。消息由⼀个或多个帧组成

流:存在于连接中的⼀个虚拟通道,它可以承载双向消息,且每个流都有唯⼀的整数ID

头部压缩

在 HTTP1.x 中,请求和响应中会重复携带一些不常改变、冗⻓的头数据,给⽹络带来额外负担。

在 HTTP/2 中,客户端和服务端使⽤ “⾸部表” 来跟踪和存储之前发送过的键值对,

相同的数据不再随着每次请求和响应发送。⾸部表在连接存续期间始终存在,由客户端和服务器共同渐进更新。

每个新的⾸部键值对,要么被追加到当前表的末尾,要么替换表中已存在的键值对。

可以简单的理解为:只发送差异数据,⽽不是全部发送,从⽽减少头部的信息量

image.png

服务器推送

服务端可以在发送⻚⾯ HTML 内容时,再主动推送一些其它资源,⽽不⽤等到浏览器解析到相应的位置时发起请求后再作响应。

例如,服务端可以主动把 JS 和 CSS ⽂件推送给客户端,⽽不需要客户端解析 HTML 时再发送这些请求。

不过,服务端的主动推送行为,客户端有权利选择是否要接收。

如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送 RST_STREAM 帧来拒收。