当前位置:   article > 正文

MQTT 异常断开(一)

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号