MQTT 协议进阶

287 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

MQTT 报文结构

MQTT报文由三部分组成,分别为:

  • 固定报头(Fixed header):包含报文类型等字段,所有的MQTT都有固定报头。
  • 可变报头(Variable header):根据报文类型的不同而改变,一些报文可以不包含可变报头。
  • 载荷(Payload):通常是与业务/场景有关

消息服务质量(Qos)

MQTT协议提供了3中消息服务质量等级(Quality of Service),保证了在不同网络环境下消息传递的可靠性。

  • QoS 0:消息最多传递一次,如果客户端不可用,则会丢失该消息。
  • QoS 1:消息传递至少一次。
  • QoS 2:消息必须成功一次。

清除会话(Clean Sessino)

MQTT客户端向服务器发起连接的请求时,可以通过Clean Session标志设置是否创建全新的会话。

  • Clean Session = 0:
    • 如果存在一个关联此客户端标识符的会话,服务端必须基于此会话的状态恢复与客户端的通信。
    • 如果不存在任何关联此客户标识的会话,服务端必须创建一个新的会话。
  • Clean Session = 1:客户端和服务端必须清除已存在的会话,并创建一个新的会话。

心跳机制(Keep Alive)

MQTT客户端向服务器发起连接的请求时,通过Keep Alive设置生命周期

客户端在无报文发送是,按照Keep Alive周期定时发送2字节的心跳报文,服务端收到心跳报文后,回复2字节的心跳报文。

服务端在1.5个心跳周期内,即没有收到客户端发布订阅报文,也没有心跳报文时,将断开客户端连接。

保留消息(Retained Message)

MQTT客户端向服务器发布消息时,可以设置保留消息。保留消息会驻留在消息服务器,后来的订阅者订阅主题时,可以接收到最新一条的保留消息。

遗嘱消息(Will Message)

MQTT客户端向服务端发送连接请求时,可以携带遗嘱消息。客户端异常下线时(客户端断开前未向服务器发送断开连接消息),消息服务器则会发布遗嘱消息。