Receive Maximum 属性的含义

Receive Maximum 属性

官方解释:
为了支持流量控制,MQTT v5 新增了一个 Receive Maximum 属性,它存在于 CONNECT 报文与 CONNACK 报文,表示客户端或服务端愿意同时处理的 QoS 为 1 和 2 的 PUBLISH 报文最大数量,即对端可以使用的最大发送配额。如果接收端已收到但未发送响应的 QoS 大于 0 的 PUBLISH 报文数量超过 Receive Maximum 的值,接收端将断开连接避免受到更严重的影响。

有2个疑问, Receive Maximum 属性主要是订阅消息的参数吧,
目前mqtt发送端可以同时发送多条消息吗,TCP连接是一条消息一条消息发送吧,要等ACK返回了才能发送下一条消息,看上面同时发送是什么意思,是矛盾吗

你好,首先 TCP 连接没有必须等待 ACK 才能发送下一条消息的限制,然后 MQTT 的 QoS 0 消息是不需要 ACK 的,所以可以直接发送,而需要应答的 QoS 1 和 2 消息,则可以在收到应答前发送多条消息来提高效率。你可以看一下 MQTT 协议对这一块的定义。

如果没有收到前面消息的ack,后面再同时发送多条消息,怎么保证顺序呢,一直没理解,看了mqtt协议没有对这块说明

虽然没有收到 ACK,但是后面的消息也是按顺序发送的呀,所以对于接收方来说,自然也是按顺序收到的。这是由底层的 TCP 保证的。

不好意思,再问一下:有没有可能发送方没有收到ack,按顺序发送多条消息没问题,当时如果接收方没有收到中间某一条消息,造成乱序,因为没有接收方确认的消息返回,发送方也不知道有没有真正收到

底层 TCP 保证上层不会仅丢失中间的某条消息,如果有丢失,就是从这条消息开始,后面的一起丢了。

然后 QoS 1 机制下如果没有收到 ACK,就会有对应的重传,所以对于接收方来说,不用考虑丢失的情况,需要考虑的是消息重复以及如何处理的问题。

比如,发送方按 1,2,3 的顺序发送 QoS 1 消息,接收方收到的顺序可能是 1,2,3,2,3。

你可以放心的是,3 永远不会先于第一个 2 出现。

谢谢