Keepalive与Idel监测

556 阅读2分钟

一:为什么需要Keepalive

当 客户端与服务端长期无交互时
确认对方无返回时挂机  这就是keepalive

二:怎么设计Keepalive? 以及TCP keepalive为例

1:keepLive消息没有必要太频繁 
2:判断这个链接坏掉了是需要谨慎的不能够武断
   
TCP核心参数:
keepalive_time = 7200 代表7200s没有数据传输才会传递去检测
keepalive_intvl = 75 代表75s下一个探测波
keepalive_probes =9  一共有五个探测波

当启动keepalive时,TCP链接没有数据时 启动Keepalive
当7200s没有数据传输时启动kepplive检测
每次检测相隔75s 
一共检测9次如果9次都不存在那么就直接关闭链接

三:为什么还需要应用层keepalive

TCP 传输是分层的,每层代表的意义不通
传输层代表的是通 
应用层代表的是否可以服务

TCP层(应用层)keepalive默认关闭,且经过路由等中专包可能会被丢弃
TCP层的Keepalive时间太长
默认两小时 虽然可以修改 但属于系统参数,改动影响所有应用

注意区分HTTP的keep-Alive 如果Http的请求头代表的里面带了keep-Alive 
那么代表该Http是长连接 ,因为Http大多数都是1.1
所以默认带了这个参数所以抓包抓不到
Connection: Close 短链接 
Collection:keep-Alive 长连接 

四:Idel检测是什么

Idel: 对方走了 等待对方是否还会讲话,如果对方还不出 那意味着对面对状态异常
Kepp-allive 问对面是否在线

功能: 本身负责诊断 诊断后做出不同的行为 
例子: idea(无数据传输时)配合发送keeplive 
我们检测到idel 发送keeplive 也就是说减少keppalive的发送

核心功能:减少keepalive消息   

五:如何在Netty中开启TCP keepalive 和Idel 检测

源码:

image.png

p.addLast("idea",new IdleStateHandler(0,20,0, TimeUnit.SECONDS));

childOption(ChannelOption.SO_KEEPALIVE,true) //不生效如果只是这么写的话