TCP 连接中的keep-alive
Posted 为了维护世界和平_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP 连接中的keep-alive相关的知识,希望对你有一定的参考价值。
目录
keep-alive
在一个长连接内,在一段期间,如果没有任何相关的活动,TCP保活机制开始作用。每隔一段时间,发送一个报文,如果连续几个报文都没有得到响应,则认为当前TCP连接已经失效。
内核中的变量
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_intvl
net.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 次探测。
说明
- 客户端和服务端正常工作,探测报文发送给对端,对端正常响应,则TCP保活变量被重置。
- 对端程序崩溃并重启,当TCP保活探测发送给对方,对端可以响应。但由于没有该链接的有效信息,会产生RST报文,TCP连接被重置。
- 对端程序崩溃,报文不可到达,多次探测后,TCP会报告该TCP链接已经死亡。
- 内核探测时间,最少需要经过 2 小时 75 秒; 时间太长,内核中的参数是可以设置的,但应用层需要感知是否是活动连接,需要在应用层增加传输协议。
保活机制
可以在两侧开启,也可以在一侧开启。
服务器端要探活client来保证自己不会维护无效连接,客户端来探活保持自己是不是可以持续申请资源。
好处
1、如果开启服务器端到客户端的检测,可以在客户端非正常断连的情况下清除在服务器端保留的“脏数据”;
- 2、开启客户端到服务器端的检测,可以在服务器无响应的情况下,重新发起连接。
应用层保活
应用层需要知道连接状态,在断开时做一些处理。在服务端与客户端设计心跳包,如客户端在没有进行数据交互的时候向服务端发送心跳包,服务器收到后进行反馈,如果多次没有反馈,客户端则终止连接。
参考
https://course.0voice.com/v1/course/intro?courseId=2&agentId=0
以上是关于TCP 连接中的keep-alive的主要内容,如果未能解决你的问题,请参考以下文章
谈谈Http长连接和Keep-Alive以及Tcp的Keepalive
KeepAliveHttp--Keep-Alive及Tcp--Keepalive