wireshark 抓取的数据包

在这里插入图片描述

1. 连接建立概览流程图

MQTT 代理 MQTT 客户端 MQTT 代理 MQTT 客户端 阶段 1: TCP/TLS 握手 (底层网络) 阶段 2: MQTT 协议握手 包含: ClientID, 用户名/密码, 遗嘱消息, Keep Alive 等 包含: 返回码 0x00 (成功), 会话呈现标志 连接建立成功, 进入通信循环 包含: 非零返回码 (如 0x04, 0x05) 连接终止 alt [验证通过] [验证失败 (如非法ID、认证错误)] 发起 TCP 连接 (可选 TLS 握手) TCP 连接建立 发送 CONNECT 报文 返回 CONNACK 报文 返回 CONNACK 报文 关闭 TCP 连接

2. 核心步骤详解

第一步:建立底层连接 (TCP/TLS)

在发送任何 MQTT 报文之前,客户端必须先与代理服务器建立 TCP 连接。

  • 端口:默认端口为 1883 (非加密) 或 8883 (TLS 加密)。
  • 操作:MQTT 是基于 TCP 的长连接协议。如果需要安全性,会在 TCP 握手后进行 TLS/SSL 握手。

第二步:客户端发送 CONNECT 报文

客户端构造并发送 CONNECT 报文。这是 MQTT 连接的第一个报文,用于声明自己的身份和连接参数。
CONNECT 报文主要载荷包含:

字段名 说明
Client ID 客户端的唯一标识符。必须为 1-23 字节。如果为空,需由代理分配唯一 ID(需 Clean Session = true)。
Clean Session (v3.1.1) / Clean Start (v5.0) true 时,表示连接断开后不保留之前的会话状态(订阅、QoS 1/2 消息)。
Keep Alive 保活时间(秒)。在此时间内如果没有数据交互,客户端需发送 PINGREQ 保持连接。
User Name / Password 用于连接认证的用户名和密码。
Will Message (遗嘱) 如果客户端异常断开,代理将自动发布的消息(包含 Will Topic 和 Will Payload)。
协议级别 客户端支持的 MQTT 版本号(如 4 代表 3.1.1,5 代表 5.0)。

第三步:代理验证 CONNECT

代理收到 CONNECT 报文后,会对报文内容进行校验。校验内容通常包括:

  1. 协议版本匹配:代理是否支持客户端请求的 MQTT 版本。
  2. Client ID 合法性:是否符合长度限制,是否已被允许重复连接。
  3. 认证鉴权:用户名和密码是否正确(或通过扩展插件/服务认证)。
  4. 权限检查:是否有权限连接、是否允许设置遗嘱等。

第四步:代理返回 CONNACK 报文

无论验证成功与否,代理都必须回复 CONNACK 报文。
CONNACK 报文核心内容:

  • 会话呈现标志
    • 0:服务端已恢复与客户端之前的会话状态。
    • 1:服务端没有已存储的会话状态(这是一个全新的会话)。
  • 连接返回码:最关键的字段,决定连接是否成功。
返回码 (十进制) 含义 描述
0 已连接 连接成功,可以开始通信。
1 连接不可接受 (协议错误) 协议版本不匹配。
2 标识符拒绝 Client ID 格式错误。
3 服务器不可用 服务端当前无法处理请求。
4 用户名或密码错误 认证失败。
5 未经授权 客户端未被授权连接。
结果判定:
  • 如果 Return Code = 0:连接正式建立,TCP 通道保持打开,可以开始发送 SUBSCRIBE 或 PUBLISH 报文。
  • 如果 Return Code ≠ 0:表示连接被拒绝。代理发送完 CONNACK 后,会主动断开 TCP 连接。

3. 关键注意事项

  1. Keep Alive 机制:连接建立后,如果 Keep Alive 时间设置为 60秒,那么在 60秒内如果没有其他报文流动,客户端必须发送 PINGREQ,代理回复 PINGRESP。如果超过 1.5 倍 Keep Alive 时间没有收到任何报文,代理会认为客户端已断开。
  2. Clean Session vs 持久会话
    • Clean Session = true:适合在线采集设备,断线即重置,不关心离线消息。
    • Clean Session = false:适合需要高可靠性的场景。客户端断线后,代理会为其保留未确认的 QoS 1/2 消息和订阅关系,待客户端重连后(ClientID 一致)立即推送。
  3. 遗嘱机制:主要用于检测设备异常掉线(如断电)。如果是正常发送 DISCONNECT 报文断开,代理将不会发送遗嘱消息。

4. Mermaid 代码 (可直接复制使用)

MQTT Broker MQTT Client MQTT Broker MQTT Client TCP 连接建立 发送 CONNECT 报文 - ClientID - Clean Session - Keep Alive - Username/Password - Will Flag 验证 ClientID 和 鉴权 **连接建立成功** 主动断开 TCP alt [认证成功且参数合法] [认证失败或参数错误] TCP SYN 1 TCP SYN/ACK 2 TCP ACK 3 MQTT CONNECT 4 MQTT CONNACK (Return Code: 0) 5 MQTT CONNACK (Return Code: 2-5) 6 TCP FIN 7
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