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配置此两项属性，指定检测周期和空闲超时时间。