服务器端主动发起FIN断开连接

环境

  • EMQX 版本:emqx-5.0.21-windows-amd64
  • 操作系统版本:windows

重现此问题的步骤

  1. 客户端每隔固定10s发送一包私有协议心跳包到emqx,服务器通过emqx应答私有协议心跳包。
  2. 长期运行一段时间后,通过wireshark抓包看,emqx主动发起了FIN包,导致设备和服务器的连接断开,发起FIN包前后设备和服务器都可以每隔10s正常通信。
  3. 客户设置的ping心跳时间是40s
  4. 服务器的ip地址是115.236.86.166
    awa.zip (173.3 KB)

想了解emqx在什么情况下会主动发起FIN包给设备呢?附件是通过wireshark抓取的网络数据。

看抓包,确实是 166 主动发的 FIN。但具体原因还看不出来。这种一般来说应该是有错误日志的,方便开下这个客户端的日志追踪看看么?

你好,我基于C语言开发,想请教一下有没有和emqx适配度高的mqtt客户端开源代码?客户端接收到FIN包之前都可以正常发送接收数据,客户端接收到FIN包后,发送数据会失败;接着会尝试重新连接,重新订阅主题成功后,发送ping包,重新连接服务器,但是会出现一直连接不成功,客户端设置了40s的ping心跳时间,服务器端emqx每隔40s发送一个FIN包给客户端

标准的 MQTT SDK 都行的(一般听说 paho C 的sdk 用的比较多)

这个 FIN 包导致链接断开的问题,建议是通过这个 日志追踪 (Trace) | EMQX文档

开启对这个 C 客户的客户端ID的日志追踪。这样就能看到过程中所有的 DEBUG 日志。就能分析为什么断开了

你确定你的C语言客户端,在空闲时间里,每隔40s向服务器发送 一个PINGREQ 包?
否则, 服务器端 close这个链接是正常的,因为 timeout。
这个可以在后台监控一下server 的log file, 看看是不是按时收到客户端的PINGREQ包,就知道了。

客户端是每隔10s发送一包数据,emqx也有正常应答,在emqx发送FIN包之前,还正常应答了客户端,并没有超过40s,详细看下抓包文件。我也怀疑是触发了 emqx的PINGREQ 包的timeout。
比如客户端设置了keepalive为40s, emqx是怎么统计PINGREG包的时长呢?是不是固定10s收到客户端的数据,就会统计清零重新计算PINGREG包的时长呢?