tcp连接建立后,中间链路或对端节点异常崩溃或未正常关闭,自身无法感知,对此种连接,有可能网络抖动,也有可能是对方已经彻底崩溃,无法恢复,所以需要有连接探测机制:
对此,有两种方案可配合使用:
tcp_keepalive_probes:探测次数
tcp_keepalive_time 探测的超时
tcp_keepalive_intvl 探测间隔
对于一个已经建立的tcp连接。如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 eepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有 收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。例如:
tcp_keepalive_probes = 3;
tcp_keepalive_time = 30;
tcp_keepalive_intvl = 1;
意思就是说对于tcp连接,如果连接上有数据来往就不会触发keepalive,但是超过30秒没有数据来往,则keepalive开始工作:发送探测包,收到响应则认为连接正常,结束探测;
如果没有响应就每隔1秒发探测包,一共发送3次,3次后仍没有响应,
就关闭连接,也就是从连接异常断开到检测完成最多需要33秒。
可以在/etc/sysctl.conf中设置以上参数。同时这需要socket启用keepalive(beyod默认已启用)。
keepalive_timeout
当客户端超过此值的秒数没有发送数据包,连接视为空闲或异常, 默认为7200秒。
keepalive_interval
检查的间隔秒数,默认为723秒。
也就是说:每隔723秒进行一次全连接检测,如果连接超过7200秒没有发送数据包,视为空闲或异常,连接被强制断开,资源释放。
可以给listenner配置此两项属性,指定检测周期和空闲超时时间。