MQTT 异常断开(一)

分析问题总结:
 前提:MQTT是基于TCP层再次封装,MQTT是不关心TCP层的实现与传输,但是如果TCP链路出现异常(丢失TCP ACK,网络延时TCP ACK等)一定会导致MQTT断开连接。
  MQTT代理服务器存在如下问题:
 a.代理服务器,对于 连接时没有及时处理收到模块关于TCP层的 TCP ACK(Seq确认包),出现重传MQTT Connect Ack。模块内部MQTT的处理逻辑,NQTT收到Connect Ack之后,模块已经准备就绪,回码OK,
  
   但是客户端MQTT代理服务器,要等到模块发给代理服务器,MQTT连接Connect Ack关于TCP层的TCP ACK才认为链路已经建立(模块内部MQTT对此透明);
 b.客户代理服务器,对于模块发布主题消息时,没有及时回复PUBACK,客户端等待超时,MQTT SDK内部启动关闭会话机制,关闭MQTT会话;
 c.客户代理服务器,不仅仅处理MQTT这一种协议,还负责处理HTTP/HTTPS等协议,在分析时,也有发现HTTP/HTTPS协议关于TCP层的TCP ACK丢失,链路断开。
  内部测试不能测试出来问题的推测:
 a.内部搭建的MQTT代理服务器,基本仅做MQTT测试使用,代理服务器的性能,以及网络环境都比客户现场的要好,另外测试环境网络状态单一,不能模拟客户使用的MQTT代理服务器环境;
 b.测试脚本,没有做到反复循环压测(前提是Qos=1)使MQTT的连接,订阅,发布频率达到代理服务的极限处理,即网络TCP层链路出现问题。
编译临时版本挂测
02、 03、 04版本内部挂测记录如下,每一次出现的Link Closed均已分析。
02版本挂测结果
原因客户MQTT代理服务器,没有响应TCP ack

原因:模块向MQTT代理服务器发送TCP ACK,但是代理服务器没有响应,TCP链路异常断开

原因:模块PUB主题消息成功,但是客户代理服务器在10秒内,没有回复模块PUBACK

原因:客户MQTT代理服务器没有发送给模块PUBACK,链路重置

03版本
原因:客户MQTT代理服务器回复TCP ACK延时,TCP已经发起链路重置

04版本测试:
原因:MQTT连接失败,客户MQTT代理服务器,没有收到确认的TCP ACK

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可能有多种原因导致 MQTT 连接经常断开,以下是一些可能的原因: 1. 网络不稳定:MQTT 是基于 TCP/IP 协议的,如果网络不稳定,连接就容易断开。 2. 心跳超时:MQTT 客户端和服务器之间会定期发送心跳包以保持连接,如果客户端或服务器在一定时间内没有收到心跳包,就会认为连接已经断开。 3. QoS 级别不合适:如果 QoS 级别设置过高,会导致消息重传次数增多,从而增加连接断开的可能性。 4. 客户端代码问题:如果客户端代码有 bug,也可能导致连接经常断开。 你可以检查以上几个方面,看看是否能够解决连接经常断开的问题。 ### 回答2: 使用Java代码连接MQTT经常断开连接的原因可能有以下几点: 1. 网络问题:断开连接的一个常见原因是网络不稳定。当网络质量较差或者有其他网络故障时,可能会导致MQTT连接断开。这可能是由于网络延迟、丢包或者中断等原因造成的。 2. 心跳超时:MQTT协议中,客户端和服务端之间使用心跳机制来维持连接的有效性。如果客户端在一定时间内(心跳超时时间)没有收到服务端的心跳响应,就会认为连接已经断开,然后主动断开连接。如果设置的心跳超时时间过短,可能会因为网络延迟等原因导致连接频繁断开。 3. 代码逻辑错误:在使用Java代码连接MQTT时,可能存在一些代码逻辑错误导致连接断开。比如没有正确处理MQTT连接异常情况,或者在处理消息等其他操作时出现错误。需要检查代码逻辑,并进行相应的错误处理和异常处理。 4. 服务器配置问题:连接MQTT时,服务器的相关配置也会影响连接的稳定性。比如服务器的最大连接数配置、连接超时时间配置等,都可能影响连接的稳定性。需要确认服务器的配置是否合理,并根据需要进行相应的调整。 5. 客户端配置问题:使用Java代码连接MQTT时,可能存在客户端的一些配置问题。比如连接超时时间设置过短、心跳超时时间设置不合理等。需要检查客户端的配置是否合理,并进行相应的调整。 总之,连接MQTT经常断开可能由于网络问题、心跳超时、代码逻辑错误、服务器配置问题或者客户端配置问题等原因。需要对这些可能的原因进行全面的检查和排查,然后针对具体问题进行相应的优化和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值