tcp连接建立后,中间链路或对端节点异常崩溃或未正常关闭,自身无法感知,对此种连接,有可能网络抖动,也有可能是对方已经彻底崩溃,无法恢复,所以需要有连接探测机制:

  1. 有网络抖动现象的连接,要尽可能恢复其状态。
  2. 对无法恢复的连接,要及时清理,避免无效资源占用。

对此,有两种方案可配合使用:

  1. Linux提供了Keepalive机制,当连接空闲一定时间后,即向对方发送检测包,当连续N次无响应后,就切断连接。
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默认已启用)。

  1. beyod自身提供了检测机制,当客户端超过一定时间没有发送数据包时,就切断连接,释放资源。为此,需要定义两个值:

keepalive_timeout
当客户端超过此值的秒数没有发送数据包,连接视为空闲或异常, 默认为7200秒。

keepalive_interval
检查的间隔秒数,默认为723秒。

也就是说:每隔723秒进行一次全连接检测,如果连接超过7200秒没有发送数据包,视为空闲或异常,连接被强制断开,资源释放。

可以给listenner配置此两项属性,指定检测周期和空闲超时时间。