一:为什么需要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 检测
源码:
p.addLast("idea",new IdleStateHandler(0,20,0, TimeUnit.SECONDS));
childOption(ChannelOption.SO_KEEPALIVE,true) //不生效如果只是这么写的话