女主宣言
在之前的文章中已简单介绍了MQTT协议报文的格式,本篇文章将对集中的连接协议进行详细的介绍,以及自己对该协议的一些思考和理解。
PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!
![640?wx_fmt=jpeg](https://img-blog.csdnimg.cn/img_convert/e42828819aa6c8d7c3a59f6506a8e5fb.png)
1
CONNECT
客户端和服务端建立连接之后,发送的第一个报文必须是CONNECT。客户端只能发送一次CONNECT报文,如果服务端收到了第二个CONNECT报文,必须将其视为错误,并且断开连接。
协议格式
固定报头
![640?wx_fmt=png](https://img-blog.csdnimg.cn/img_convert/8eb23836e63f22b36430b2b08ad5877b.png)
可变报头
可变报头分为四个部分,分别是协议名称(Protocol Name),协议级别(Protocol Level),连接标志(Connect Flags),保持连接(Keep Alive)。
协议名称
![640?wx_fmt=png](https://img-blog.csdnimg.cn/img_convert/f09be6bedda40307b568719db3f6e4e9.png)
1. 协议名是MQTT的UTF-8编码的字符串。MQTT规范的后续版本不会改变这个字符串的偏移和长度。
2. 如果协议不正确服务端断开连接。(MQTT 3.1.1)其他规范中可以有其他规范。
3. 数据包检测工具,可以使用协议名来识别MQTT流量。
协议级别
![640?wx_fmt=png](https://img-blog.csdnimg.cn/img_convert/272dfa01a7e17074b785f505018ad3be.png)
1. 使用8位来表示协议的修订版本级别。MQTT3.1.1的协议级别为4。这个也是MQTT5的由来,MQTT5的协议级别为5,故称为MQTT5。
2. 服务端收到一个自己不支持的协议级别的时候,必须返回一个returnCode为0x01的CONNACK的报文给客户端,随后服务端断开相应的连接。
连接标志
3. 服务端必须校验连接标志中的预留字段是否为0,如果不为0,必须断开该连接。
4. 清理会话标志
A. 清理会话标志的表现
a.清理会话标志为0(false)
i.如果已存在相同Clien