MQTT V3.1.1 协议 规范

本文档详细介绍了MQTT V3.1.1协议,包括控制包格式、数据表示、控制包结构以及各种类型如CONNECT、PUBLISH、SUBSCRIBE等的操作流程。内容涵盖术语、数据表示、协议头、报文类型、QoS级别、主题名称与过滤器、错误处理和安全考虑。此外,还讨论了使用WebSocket作为网络传输的可能性。
摘要由CSDN通过智能技术生成

目录

1.简介

1.1术语

​1.2 数据表示

1.2.1 位

1.2.2整数数据值

1.2.3 UTF-8编码的字符串

2 MQTT控制包格式

2.1 MQTT控制包的结构

2.2 固定报头

2.2.1 MQTT控制报文类型

2.2.2 标志

2.2.3剩余长度

2.3 可变报头

2.3.1 数据包标识符

2.4 有效载荷

3 MQTT控制包

3.1 CONNECT –客户端请求与服务器的连接 

3.1.1 固定头

3.1.2 可变头

3.1.3 有效载荷

3.1.4 应答

3.2 CONNACK –确认连接请求

3.2.1 Fixed header

3.2.2 Variable header

3.2.3有效载荷

3.3 PUBLISH – 发布消息

3.3.1 Fixed header

3.3.2  Variable header

3.3.3 Payload

3.3.4 Response

3.3.5 Actions

3.4 PUBACK –发布确认

3.4.1 Fixed header

3.4.2 Variable header

3.4.3 Payload

3.4.4 Actions

3.5 PUBREC –发布已接收(QoS 2已发布,第1部分)

3.5.1 Fixed header

3.5.2 Variable header

3.5.3 Payload

3.5.4 Actions

3.6 PUBREL –发布发布(已收到QoS 2发布,第2部分)

3.6.1 Fixed header

3.6.2 Variable header

3.6.3 Payload

3.6.4 Actions

3.7 PUBCOMP –完成发布(已收到QoS 2发布,第3部分)

 3.7.1 Fixed header

3.7.2 Variable header

3.7.3 Payload

3.7.4 Actions

3.8 SUBSCRIBE-订阅主题

 3.8.1 Fixed header

3.8.2 Variable header

 3.8.3 Payload

3.8.4 Response

3.9 SUBACK –订阅确认

3.9.1 Fixed header

3.9.2 Variable header

3.9.3 Payload

3.10 UNSUBSCRIBE–退订主题

3.10.1 Fixed header

3.10.2 Variable header

3.10.3 Payload

3.10.4 Response

3.11 UNSUBACK-取消订阅确认

3.11.1 Fixed header

3.11.2 Variable header

3.11.3 Payload

3.12 PINGREQ – PING请求

3.12.1 Fixed header

3.12.2 Variable header

3.12.3 Payload

 3.12.4 Response

3.13 PINGRESP – PING响应

3.13.1 Fixed header

3.13.2 Variable header

3.13.3 Payload

3.14 DISCONNECT –断开通知

3.14.1 Fixed header

3.14.2 Variable header

3.14.3 Payload

3.14.4 Response

4   Operational behavior

4.1 Storing state

4.1.1非规范说明示例

4.2网络连接

4.3服务质量级别和协议流

4.3.1 QoS 0: At most once delivery

4.3.2 QoS 1: At least once delivery

4.3.3 QoS 2: Exactly once delivery

4.4 Message delivery retry(消息重传)

4.5 Message receipt(消息回执)

4.6 Message ordering(消息排序)

4.7 Topic Names and Topic Filters(主题名称和主题过滤器)

4.7.1 Topic wildcards(主题通配符)

4.7.2  Topics beginning with $(以$开头的主题)

4.7.3 Topic semantic and usage(主题的语法和用法)

4.8 Handling errors(错误处理)

5 安全

5.1 简介

5.2 MQTT解决方案:安全性和认证

5.3 轻量级加密和受约束的设备

