关于 HTTP 协议中的 keep-alive

keep-alive

keep-alive 可以叫做持久连接(也有叫长连接的)。其实keep-alive这个header头只存在于HTTP/1.0版本中,在HTTP/1.1中是换成了persistent

keep-alive的作用及好处

众所周知,HTTP是建立在TCP之上的,TCP是传输层协议,HTTP是应用层的协议,报文的传输是通过客户端和服务端创建的TCP连接传输的。

正常来说一个 Request-Response 就经历

  1. TCP 连接
  2. 发送请求
  3. 服务器处理请求并发送响应
  4. 断开TCP连接

如果一个客户端经常访问服务器,那么创建、关闭TCP连接就耗费了大量的时间和资源,keep-alive就可以解决这样的一个情况。

使用keep-alive有什么好处呢

1.避免了缓慢的TCP连接过程
2.避免了慢启动的拥塞适应阶段(详细可以了解下TCP协议)

创建 keep-alive 连接

怎样才能和服务器创建一个keep-alive连接呢?

  1. 客户端在请求头需要加入
    Connection: keep-alive
  2. 服务器接收到客户端的请求中有keep-alive,若服务器支持keep-alive,则在响应头中加入
    Connection: keep-alive

    这样,当客户端接收到响应并发现响应中有keep-alive则认为和服务器之间创建了一条keep-alive连接,也就是不关闭TCP连接,该连接会在接收到服务器或客户端发起的 closed 请求或超时,就会关闭。

一个成功创建keep-alive连接的例子(某度的):
file

keep-alive 连接的一些注意点

  • keep-alive需要更加小心的维护,因为一不小心,就会有大量空闲的TCP连接存在。
  • 实体的主题部分必须有正确的Content-Length,不然会不知道哪里是一条报文的结束、一条报文的开始。
  • keep-alive不是默认使用的(ps:在 HTTP/1.1中 presistent是默认使用的)
  • 响应没有 keep-alive,服务器发出响应后就会关闭连接。

希望我把keep-alive说清楚了。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!