Keepalive 与 idle监测
- Keepalive(保活): Keepalive 是一种机制,通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息(称为keepalive消息)实现的。如果在预定时间内未收到回复,那么发送方可以认为另一方已经失去响应,可能会关闭连接。这种机制对于长时间保持连接,但可能不频繁交换数据的场景特别有用,比如数据库连接或长期的网络会话。
- Idle 监测(空闲监测): Idle 监测是指监测网络连接在一段时间内是否有数据传输。如果在这段时间内没有数据交换,那么认为连接是空闲的。空闲监测通常用于管理资源,如关闭长时间未使用的连接来释放资源。这在服务器环境中尤为重要,因为服务器可能需要处理大量的连接,而且资源(如内存和处理能力)是有限的。
两者的主要区别在于它们的目的和实施方式。Keepalive 主要用于确保连接双方知道对方仍然“活着”,并且连接是有效的。而Idle监测则用于确定一个连接在一段时间内是否有活动,以决定是否应该保持或关闭这个连接。Keepalive是通过定期发送控制消息来实现的,而Idle监测是通过观察一段时间内的数据传输活动来实现的。
在Linux内核中也有一个keepalive来确认对端的连接状态是否健康。
net.ipv4.tcp_keepalive_time = 7200 |
---|
net.ipv4.tcp_keepalive_intvl = 75 |
net.ipv4.tcp_keepalive_probes = 9 |
当启用(默认关闭)keepalive 时,TCP 在连接没有数据通过的7200秒后 发送keepalive 探测消息,当探测没有确认时,按75秒的重试频率重发, 一直发9 个探测包都没有确认,就认定连接失效。
所以总耗时一般为:2 小时11 分钟(7200 秒+ 75 秒* 9 次)
Server端开启TCP keepalive的两种方式
serverBootstrap.childOption(ChannelOption.SO_KEEPALIVE,true);
serverBootstrap.childOption(NioChannelOption.of(StandardSocketOptions.SO_KEEPALIVE),true);
除了在tcp网络层开启keepalive之外,我们普遍还需要在应用层启动keepalive,一般称之为:应用心跳(心跳机制 ),原因如下:
1、协议分层,各层关注点不同,网络传输层关注网络是否可达,应用层关注是否能正常提供服务
2、tcp的keepalive默认关闭,并且经过路由等中转设备后keepalive包有可能被丢弃
- Keepalive包的特性:Keepalive包是TCP协议中的空包,不携带数据,仅用于检测对端是否仍然可达。由于这些包没有数据负载,它们在网络中的优先级可能比正常的数据包要低。
- 网络设备的策略和配置:在复杂的网络环境中,路由器、防火墙或其他中间设备可能会根据自己的配置和策略处理流经的数据包。在某些情况下,这些