5.4实施说明

5.4.1 服务器对客户端的身份验证

5.4.2 服务器对客户端的授权

5.4.3 客户端对服务器的身份验证

5.4.4 应用消息和控制包的完整性

5.4.5 应用消息和控制包的私有性

5.4.6 不可拒绝的消息传输

5.4.7 检测客户端和服务器的危害

5.4.8 检测异常行为

5.4.9 其他安全考虑

5.4.10 Use of SOCKS

5.4.11安全配置文件

6   Using WebSocket as a network transport

6.1 IANA注意事项

7 一致性

7.1一致性指标

7.1.1 MQTT服务器

7.1.2 MQTT客户端

8.  Wirshark 抓包截图


1.简介

1.1术语

在本规范中,关键字“必须”,“不得”,“必须”,“应”,“应不”,“应”,“不应”,“建议”,“可以”和“可选”是 如IETF RFC 2119 [RFC2119]中所述进行解释。

网络连接(Network Connection):

由MQTT使用的基础传输协议提供的构造。

  • 将客户端连接到服务器。
  • ·它提供了在两个方向上发送有序的无损字节流的方法。

有关示例,请参见第4.2节。

应用信息(Application Message

MQTT协议通过网络为应用程序承载的数据。当MQTT传输应用程序消息时,它们具有关联的服务质量和主题名称。

客户端Client):

使用MQTT的程序或设备。客户端始终建立与服务器的网络连接。它可以

  • 发布其他客户端可能感兴趣的应用程序消息。
  • 订阅以请求有兴趣接收的应用程序消息。
  • 退订以删除对应用程序消息的请求。
  • 断开与服务器的连接。

