MQTT学习笔记(3)报文分析之CONNECT

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41572450/article/details/82470154

CONNECT(连接服务端)


含义:客户端请求连接到服务器
一.固定报头

  • 0x10
  • 剩余长度

二.可变报头
依次包含4个字段

  • 协议名
  • 协议级别
  • 连接标志
  • 保持连接

    这里要说下连接标志
    这里写图片描述

Clean Session:清除会话标志
这个标志位用于控制会话状态的生存时间。
如果该位被设置为 0, 则该连接被认为是持久连接, 其具体表现为: 当该客户断开后, 任何订阅的主题和 QoS 被设置为 1 或 2 的信息都会保存, 直到该客户端再次连接上 server 端。
若clean session被设置为 1, 当该客户断开后, 所有的信息都会被移除。客户端和服务端必须丢弃之前的任何会话并开始一个新的会话。

Will QoS:
发送遗嘱消息的服务等级。

Will Flag:遗嘱标志
如果被设置为 1,表示如果连接请求被接受了, 遗嘱(Will Message) 消息必须被存储在服务端并且与这个网络连接关联。之后网络连接异常关闭时,服务端必须发布这个遗嘱消息, 除非正常断开。
如果被设置为 0, 连接标志中的 Will QoS 和 Will Retain 字段必须设置为 0, 并且有效载荷中不能包含 Will Topic 和 Will Message 字段。且网络异常断开时, 不能发送遗嘱消息。

Will Retain: 遗嘱保留标识
如果被写1, 遗嘱消息发布时将会保留且发送给新的订阅消息。

三.有效载荷
CONNECT的payload字段是根据可变报头的连接标志决定是否存在,如果存在,必须按照以下顺序出现

  • 客户端标识符(client ID)—必须存在
  • 遗嘱主题(will topic)
  • 遗嘱消息(will msg)
  • 用户名(user name)
  • 密码(password)

CONNACK(确认连接请求)


含义:连接确认请求,响应CONNECT
一.固定报头

  • 0x20
  • 0x02

二.可变报头

  • 连接确认标志
  • 连接返回码

连接确认标志:
如果服务端收到清理会话(CleanSession) 标志为 1 的连接,除了将 CONNACK 报文中的返回码设置为 0之外,还必须将 CONNACK 报文中的当前会话设置(Session Present) 标志为 0。如果服务端收到一个 CleanSession 为 0 的连接, 当前会话标志的值取决于服务端是否已经保存了 ClientId对应客户端的会话状态。 如果服务端已经保存了会话状态, 它必须将 CONNACK 报文中的当前会话标志设
置为 1。 如果服务端没有已保存的会话状态, 它必须将 CONNACK 报文中的当前会话设置为 0。 还需要将 CONNACK 报文中的返回码设置为 0 。当前会话标志使服务端和客户端在是否有已存储的会话状态上保持一致。

连接返回码:

返回码响应 描述
0 0x00 连接已接受 连接已被服务端接受
1 0x01 连接已拒绝,不支持的协议版本 服务端不支持客户端请求的 MQTT 协议级别
2 0x02 连接已拒绝, 不合格的客户端标识符 客户端标识符是正确的 UTF-8 编码, 但服务端不允许使用
3 0x03 连接已拒绝, 不合格的客户端标识符 网络连接已建立, 但 MQTT 服务不可用
4 0x04 连接已拒绝,无效的用户名或密码 用户名或密码的数据格式无效
5 0x05 连接已拒绝, 未授权 客户端未被授权连接到此服务器
6-255 保留

二.有效载荷


DISCONNECT(断开连接)


含义:客户端正常断开连接
一.固定报头

  • 0xE0
  • 0x00

一.可变报头

一.有效载荷


PINGREQ(心跳请求)


含义:客户端向服务器发送心跳请求
一.固定报头

  • 0xC0
  • 0x00

一.可变报头

一.有效载荷


PINGRESP(心跳响应)


含义:服务端响应服务器发送的心跳请求
一.固定报头

  • 0xD0
  • 0x00

一.可变报头

一.有效载荷



CONNECT示例

报文结构 固定报头
byte1 0x10
byte2 0x- -(剩余长度)
可变报头
byte1 0x00 (协议名MSB)
byte2 0x04 (协议名LSB)
byte3 0x4D (‘M’)
byte4 0x51 (‘Q’)
byte5 0x54 (‘T’)
byte6 0x54 (‘T’)
byte7 0x04 (协议级别3.1.1)
byte8 0x- -(连接标志)
byte9 0x- - (保活MSB)
byte10 0x- -(保活LSB)
有效载荷
byte … client ID
byte … will topic
byte … will msg
byte … user name
byte … password

下面用wireshark抓包分析下CONNECT报文
用MQTT.fx作为client 连接公共MQTT代理
这里写图片描述

这里写图片描述

这里写图片描述

CONNECT报文
这里写图片描述

10 1a 
00 04 4d 51 54 54 04 02 00 3c 
00 0e 4d 51 54 54 5f 46 58 5f 43 6c 69 65 6e 74

CONNACK报文
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41572450/article/details/82470154
今日推荐