TCP Keepalive 和 HTTP Keep-Alive

本文详细介绍了HTTP的Keep-Alive和TCP的Keepalive机制。HTTP的Keep-Alive允许在同一TCP连接上进行多次HTTP请求,减少连接建立和释放的开销,而TCP的Keepalive是内核实现的保活机制,通过探测报文检测TCP连接的有效性。两者在实现层面和目的上有所不同,HTTP长连接关注应用效率,TCP保活关注连接稳定性。
摘要由CSDN通过智能技术生成

转自:
https://xiaolincoding.com/network/3_tcp/tcp_http_keepalive.html#_4-15-tcp-keepalive-%E5%92%8C-http-keep-alive-%E6%98%AF%E4%B8%80%E4%B8%AA%E4%B8%9C%E8%A5%BF%E5%90%97

事实上,这两个完全是不同的东西,实现的层面也不同。

  • HTTP 的 Keep-Alive,是由应用层(用户态) 实现的,称为 HTTP 长连接
  • TCP 的 Keepalive,是由 TCP 层(内核态) 实现的,称为 TCP 保活机制

HTTP 的 Keep-Alive

HTTP 协议采用的是「请求 - 应答」的模式,即客户端发起请求,服务端才会返回响应,一来一回。

在这里插入图片描述

由于 HTTP 是基于 TCP 传输协议实现的,客户端与服务端进行 HTTP 通信前,需要先建立 TCP 连接,然后客户端发送 HTTP 请求,服务端收到后就返回响应,至此「请求 - 应答」的模式就完成了,随后释放 TCP 连接。

如果每次请求都要经历这样的过程:建立 TCP -> 请求资源 -> 响应资源 -> 释放连接,这就是 HTTP 短连接。

在这里插入图片描述

这样一次连接只能请求一次资源。能不能在第一个 HTTP 请求完后,先不断开 TCP 连接,让后续的 HTTP 请求继续使用此连接呢?

可以的,HTTP 的 Keep-Alive 就实现了这个功能,可以使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,避免连接建立和释放的开销,称为 HTTP 长连接。

在这里插入图片描述

HTTP 长连接的特点是,只要任意一端没有明确提出断开连接,则一直保持 TCP 连接状态。

怎么才能使用 HTTP 的 Keep-Alive 功能呢?

在 HTTP/1.0 中默认是关闭的,如果浏览器要开启 Keep-Alive,它必须在请求的包头中添加 Connection: Keep-Alive,然后当服务器收到请求,并作出回应时,也添加一个头在响应中 Connection: Keep-Alive

这样连接就不会中断,而是保持连接。当客户端发送另一个请求时,会使用同一个连接,这将一直持续到客户端或服务端提出断开连接。

从 HTTP/1.1 开始, 就默认开启了 Keep-Alive。如果要关闭 Keep-Alive,则需要在 HTTP 请求的包头里添加 Connection: close,现在大多数浏览器都默认使用 HTTP/1.1,所以 Keep-Alive 都是默认打开的。一旦客户端和服务端达成协议,那么长连接就建立好了。

HTTP 长连接不仅减少了 TCP 连接资源的开销,而且给 HTTP 流水线技术提供了可实现的基础。

所谓的 HTTP 流水线,是指客户端可以先一次性发送多个请求,在发送过程中不需要等待服务端的回应,减少整体的响应时间。

举例来说,客户端需要请求两个资源。以前的做法是:在同一个 TCP 连接里面,先发送 A 请求,然后等待服务端做出回应,收到后再发出 B 请求。HTTP 流水线机制则是允许客户端同时发出 A 请求和 B 请求。

在这里插入图片描述

但是服务端还是要按照顺序响应,先回应 A 请求,完成后再回应 B 请求。

而且要等服务端响应完客户端发送的第一批请求后,客户端才能发出下一批的请求,即如果服务端响应的过程发生了阻塞,那么客户端就无法发出下一批的请求,此时就造成了「队头阻塞」的问题。

如果使用了 HTTP 长连接,当客户端完成一个 HTTP 请求后,就不再发起新的请求,此时这个 TCP 连接一直占用着不是挺浪费资源的吗?

没错,所以为了避免资源浪费的情况,Web 服务软件一般都会提供 keepalive_timeout 参数,用来指定 HTTP 长连接的超时时间。

比如设置了 HTTP 长连接的超时时间是 60 秒,Web 服务软件就会启动一个定时器,如果客户端在完成一个 HTTP 请求后,在 60 秒内都没有再发起新的请求,定时器的时间一到,就会触发回调函数来释放该连接。

在这里插入图片描述

TCP 的 Keepalive

TCP 的 Keepalive 其实就是 TCP 的保活机制。

如果两端的 TCP 连接一直没有数据交互,达到了触发 TCP 保活机制的条件,那么内核里的 TCP 协议栈就会发送探测报文。

如果对端程序是正常工作的,当 TCP 保活的探测报文发送给对端时,对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。

如果对端主机崩溃或者对端由于其他原因导致报文不可达,当 TCP 保活的探测报文发送给对端后,石沉大海没有响应,连续几次至达到最大保活探测次数后,TCP 会报告该 TCP 连接已经死亡。

所以,TCP 保活机制可以在双方没有数据交互的情况,通过探测报文来确定对方的 TCP 连接是否存活,这个工作是在内核中完成的。

在这里插入图片描述

注意,应用程序若想使用 TCP 保活机制需要通过 socket 接口设置 SO_KEEPALIVE 选项才能够生效,如果没有设置,那么就无法使用 TCP 保活机制。

总结

HTTP 的 Keep-Alive 也叫 HTTP 长连接,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。

TCP 的 Keepalive 也叫 TCP 保活机制,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值