服务器(Server

一种程序或设备,充当发布应用程序消息的客户端和进行订阅的客户端之间的中介。服务器

  • 接受来自客户端的网络连接。
  • 接受客户端发布的应用程序消息。
  • 处理来自客户端的订阅和取消订阅请求。
  • 转发与客户端订阅匹配的应用程序消息。

订阅(Subscription

订阅包括主题过滤器和最大QoS。订阅与单个会话关联。一个会话可以包含多个订阅。会话中的每个订阅都有一个不同的主题过滤器。

主题名称(Topic Name)

附加到应用程序消息的标签,该标签与服务器已知的订阅相匹配。服务器将应用程序消息的副本发送给具有匹配订阅的每个客户端。

主题过滤器(Topic Filter)

订阅中包含的一种表达,表示对一个或多个主题感兴趣。主题过滤器可以包含通配符。

会话(Session)

客户端和服务器之间的状态交互。某些会话的持续时间仅与网络连接的时间相同,而其他会话则可以跨越客户端和服务器之间的多个连续的网络连接。

MQTT控制数据包(MQTT Control Packet:)

通过网络连接发送的信息包。 MQTT规范定义了十四种不同类型的控制包,其中一种(发布包)用于传达应用消息。

 

1.2 数据表示

1.2.1 位

字节中的位标记为7到0。位号7是最高有效位,最低位是0。

1.2.2整数数据值

整数数据值,16位按大端顺序:

高位字节位于低位字节之前。 这意味着在网络上将16位字表示为最高有效字节(MSB),然后是最低有效字节(LSB)。

1.2.3 UTF-8编码的字符串

稍后描述的控制包中的文本字段被编码为UTF-8字符串。 UTF-8 [RFC3629]是Unicode [Unicode]字符的有效编码,可优化ASCII字符的编码以支持基于文本的通信。

这些字符串中的每个字符串都有两个字节的长度字段作为前缀,该字段给出了UTF-8编码的字符串本身的字节数,如下图1.1所示。 因此,在这些UTF-8编码的字符串组件之一中可以传递的字符串的大小受到限制。 您不能使用编码超过65535个字节的字符串。

除非另有说明,否则所有UTF-8编码的字符串的长度都可以在0到65535字节之间。

图1.1 Structure of UTF-8 encoded strings

Bit

7

6

5

4

3

2

1

0

byte 1

String length MSB

byte 2

String length LSB

byte 3 ….

UTF-8 Encoded Character Data, if length > 0.

UTF-8编码的字符串中的字符数据必须按照Unicode规范[Unicode]的规定,采用格式正确的UTF-8,并在RFC 3629 [RFC3629]中进行重述。 特别是,此数据不得包含U + D800和U + DFFF之间的代码点编码。 如果服务器或客户端收到包含格式错误的UTF-8的控制包,则必须关闭网络连接。

UTF-8编码的字符串不得包含空字符U + 0000的编码。 如果接收方(服务器或客户端)接收到包含U + 0000的控制包,则必须关闭网络连接

数据不应包含下面列出的Unicode [Unicode]代码点的编码。 如果接收方(服务器或客户端)接收到包含任何接收方的控制包,则可以关闭网络连接

U + 0001..U + 001F控制字符

U + 007F..U + 009F控制字符

Unicode规范[Unicode]中定义的代码点为非字符(例如U + 0FFFF)

UTF-8编码的序列0xEF 0xBB 0xBF始终应解释为表示U + FEFF(“零宽度无间断空格”),无论它出现在字符串中什么地方,并且一定不要被数据包接收器跳过或剥离。

2 MQTT控制包格式

2.1 MQTT控制包的结构

MQTT协议通过以定义的方式交换一系列MQTT控制包来工作。 本节介绍这些数据包的格式。

MQTT控制包最多由三部分组成,始终按以下顺序排列,如图2.1-MQTT控制包的结构所示。

Figure 2.1 – Structure of an MQTT Control Packet
固定报头(Fixed header), present in all MQTT Control Packets
可变报头(Variable header), present in some MQTT Control Packets
有效载荷(Payload), present in some MQTT Control Packets

2.2 固定报头

每个MQTT控制包都包含一个固定的报头。 图2.2-固定标头格式说明了固定标头格式。

图2.2 固定报文头格式
Bit 7 6 5 4 3 2 1 0

byte 1

MQTT 控制报文的类型

控制报文类型的标志位

byte 2…

剩余长度

2.2.1 MQTT控制报文类型

位置:字节1,位7-4。

表示为4位无符号值的值在表2.1-控制包类型中列出。

Table 2.1 - Control packet types

Reserved

0

禁止

保留

CONNECT

1

Client to Server

客户端请求连接服务器

CONNACK

2

Server to Client

连接报文确认

PUBLISH

3

Client to Server

          or

Server to Client

发布消息

PUBACK

4

Client to Server

          or

Server to Client

消息发布收到确认(QoS1)

PUBREC

5

Client to Server

          or

Server to Client

发布收到 (QoS2)

PUBREL

6

Client to Server

          or

Server to Client

发布释放(QoS2)

PUBCOMP

7

Client to Server

          or

Server to Client

发布完成(QoS2)

SUBSCRIBE

8

Client to Server

客户端订阅请求

SUBACK

9

Server to Client

订阅请求报文确认

UNSUBSCRIBE

10

Client to Server

客户端取消订阅请求

UNSUBACK

11

Server to Client

取消订阅报文确认

PINGREQ

12

Client to Server

心跳请求

PINGRESP

13

Server to Client

心跳响应

DISCONNECT

14

Client to Server

客户端断开连接

Reserved

15

Forbidden

系统保留

2.2.2 标志

固定报头中字节1的其余[3-0]位包含特定于每种MQTT控制数据包类型的标志,如下面的表2.2-标志位中所列。

如果在表2.2-标志位中将标志位标记为“保留”,则保留该标志位以备将来使用,并且必须将其设置为该表[MQTT-2.2.2-1]中列出的值。 如果收到无效标志,则接收方必须关闭网络连接[MQTT-2.2.2-2]。 有关处理错误的详细信息,请参见第4.8节。

Table 2.2 - Flag Bits

Control Packet

Fixed header flags

Bit 3

Bit 2

Bit 1

Bit 0

CONNECT

Reserved

0

0

0

0

CONNACK

Reserved

0

0

0

0

PUBLISH

Used in MQTT 3.1.1

DUP1

QoS2

QoS2

RETAIN3

PUBACK

Reserved

0

0

0

0

PUBREC

Reserved

0

0

0

0

PUBREL

Reserved

0

0

1

0

PUBCOMP

Reserved

0

0

0

0

SUBSCRIBE

Reserved

0

0

1

0

SUBACK

Reserved

0

0

0

0

UNSUBSCRIBE

Reserved

0

0

1

0

UNSUBACK

Reserved

0

0

0

0

PINGREQ

Reserved

0

0

0

0

PINGRESP

Reserved

0

0

0

0

DISCONNECT

Reserved

0

0

0

0

DUP =重复发送发布控制包

QoS =发布服务质量

RETAIN = PUBLISH保留标志

有关发布控制包中DUP,QoS和RETAIN标志的说明,请参见第3.3.1节。

注:事实上,除了PUBLISH类型报文以外,其他报文的标志位均为系统保留,PUBLISH 报文的第一字节bit3 是控制报文的重复分发标志(DUP),bit1-bit2 是服务质量等级,bit0 是PUBLISH 报文的保留标志,用于标识PUBLISH 是否保留,当客户端发送一个PUBLISH 消息到服务器,如果保留标识位置1,那么服务器应该保留这条消息,当一个新的订阅者订阅这个主题的时候,最后保留的主题消息应被发送到新订阅的用户。

2.2.3剩余长度

位置:从字节2开始。

剩余长度是当前数据包中剩余的字节数,包括变量头和有效载荷中的数据。 剩余长度不包括用于编码剩余长度的字节。

剩余长度使用可变长度编码方案进行编码,该方案使用单个字节表示最大127的值。较大的值按以下方式处理。 每个字节的最低有效七位对数据进行编码,而最高有效位用于指示表示中有后续字节。 因此,每个字节编码128个值和一个“连续位”。 剩余长度字段中的最大字节数为4。

2.3 可变报头

某些类型的MQTT控制包包含可变报头组件。 它位于固定标头和有效负载之间。 可变报头的内容取决于数据包类型。 可变报头的数据包标识符字段在几种数据包类型中是常见的。 

2.3.1 数据包标识符

许多控制数据包类型的可变报头组件都包含一个2字节的数据包标识符字段。 这些控制数据包是PUBLISH(QoS> 0),PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE和UNSUBACK。

SUBSCRIBE,UNSUBSCRIBE和PUBLISH(在QoS> 0的情况下)控制分组必须包含一个非零的16位分组标识符[MQTT-2.3.1-1]。

每次客户发送一个新的这些类型之一的数据包,它必须给它分配一个当前未使用的数据包标识符[MQTT-2.3.1-2]。

如果客户端重新发送一个特定的控制包,则它必须在该包的后续重新发送中使用相同的包标识符。 在客户端处理了相应的确认数据包后,数据包标识符就可以重用。 在QoS 1 PUBLISH的情况下,这是对应的PUBACK; 在QoS 2的情况下,它是PUBCOMP。

对于SUBSCRIBE或UNSUBSCRIBE,它是对应的SUBACK或UNSUBACK [MQTT-2.3.1-3]。

当服务器发送QoS> 0 [MQTT-2.3.1-4]的发布消息时,这些条件也适用于服务器。 

如果发布的包的QoS值设置为0 [MQTT-2.3.1-5],则它绝对不能包含包标识符。

PUBACK,PUBREC或PUBREL数据包必须包含与最初发送的PUBLISH数据包相同的数据包标识符[MQTT-2.3.1-6]。

同样,SUBACK和UNSUBAC

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值