MQTT协议解析(上)

一:背景:

MQTT协议是基于TCP/IP协议栈构建的异步通信协议,是轻量级的发布订阅传输协议,MQTT将发布者和接受者中间进行分离,可以在不可靠的网络中进行拓展,适用于设备硬件存储空间有限或者网络带宽有限的场景。

注:MQTT协议支持TLS/SSL的加密通信,保证信息安全。

二:名词解构:

1:Client(客户端):发布消息,订阅/取订消息,连接/断开代理的连接。

2:Server:(服务端/代理端):充当发布消息的客户端和已订阅的客户端的中介。

 接受多个订阅者,只接受一个发布者,点对点。

处理客户端/订阅者的各类诉求。

转发与客户端订阅匹配的消息。

3:Topic(主题):消息的类型,订阅者在订阅后就会接收到该主题内容/负载。

4:Payload(负载):消息的内容。

5:Session(会话):客户端和服务器之间的信息交互。

三:三种服务质量(QOS)

1:QOS 0:最多一次,这一级别会发生消息丢失或者重复,其依赖于TCP/IP网络,<=1次

2:QOS 1:至少发送一次(至少一次的将消息发送给订阅者),消息会确保到达,但是消息会重复 >=1次。

3:QOS 2:只有一次,发送一次消息(必然到达) =1,适用于严格计费的系统,花销也大。

 

     

四:MQTT的三大结构之:固定头

 

1:固定头:存在于所有的MQTT数据包中,表示数据包类型及数据包分组类标识,包括:连接,发布,订阅。

固定头=消息类型+DUP+可靠等级+RETAIN

地址\bit 7 6 5 4 3 2 1 0
Byte1 MQTT数据包类型 不同类型MQTT数据包具体标识
Byte2                                      剩余长度

内容长度:八位四字节:0~127,若其为大于127的值,用最高位表示是否有后续字节,数据包最大可以容纳256MB的数据。

所以,第一个字节的高四位可以确定消息报文的类型;4个bit位可以确定16种类型;0000和1111是保留字段。

MQTT中有关Bit的知识:

Bit的【3-0】位:为标志位,用来控制报文的类型的字段

(1):其中Bit【3】为DUP字段,若是DUP=1,则该数据包为一条重复的消息,否则该数据为第一次发布的消息。

(2):Bit【2-1】为QOS 字段:QOS 0:Bit1=0 Bit2=0 至多一次消息发送。

QOS1:Bit1=1 Bit2=0 至多一次消息发送。

QOS2:Bit1=0 Bit2=1只发送一次消息。

非法:Bit1=1Bit2 空置,服务器认为非法会关闭当前连接。

目前Bit【3-0】只在PUBLISH协议中生效,且指定为MQTT 3.11/5.0版本。

PUBLISH中的Bit【0】中的RETAIN字段,发布了保留标识,当Bit【0】=1:表示服务器要求保留这次推送的消息,如果有新的订阅者出现,则将此消息推送给他,若没有,则将此次消息推送至已有订阅者之后再释放。

MQTT的消息报文类型如下:Bit【7-4】位

报文类型 字段位 数据方向 描述 7-4位Bit位
保留 0 禁用 保留 0000
CONNECT 1 Client-->Server 客户端连接到服务器 0001
CONNACK 2 Server-->Client 连接确认 0010
PUBLISH 3 Client<-->Server 发布消息 0011
PUBACK 4 Client<-->Server 发布确认(QOS1) 0100
PUBREC 5 Client<-->Server 消息已接受(QOS2第一阶段 0101
PUBREL 6 Client<-->Server 消息释放(QOS2第二阶段 0110
PUBCOMP 7 Client<-->Server 发布结束(QOS2第三阶段 0111
SUBSCRIBE 8 Client<-->Server 客户端订阅请求 1000
SUBACK 9 Server-->Client 服务端订阅缺失 1001
UNSUBSCRIBE 10 Client-->Server 客户端取消订阅确认 1010
UNSUBACK 11 Server-->Client 服务端取消订阅确认 1011
PINGREQ 12 Client-->Server 客户端发送心跳 1100
PINGRESP 13 Server-->Client 服务端回复心跳 1101
DISCONNECT 14 Client-->Server 客户端断开连接请求 1110
AUTH(V5.0使用) 15 Client<-->Server 认证数据交换 1111

                                      


你可能感兴趣的:(网络,服务器,运维,1024程序员节)