> 文档中心 > TCP 连接中的keep-alive

TCP 连接中的keep-alive

目录

keep-alive

保活机制

好处

应用层保活


keep-alive

        在一个长连接内,在一段期间,如果没有任何相关的活动,TCP保活机制开始作用。每隔一段时间,发送一个报文,如果连续几个报文都没有得到响应,则认为当前TCP连接已经失效。

内核中的变量

net.ipv4.tcp_keepalive_timenet.ipv4.tcp_keepalive_intvlnet.ipv4.tcp_keepalve_probes

Document/networking/ip-sysctl.txt

tcp_keepalive_time - INTEGER
    How often TCP sends out keepalive messages when keepalive is enabled.
    Default: 2hours.

tcp_keepalive_intvl - INTEGER
    How frequently the probes are send out. Multiplied by
    tcp_keepalive_probes it is time to kill not responding connection,
    after probes started. Default value: 75sec i.e. connection
    will be aborted after ~11 minutes of retries.

tcp_keepalive_probes - INTEGER
    How many keepalive probes TCP sends out, until it decides that the
    connection is broken. Default value: 9.

默认设置是 2 小时、75 秒和 9 次探测。

说明

  1. 客户端和服务端正常工作,探测报文发送给对端,对端正常响应,则TCP保活变量被重置。
  2. 对端程序崩溃并重启,当TCP保活探测发送给对方,对端可以响应。但由于没有该链接的有效信息,会产生RST报文,TCP连接被重置。
  3. 对端程序崩溃,报文不可到达,多次探测后,TCP会报告该TCP链接已经死亡。
  4. 内核探测时间最少需要经过 2 小时 75 秒; 时间太长,内核中的参数是可以设置的,但应用层需要感知是否是活动连接,需要在应用层增加传输协议。

保活机制

        可以在两侧开启,也可以在一侧开启。

        服务器端要探活client来保证自己不会维护无效连接,客户端来探活保持自己是不是可以持续申请资源。

好处

  1. 如果开启服务器端到客户端的检测,可以在客户端非正常断连的情况下清除在服务器端保留的“脏数据”;
  2. 开启客户端到服务器端的检测,可以在服务器无响应的情况下,重新发起连接。

应用层保活

        应用层需要知道连接状态,在断开时做一些处理。在服务端与客户端设计心跳包,如客户端在没有进行数据交互的时候向服务端发送心跳包,服务器收到后进行反馈,如果多次没有反馈,客户端则终止连接。

参考

https://course.0voice.com/v1/course/intro?courseId=2&agentId=0