分析问题总结:
前提: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