当在客户机和代理之间建立 TCP/IP 套接字连接时,需要协议级别会话。假设连接的方向是客户机到代理,并且客户机支持代理侦听器功能。
下表中显示固定的头格式。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节 1 | 消息类型(1) | DUP 标志 | QoS 级别 | RETAIN | ||||
0 | 0 | 0 | 1 | x | x | x | x | |
字节 2 | 剩余长度 |
在 CONNECT 消息中不使用 DUP、QoS 和 RETAIN 标志。
剩余长度是可变头(12 个字节)的长度和有效内容的长度。这可以是多字节字段。
下表中显示了可变头格式的示例。
描述 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
协议名 | |||||||||
字节 1 | 长度 MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节 2 | 长度 LSB(6) | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
字节 3 | 'M' | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
字节 4 | 'Q' | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
字节 5 | 'I' | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
字节 6 | 's' | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 |
字节 7 | 'd' | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
字节 8 | ‘p’ | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
协议版本号 | |||||||||
字节 9 | Version (3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
连接标志 | |||||||||
字节 10 | Will RETAIN (0) |
x | x | 0 | 0 | 1 | 1 | 1 | x |
保持活动计时器 | |||||||||
字节 11 | 保持活动 MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节 12 | 保持活动 LSB(10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
第一个 UTF 编码的字符串。客户机标识(Client ID)的长度在 1 和 23 个字符之间,并仅标识到代理的客户机。在连接到单个代理的所有客户机中,该名称必须是唯一的,它是处理消息标识带有 QoS 级别 1 和 2 消息的关键。如果客户机标识包含的字符超过 23 个,代理将以“CONNACK 返回码 2:标识被拒绝”响应 CONNECT 消息。
第二个 UTF 编码的字符串。Will 消息发布到 Will 主题。由 Will QoS 字段定义 QoS 级别,而 RETAIN 状态由可变头中的 Will RETAIN 标志定义。
第三个 UTF 编码的字符串。如果客户机意外断开,则 Will 消息定义发布到 Will 主题的消息内容。
尽管在 CONNECT 消息中 Will 消息是 UTF 编码的,但当它被发布到 Will 主题时,将只发送消息的字节,而不发送前两字节长度的内容。代理处理 Will 消息时发送的消息是原始 ASCII 格式,而不是 UTF 编码的。