【问题标题】:MQTT (Mosquitto) QoS 2: how to forget message with missing PUBRELMQTT (Mosquitto) QoS 2:如何忘记缺少 PUBREL 的消息
【发布时间】:2022-07-12 22:09:09
【问题描述】:

根据 MQTT 规范,MQTT 客户端发送的 QoS 2 消息必须遵循以下工作流程:

在各个阶段,Mosquitto 将消息存储在其内存中。这也通过查看蚊子.db持久化存储使用db_dump工具描述here

问题是:如果一个恶意客户端PUBLISH 有大量具有 QoS 2 的消息,但从不发送PUBREL 消息作为对PUBREC 的响应,会发生什么? Mosquitto 不明确地保留消息?我希望某种配置参数能够在一段时间后摆脱这种未确认的消息,但我找不到。

【问题讨论】:

    标签: mqtt mosquitto paho


    【解决方案1】:

    我不是 100% 确定,但我认为 max_inflight_messages 设置应该在这里启动,并且在第一个完成之前不允许客户端发送第二个 QOS 2 消息。

    这将限制每个客户端一次接收一条恶意消息。

    有许多库可以让您对何时发送数据包进行低级别控制,因此构建 PoC 应该不会那么难。如果有可能触发 DoS 风格的攻击,我相信 eclipse/mosquitto 会很好地查看带有修复程序的 Pull Request。

    【讨论】:

    • max_inflight_messages 很有趣,尽管事实上每个客户部分在这里描述github.com/eclipse/mosquitto/blob/master/mosquitto.conf 而不是在这里(它似乎是一个全局选项)mosquitto.org/man/mosquitto-conf-5.html
    • 顺便说一句,使用 max_inflight_messages 我看到了相反的问题:如果出于任何原因,客户端不是恶意的,但无法为少数消息完成其 QoS 2 握手的部分(PUBREL),则它在达到其 max_inflight_messages 配额后被完全阻止。我仍然认为 mosquitto 应该有自己的东西可以摆脱(过期超时?管理 cli 命令?)生活在这样一个“边缘”中的 QoS 2 消息,即等待一个永远不会到来的 PUBREL。
    • 和现在一样,如果发送者或接收者丢失了一条消息,对方会重新发送它。如果发送方无法获得 PUBACK/PUBREL/PUBCOMP,它必须停止发送新消息,否则接收方可能会收到大量无法管理的消息。
    最近更新 更多