当服务端不要求客户端必须回应心跳检测时,假如客户端遇到掉电等极端情况,这时服务端向客户端发送的心跳数据在TCP层面就会发送超时,遇到这种超时情况TCP会重试多次(次数及间隔依赖操作系统的配置),多次无果后会断开连接。这种极端情况从连接断开到服务端检测到可能要持续至少10分钟才触发onClose事件回调。
可以通过以下的设置来缩短超时情况下的断线吗?
$ vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 200
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
$ sysctl -p
以上设置以后似乎没有效果,使用 Gateway::getAllClientSessions() 依旧可以看到该连接,在设备断电第17分钟左右(有时候还要更久一点),该连接才下线。
求大大答疑解惑~
看了些资料有这样的说法,我没有做验证,你看下
另外net.ipv4.tcp_keepalive_time = 200 貌似太长了,200秒有些路由节点可能已经把连接路由清理了。
最好是60秒以内
谢谢大大答疑。