> 技术文档 > 搞懂TCP KeepAlive保活机制_tcp keepalive机制

搞懂TCP KeepAlive保活机制_tcp keepalive机制

目录

1.TCP KeepAlive的初衷

2.TCP Keepalive工作原理

2.1技术原理

2.2具体使用举例

3.TCP Keepalive和HTTP Keep-Alive的区别

3.1HTTP Keep-Alive

3.2总结


1.TCP KeepAlive的初衷

采用TCP连接的C/S模式应用中,当连接的双方在连接空闲状态时,如果任意一方意外崩溃、宕机、网线断开或路由器故障,另一方无法得知TCP连接已经失效。

那么,连接的另一方并不知道对端的情况,它会一直维护这个连接。而作为“服务端”来说,长时间的积累会导致非常多的半连接打开,造成系统资源的消耗和浪费,且有可能导致在一个无效的数据链路层面发送业务数据,结果就是发送失败。

所以各端要做到快速感知失败,减少无效连接操作,这就有了TCP的KeepAlive保活探测机制。

2.TCP Keepalive工作原理

2.1技术原理

当一个TCP连接建立之后,启用TCP Keepalive的一端便会启动一个计时器,当这个计时器数值到达0之后(也就是经过tcp_keepalive_time时间后,这个参数之后会讲到),一个TCP探测包便会被发出,这个TCP探测包是一个纯ACK包(RFC 1122#TCP Keep-Alives规范建议:不应该包含任何数据,但也可以包含1个无意义的字节,比如0x0)其Seq号与上一个包是重复的,所以其实探测保活报文不在窗口控制范围内。

如果一个给定的连接在两小时内(默认时长)没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于下表中的4个状态之一:

状态 处理 对方主机仍在工作,并且可达 TCP连接正常,将保活计时器重置 对方主机已崩溃,包括:已关闭或者正在重启 TCP连接不正常,经过指定次数的探测依然没有响应,则断开连接 对方主机崩溃并且已经重启 重启后原连接已失效,对方由于不认识探测报文,会响应重置报文段,请求端将连接断开 对方主机仍在工作,但由于某些原因不可达 TCP连接不正常,经过指定次数的探测依然没有得到响应,则断开连接

直观来说,TCP KeepAlive的交互过程大致如下图所示:

2.2具体使用举例

以linux内核为例,应用程序若想使用TCP Keepalive,需要设置SO_KEEPALIVE套接字选项才能生效。对应的,有三个重要参数:

参数 含义 默认值 tcp_keepalive_time 连接空闲多久后发送第一个探测包 7200秒(2小时) tcp_keepalive_probes 探测失败多少次后断开连接 9次 tcp_keepalive_intvl 探测包发送间隔 75秒

3.TCP Keepalive和HTTP Keep-Alive的区别

3.1HTTP Keep-Alive

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的Web页面包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

但从 HTTP/1.1起,默认使用长连接,用以保持连接特性,使用长连接的HTTP协议,会在响应头加上Connection:Keep-Alive字段。

HTTP的Keep-Alive可以使用同一个TCP连接来发送和接收多个HTTP请求/应答,避免了连接建立和释放的开销,提高通信效率。

3.2总结

  1. HTTP的Keep-Alive是为了让TCP连接活得更久一点,在发起多个http请求时能复用同一个连接,提高通信效率;
  2. TCP的KeepAlive机制在于探测连接的对端是否存活,是一种检测TCP连接状况的保鲜机制。