业务架构是:设备端—EMQX—业务服务器;
EMQX版本:5.1.1;
问题描述:最近几天出现了一个偶发问题,设备端开机连接MQTT后,正常定时发送业务消息,设备端开发人员进行了抓包,从抓包数据看可以收到ACK,但是通过EMQX的web控制台无法看到这个客户端,使用日志追踪功能也看不到任何消息。有4个设备最近一周出现类似问题
没看到就是没连上
但是设备端研发同事打印了pcap文件,上面显示PSH和ACK,就强调连上emqx了。所以两边争议点就在这里。还有,问题发生时设备端有发生重连,现在就是不知道是哪边的问题
那建议可以在 EMQX 服务器上 tcpdump
1、在EMQX上tcpdump有几个问题点 (1)EMQX有3个节点,是每个节点上都要tcpdump吗?(2)有上百个设备都连在EMQX上,等到问题发生时,tcpdump怎么能定位到问题设备?
2、设备端收到ACK能否说明已经连到EMQX了?
2、在设备端有网络的情况下,连接到emqx不断发生重连,会有哪些诱因?
烦请空闲时解答下
是的。
tcpdump 不会骗你的,没找到就是没连上。你 3 个节点,前面应该还有 nginx,或者 haproxy,在那上面做 tcpdump 也行。
上百个设备应该还算少的吧。而且你是可以在 tcpdump里面指定只 dump 指定 ip 的包的。
不清楚你说的是哪里的 ack,如果是 mqtt 的 connect ack 包里是 0,那就是连上了。
我猜不出来。得看日志。
source里面的ip是服务器,这样可以说明连上了吗
这没办法确定,你要把它转成mqtt包( wireshark自带的)
808这一条,是不是说明是mqtt broker主动关闭了连接?能看出来原因吗
麻烦大佬再给解答下
能不能把包直接发上来,只给一个图,想看的信息都没有。。。
我都判断不了。
已经传了。。。
- 第 805-806 行的协议变化:从 TCP 协议突然切换到 MQTT 协议。第 805 行显示的是 TCP 数据包,而第 806 行"Publish Message"(发布消息)信息的 MQTT 数据包。
- 第 810 行的 MQTT 断开连接:MQTT 协议显示了一个"Disconnect Req"(断开连接请求)消息。
- 第 815 行的端口变化:目标端口从 42886 变为 48646(在随后的多个数据包中可以看到)。
- 第 812-813 行的 RST 标志:这些 TCP 数据包设置了 RST(重置)标志,表明连接被突然终止。
- 第 812-813 行的 Win=0 值:这些 RST 数据包的窗口大小设置为 0,意味着不能再接收数据。
- 大量的 ACK 数据包:有大量的 ACK(确认)数据包,这可能表明存在重传或连接问题。
最显著的异常是 TCP 重置(RST)数据包,随后通信转移到不同的端口(48646),这表明原始连接异常终止,并使用不同的端口重新建立连接。
在第810行,可以看到从192.168.1.102(端口42886)发送到120.194.110.52(端口18831)的MQTT “Disconnect Req”(断开连接请求)消息。这表明是192.168.1.102这一方主动发起了MQTT层面的断开连接请求。
紧接着在第812-813行,出现了从120.194.110.52和192.168.1.102双方都发送了TCP RST(重置)标志的数据包,且窗口大小为0(Win=0)。
断开连接的顺序应该是:
808行这个FIN+ACK包表明,在MQTT断开连接请求之前,TCP层面上120.194.110.52已经开始尝试关闭连接。这是TCP四次挥手断开连接过程的第一步。
- 第807行:192.168.1.102发送ACK确认收到数据
- 第808行:120.194.110.52发送FIN+ACK开始关闭连接
- 第810行:MQTT层面192.168.1.102发送断开连接请求
- 第812-813行:双方发送RST强制终止连接
这表明在应用层MQTT断开请求之前,TCP层面已经开始了连接关闭过程。
从这个日志看,815 后。120.194.110.52 一直在单方面的向192.168.1.102(的不同端口)发超多的 tcp 消息。完全不明白为什么会这样。能提供一下详细的场景是什么么?
120.194.110.52 应该是 broker ?
192.168.1.102 是客户端?
而且里面没有 connect 包。你们是一个 IP 上使用多个客户端同时连 EMQX?所以才出现了这么多的端口?
我表示有太多的不理解。
192.168.1.102 是客户端,120.194.110.52 是 broker
这一点其实不太明确,为什么会尝试关闭连接?
场景是:设备上电后,需要给后台发送一条开机报文,后台收到后将业务上该设备的绑定信息回复设备。设备上如果没有收到,会一直发送
这个应该不是问题吧,原有的连接终止了,设备端重新建立连接发送报文,使用了跟上次连接不同的端口