一直以来对于KeepAlive不是很清楚,看到某些框架自己手写了心跳机制,但是一直不明白问什么,设置下keepAlive 不就可以了吗?为什么还要自己维护。
最近研究了下才发现我还是太年轻了。下面看下原因。
1、首先 KeepAlive 机制是TCP 中的概念。KeepAlive 并不是 TCP 协议的一部分,而是大多数操作系统都实现了这个机制,所以一些参数需要我们在操作系统层面设置 。KeepAlive 机制开启后,在一定时间内(一般时间为 7200s,参数 tcp_keepalive_time)在链路上没有数据传送的情况下,TCP 层将发送相应的 KeepAlive 探针以确定连接可用性,探测失败后重试 10(参数 tcp_keepalive_probes)次,每次间隔时间 75s(参数 tcp_keepalive_intvl),所有探测失败后,才认为当前连接已经不可用。
在 Netty 中开启 KeepAlive:
bootstrap.option(ChannelOption.SO_KEEPALIVE, true)
Linux 操作系统中设置 KeepAlive 相关参数,修改 /etc/sysctl.conf 文件:
net.ipv4.tcp_keepalive_time=90
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_probes=2
当设置为true的时候,TCP会实现监控连接是否有效,当连接处于空闲状态的时候,超过了2个小时,本地的TCP实现会发送一个数据包给远程的 socket,如果远程没有发回响应,TCP会持续尝试11分钟,知道响应为止,如果在12分钟的时候还没响应,TCP尝试关闭socket连接。
keepalive不是说TCP的常连接,当我们作为服务端,一个客户端连接上来,如果设置了keeplive为true,当对方没有发送任何数据过来,超过一个时间(看系统内核参数配置),那么我们这边会发送一个ack探测包发到对