# 3.9 SUBACK – 订阅确认

服务端发送SUBACK报文给客户端，用于确认它已收到并且正在处理SUBSCRIBE报文。

SUBACK报文包含一个返回码清单，它们指定了SUBSCRIBE请求的每个订阅被授予的最大QoS等级。

## 3.9.1 固定报头

#### 图例 3.24 – SUBACK报文固定报头

| **Bit** | **7**          | **6** | **5** | **4** | **3** | **2** | **1** | **0** |
| ------- | -------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| byte 1  | MQTT控制报文类型 (9) | 保留位   |       |       |       |       |       |       |
|         | 1              | 0     | 0     | 1     | 0     | 0     | 0     | 0     |
| byte 2  | 剩余长度           |       |       |       |       |       |       |       |

**剩余长度字段**

等于可变报头的长度加上有效载荷的长度。

## 3.9.2 可变报头

可变报头包含等待确认的SUBSCRIBE报文的报文标识符。[图例 3.25 – SUBACK报文可变报头](https://mcxiaoke.gitbook.io/mqtt/03-controlpackets/pages/-LvE6CZLYZWSa337cw8q#_图例_3.25_–) 描述了可变报头的格式。

#### 图例 3.25 – SUBACK报文可变报头

| **Bit** | **7**     | **6** | **5** | **4** | **3** | **2** | **1** | **0** |
| ------- | --------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| byte 1  | 报文标识符 MSB |       |       |       |       |       |       |       |
| byte 2  | 报文标识符 LSB |       |       |       |       |       |       |       |

## 3.9.3 有效载荷

有效载荷包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序**必须**和SUBSCRIBE报文中主题过滤器的顺序相同 \[MQTT-3.9.3-1]。

[图例 3.26 – SUBACK报文有效载荷格式](https://mcxiaoke.gitbook.io/mqtt/03-controlpackets/pages/-LvE6CZLYZWSa337cw8q#_Figure_3.26_-) 描述了有效载荷中单字节编码的返回码字段。

#### 图例 3.26 – SUBACK报文有效载荷格式

| **Bit** | **7** | **6** | **5** | **4** | **3** | **2** | **1** | **0** |
| ------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
|         | 返回码   |       |       |       |       |       |       |       |
| byte 1  | X     | 0     | 0     | 0     | 0     | 0     | X     | X     |

允许的返回码值：

* 0x00 - 最大QoS 0
* 0x01 - 成功 – 最大QoS 1
* 0x02 - 成功 – 最大 QoS 2
* 0x80 - Failure  失败

0x00, 0x01, 0x02, 0x80之外的SUBACK返回码是保留的，**不能**使用\[MQTT-3.9.3-2]。

### 有效载荷非规范示例

> [图例 3.27 -有效载荷字节格式非规范示例](https://mcxiaoke.gitbook.io/mqtt/03-controlpackets/pages/-LvE6CZLYZWSa337cw8q#_Figure_3.27_-) 展示了在 [表格 3.6 -有效载荷非规范示例](https://mcxiaoke.gitbook.io/mqtt/03-controlpackets/pages/-LvE6CZLYZWSa337cw8q#_Table_3.5_-) 简要描述的SUBACK报文的有效载荷。

#### 表格 3.6 -有效载荷非规范示例

| Success - Maximum QoS 0 | 0   |
| ----------------------- | --- |
| Success - Maximum QoS 2 | 2   |
| Failure                 | 128 |

#### 图例 3.27 -有效载荷字节格式非规范示例

|        | **描述**                  | **7** | **6** | **5** | **4** | **3** | **2** | **1** | **0** |
| ------ | ----------------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| byte 1 | Success - Maximum QoS 0 | 0     | 0     | 0     | 0     | 0     | 0     | 0     | 0     |
| byte 2 | Success - Maximum QoS 2 | 0     | 0     | 0     | 0     | 0     | 0     | 1     | 0     |
| byte 3 | Failure                 | 1     | 0     | 0     | 0     | 0     | 0     | 0     | 0     |

## 第三章目录 MQTT控制报文

* [3.0 Contents – MQTT控制报文](/mqtt/03-controlpackets.md)
* [3.1 CONNECT – 连接服务端](/mqtt/03-controlpackets/0301-connect.md)
* [3.2 CONNACK – 确认连接请求](/mqtt/03-controlpackets/0302-connack.md)
* [3.3 PUBLISH – 发布消息](/mqtt/03-controlpackets/0303-publish.md)
* [3.4 PUBACK –发布确认](/mqtt/03-controlpackets/0304-puback.md)
* [3.5 PUBREC – 发布收到（QoS 2，第一步）](/mqtt/03-controlpackets/0305-pubrec.md)
* [3.6 PUBREL – 发布释放（QoS 2，第二步）](/mqtt/03-controlpackets/0306-pubrel.md)
* [3.7 PUBCOMP – 发布完成（QoS 2，第三步）](/mqtt/03-controlpackets/0307-pubcomp.md)
* [3.8 SUBSCRIBE - 订阅主题](/mqtt/03-controlpackets/0308-subscribe.md)
* [3.9 SUBACK – 订阅确认](/mqtt/03-controlpackets/0309-suback.md)
* [3.10 UNSUBSCRIBE –取消订阅](/mqtt/03-controlpackets/0310-unsubscribe.md)
* [3.11 UNSUBACK – 取消订阅确认](/mqtt/03-controlpackets/0311-unsuback.md)
* [3.12 PINGREQ – 心跳请求](/mqtt/03-controlpackets/0312-pingreq.md)
* [3.13 PINGRESP – 心跳响应](/mqtt/03-controlpackets/0313-pingresp.md)
* [3.14 DISCONNECT –断开连接](/mqtt/03-controlpackets/0314-disconnect.md)

## 项目主页

* [MQTT协议中文版](https://github.com/mcxiaoke/mqtt)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mcxiaoke.gitbook.io/mqtt/03-controlpackets/0309-suback.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
