1、由于应用层心跳包涵盖的功能多点,所以满足负载的情况下,大多是采用应用层心跳包
2、数据包停止策略:不管tcp的keepalive 还是应用层心跳包当有数据发送的时候都是停止发送心跳包的,只有一段时间没有发送数据,满足写时间超时的情况下,才会主动发送心跳包。
3、tcpkeepalive是可以检测出网络连接中断的情况,只不过需要设置一些参数。把默认的探测时间设置小点,才能快速响应(实验见下)
4、客户端是可以知道链接断了的,这个中断是指链接断开。
图片中说客户端不知道链路中断可能是指的,链接没有断开,但是失效的情况,(网线脱落)。这种不管客户端还是服务端都无法确认,通常是通过心跳包看数据是否可达,再决定是否断开连接。
keepalive最主要的问题:
1、最主要的是到达不了应用层面,无法确认应用层面bug。比如程序死锁,或者过载。比如解码器死循环导致解码失效,有10w个连接,结果只处理了8w个的请求。
2、java不支持对keepalive单独设置,只能采取操作系统的参数,所以要采用keepalive全局需保持一致
2、由于数据包优先与keepalive导致的实时性降低(待实验),有数据发送的情况下不会发keepalive数据达到不了会触发超时重传,重传到达一定次数才会断开。比keepalive效率低
keepalive超时中断实验
采用本机服务端——》内网穿透—-》本机客户端模拟网线。
首先关闭keepalive,关掉本机网络(注意不要关内网穿透,关内网穿透相当于直接断开链路,断开本机网络是模拟网络失效,连接还在只不过失效),连接保持连接未中断。
接着开启keepalive,关闭网络,连接中断