QoS等级问题

EMQX版本:5.1.6
1、如果QoS等级是1,如果发送方没有接收到PUBLISH,是否会一直发送PUBACK?什么情况下会停止发送PUBACK?
2、如果QoS等级是1,如果接收方离线后上线,还是否会接收到离线前QoS1的消息?

对问题 1 有一些疑问:

  • 发送方没有接收到 PUBLISH 是指什么?

问题2:
对于 QoS1 的消息在订阅者离线期间的投递:
如果订阅者开启了会话保持,离线后在会话过期前上线,会收到离线期间的 QoS1 消息。
开启会话保持:

  • 连接时使用 clean_session=false (mqtt v3.1.1)
  • 连接时使用 clean_startt=false (mqtt v5.0),且 session_expiry_interval>0

不好意思,问题1写反了
应该是:如果QoS等级是1,如果发送方没有接收到PUBACK,是否会一直发送PUBLISH?什么情况下会停止发送PUBLISH?
问题2:默认不开启会话保持是吗?不开启的话,是不是离线期间QoS1消息就被丢了?
问题3:如果Qos等级是2,如果不开启会话保持,是不是也不会收到离线期间的QoS2消息?

Q1:

发送方可以是 MQTT 客户端,也可以是 MQTT Broker.

  • 在发送方未接收到 PUBACK/PUBRECV 报文时,可以重发 PUBLISH 报文,但必须将重发标志位 DUP 设为1 (仅限 Qos>=1 的 PUBLISH 报文)。
    重发行为是客户端行为,是否重发取决于客户端实现和业务需要。

Q2:

会话保持也是客户端行为,需要在客户端发送 CONNECT 报文进行连接时设置。

Q3:

是的,客户端不开启会话保持,客户端的 Session 状态不会被 Broker 维护,Qos1 或 Qos2 消息也就不会被 Broker 保存。

建议你详细过一遍 MQTT 协议和 EMQX 文档。这些问题在其中都有说明。

一些常见问题列表:
https://www.emqx.io/docs/zh/v5.5/faq/faq.html

MQTT 5.0 协议文档:

一个 MQTT 5.0 协议文档的中文翻译项目: