规范依据:TS 38.213 V18.7.0 §9.1.2 / §9.1.2a / §9.2.5 / §9.3
关键词:Type 2 HARQ-ACK Codebook, Counter DAI, Total DAI, dl-DataToUL-ACK, PUCCH Resource Set
在5G NR系统中,下行HARQ-ACK反馈是保证数据传输可靠性的最后一道防线。与LTE固定4ms的HARQ-ACK时序不同,NR引入了灵活的K1时序和两种码本构造方式(Type 1半静态 / Type 2动态),使得基站可以在时域、频域、空域三个维度上调度PDSCH,同时要求UE在一个PUCCH时隙内准确反馈所有已调度PDSCH的ACK/NACK状态。
动态码本(Type 2 HARQ-ACK Codebook) 的核心思想是:码本大小不固定,而是由DCI中携带的DAI(Downlink Assignment Index) 实时指示。这在TDD部署场景下具有决定性优势——当上下行配比为DDDSU或DDDDDDSUUU时,多个下行时隙的PDSCH需要在同一个上行时隙反馈HARQ-ACK,如果采用半静态码本,码本尺寸将膨胀到覆盖所有可能的PDSCH位置,造成PUCCH资源的大量浪费。
从行业影响角度来看,动态码本直接关系到: - 频谱效率:TDD网络中PUCCH开销可降低30%~50%(对比Type 1半静态码本) - 终端复杂度:DAI二维计数算法要求UE维护跨载波、跨监听时机的状态矩阵 - 互操作性:不同厂商基站对DAI计数策略的实现差异可能导致终端兼容性问题 - 网络优化:K1参数的配置直接影响HARQ RTT和系统吞吐量
UE通过RRC参数 pdsch-HARQ-ACK-Codebook 选择码本类型:
| RRC参数值 | 码本类型 | 规范章节 | 典型部署场景 |
|---|---|---|---|
semi-static |
Type 1(半静态) | §9.1.1 | FDD、低负载TDD |
dynamic |
Type 2(动态) | §9.1.2 | TDD高负载、CA场景 |
enhanced (Rel-18) |
Type 3(增强) | §9.1.2a | XR/URLLC多TRP |
RRC信令结构如下(简化):
PDSCH-Config ::= SEQUENCE {
pdsch-HARQ-ACK-Codebook ENUMERATED {semi-static, dynamic},
maxNrofCodeWordsPerSCell ENUMERATED {n1, n2},
...
}
PUCCH-Config ::= SEQUENCE {
dl-DataToUL-ACK SEQUENCE (SIZE (1..16)) OF INTEGER (0..15),
...
}
DAI是Type 2码本的核心控制字段,分为两个维度:
| DAI类型 | DCI字段名 | 作用 | 取值范围 |
|---|---|---|---|
| Counter DAI (C-DAI) | DAI in DCI 1_0/1_1 |
累计已调度的PDSCH数量(按服务小区+监听时机二维计数) | 0~3(2 bit循环) |
| Total DAI (T-DAI) | DAI in DCI 1_1/1_2(仅Format 1_1/1_2) |
当前PDCCH监听时机之前的累计PDSCH总数 | 0~3(2 bit循环) |
关键区别:DCI Format 1_0仅携带C-DAI,不携带T-DAI;DCI Format 1_1/1_2同时携带C-DAI和T-DAI。这意味着当网络混合使用DCI Format 1_0和1_1调度时,UE需要特别注意T-DAI的缺失情况。
DAI计数在两个维度上展开,形成二维矩阵:
DAI_counter(serving_cell, PDCCH_monitoring_occasion)

图表 1
Type 2 HARQ-ACK码本的构造遵循以下严格步骤:
Step 1:确定候选PDSCH接收时机
UE根据K1值集合 dl-DataToUL-ACK 确定哪些时隙的PDSCH需要在当前时隙n反馈。对于时隙n中的PUCCH传输,候选PDSCH接收时隙为 {n - K1 | K1 ∈ dl-DataToUL-ACK}。
Step 2:监听PDCCH并记录DAI
在每个候选时隙的每个PDCCH监听时机中,UE记录: - 成功检测到的DCI中的C-DAI和T-DAI - 是否检测到SPS PDSCH释放(也计入HARQ-ACK码本)
Step 3:确定码本大小
码本大小由最后一个PDCCH监听时机中的T-DAI值决定:
$$N_{HARQ-ACK} = T_{DAI,last} \times N_{CW}$$
其中 $N_{CW}$ 为每个服务小区的最大码字数(由 maxNrofCodeWordsPerSCell 指示)。
Step 4:填充HARQ-ACK比特
按照C-DAI顺序将ACK/NACK比特填入码本: - 如果某个C-DAI位置没有对应的PDSCH(DCI漏检),该位置填充 NACK - SPS PDSCH释放的ACK占据一个HARQ-ACK比特位置

图表 2
C-DAI为2 bit字段(值0~3),当累计PDSCH数量超过4时发生模4循环。这种设计节省了DCI开销,但引入了UE侧的同步复杂性:
| 累计PDSCH数 | C-DAI值 | T-DAI值 | 说明 |
|---|---|---|---|
| 1 | 0 | 1 | 正常 |
| 2 | 1 | 2 | 正常 |
| 3 | 2 | 3 | 正常 |
| 4 | 3 | 4→0 | T-DAI模4循环 |
| 5 | 0 | 1 | C-DAI循环回到0,T-DAI重新从1开始 |
| 6 | 1 | 2 | 新一轮 |
注意:T-DAI的循环行为与C-DAI不同——T-DAI表示的是"到目前为止的总数",而C-DAI是"当前监听时机中的累计数"。当T-DAI从3跳回0或1时,UE需要准确判断这是新一轮循环还是DCI漏检。
当UE检测到DAI不连续时(例如C-DAI从0跳到2,缺少1),UE可以判断发生了DCI漏检,并在对应位置填充NACK。这是Type 2动态码本相比Type 1半静态码本的重要优势之一——能够在码本中隐式指示DCI漏检。
检测规则: 1. C-DAI不连续:在同一个PDCCH监听时机内,C-DAI应当递增,如果跳变则说明漏检 2. T-DAI不匹配:T-DAI应 ≥ 同一监听时机内最大C-DAI,否则说明存在漏检 3. 跨监听时机C-DAI异常:新监听时机的首个C-DAI应从上一监听时机的最后一个C-DAI继续,如果异常则说明前一监听时机有漏检
K1参数由RRC参数 dl-DataToUL-ACK(或 dl-DataToUL-ACK-r16 / dl-DataToUL-ACK-r18)配置,定义了一组候选的PDSCH-to-HARQ-ACK反馈时隙偏移值。
| 参数 | 版本 | 取值范围 | 最大条目数 | 说明 |
|---|---|---|---|---|
dl-DataToUL-ACK |
Rel-15 | 0~15 | 8 | 基础K1集合 |
dl-DataToUL-ACK-r16 |
Rel-16 | 0~15 | 16 | 扩展支持更多K1值 |
dl-DataToUL-ACK-r18 |
Rel-18 | 0~15 | 16 | 多TRP场景增强 |
DCI中的 PDSCH-to-HARQ_ACK feedback timing indicator 字段从RRC配置的K1集合中选择一个具体值。该字段的bit宽度为 $\lceil \log_2(N_{K1}) \rceil$。
在TDD网络中,K1值的选择受到上下行配比的严格约束。以常见的 DDDSU(3D:1S:1U)配比为例:

图表 3
关键约束:K1指向的时隙必须是上行时隙(或包含上行符号的特殊时隙)。如果K1指向下行时隙,UE将延迟HARQ-ACK反馈到下一个可用的上行时隙(参见TS 38.213 §9.2.3)。
典型的K1配置策略: - DDDSU:K1 ∈ {4, 3, 1},避免K1=2(因为n-2对应的K1终点可能在下行时隙) - DDDDDDSUUU:K1 ∈ {8, 7, 6, 5, 4, 3, 2, 1},最后两个下行时隙可使用K1=1,2 - FDD:K1可自由选择,典型值为 {1, 2, 3, 4, 8}
当UE配置了载波聚合(CA)时,DAI计数在服务小区维度上扩展。C-DAI的计数顺序为:
这形成了规范的二维矩阵结构:
MO #0 MO #1 MO #2 MO #3
PCell: C-DAI=0 C-DAI=2 C-DAI=0 C-DAI=1
SCell1: C-DAI=1 C-DAI=3 C-DAI=1 (无调度)
SCell2: (无调度) (无调度) C-DAI=2 (无调度)
T-DAI: T=2 T=4 T=3 T=2
在上述示例中: - MO #0:调度了PCell和SCell1(C-DAI=0,1),T-DAI=2 - MO #1:调度了PCell和SCell1(C-DAI=2,3),T-DAI=4→0(模4循环) - MO #2:调度了PCell、SCell1和SCell2(C-DAI=0,1,2),T-DAI=3 - MO #3:仅调度PCell(C-DAI=1),T-DAI=2
最终码本大小由 MO #3 的 T-DAI = 2 决定,码本包含2个HARQ-ACK比特位置。
当启用跨载波调度(Cross-Carrier Scheduling)时,SCell的PDSCH由PCell上的DCI调度。此时: - 被调度SCell的C-DAI在PCell的PDCCH监听时机中计数 - 如果PCell和SCell同时被调度(同一DCI或不同DCI),C-DAI按照调度顺序递增 - T-DAI仍然反映当前监听时机之前的所有服务小区的累计调度数
在中国5G网络中,三大运营商均采用TDD制式(2.6GHz/3.5GHz/4.9GHz),上下行配比以DDDSU和DDDDDDSUUU为主。这使得Type 2动态码本成为必选项——如果采用Type 1半静态码本,每个PUCCH都需要预留覆盖所有可能PDSCH位置的比特,导致PUCCH资源浪费严重。
政策影响:工信部《5G网络互联互通技术要求》中明确要求各厂商设备支持Type 2动态码本,并在互操作性测试中验证DAI计数的准确性。这直接影响了设备入网认证的测试用例设计。
不同基带芯片厂商对DAI计数的实现存在差异:
| 芯片平台 | DAI计数方式 | 已知问题 |
|---|---|---|
| Qualcomm Snapdragon | 硬件加速DAI矩阵 | CA场景下偶发T-DAI判断错误(早期版本) |
| MediaTek Dimensity | 软件辅助DAI跟踪 | 高负载下DAI漏检恢复延迟 |
| Samsung Exynos | 硬件DAI引擎 | SCell数量>4时C-DAI循环计数边界case |
| HiSilicon Balong | 混合实现 | 跨时隙调度K1值处理差异 |
这些差异要求网络优化工程师在进行路测分析时,特别关注不同终端在相同网络配置下的HARQ-ACK码本构造行为差异。
问题案例:某运营商TDD网络中,下行吞吐量在高负载时出现周期性下降。经抓包分析发现:
解决方案:调整K1配置为{4,3,1},避免K1=2指向下行时隙,同时将动态码本配合适当的PUCCH资源集配置,确保HARQ-ACK反馈在预期的上行时隙完成。
在UE侧日志(如Qualcomm QXDM / MediaTek ELT)中,关键Log ID包括:
| Log条目 | 内容 | 用途 |
|---|---|---|
NR5G MAC HARQ-ACK Info |
每个PDSCH的HARQ-ACK状态 | 验证码本内容 |
NR5G L1 DAI Tracking |
C-DAI/T-DAI矩阵状态 | 诊断DAI计数错误 |
NR5G PUCCH Tx Report |
PUCCH传输的HARQ-ACK payload | 确认实际反馈码本 |
NR5G DCI Decoding Result |
成功解码的DCI及DAI字段 | 追溯DAI来源 |
故障模式1:DAI不匹配导致码本截断
现象:UE发送的HARQ-ACK码本比基站预期的小。
原因排查: 1. 检查UE是否漏检了某个DCI(导致C-DAI不连续) 2. 检查T-DAI的模4循环是否被UE正确处理 3. 检查是否存在DCI Format 1_0和1_1混合调度导致的T-DAI缺失
故障模式2:K1指向非UL时隙导致反馈延迟
现象:HARQ-ACK反馈时隙与基站预期不一致。
原因排查: 1. 确认TDD上下行配比配置 2. 检查K1值是否可能指向下行时隙 3. 验证UE是否正确执行了HARQ-ACK延迟规则
故障模式3:CA场景下码本大小异常
现象:CA配置下HARQ-ACK码本大小突然变化。
原因排查:
1. 检查各SCell的激活/去激活状态变化
2. 验证跨载波DAI计数是否正确
3. 确认 maxNrofCodeWordsPerSCell 配置是否一致

图表 4
| 维度 | Type 1(半静态) | Type 2(动态) |
|---|---|---|
| 码本大小 | 固定,由RRC参数决定 | 动态,由T-DAI决定 |
| DCI开销 | 无DAI字段需求 | 需要2~4 bit DAI字段 |
| PDCCH漏检影响 | 隐式NACK(位置固定) | 通过DAI不连续检测漏检 |
| TDD适配性 | 差(码本膨胀) | 好(码本按需) |
| UE复杂度 | 低(查表构造) | 高(维护DAI矩阵) |
| CA支持 | 每个服务小区独立 | 二维DAI联合计数 |
| 适用场景 | FDD、低负载TDD | 高负载TDD、CA |
| 典型PUCCH格式 | Format 0/1(小码本) | Format 2/3/4(大码本) |
选型建议:在TDD网络中,当每个上行时隙需要反馈的PDSCH数量超过4个时,强烈建议使用Type 2动态码本。在FDD网络中,如果调度模式简单(每时隙至多1个PDSCH),Type 1半静态码本的开销更低。
3GPP Rel-18引入了Type 3 HARQ-ACK码本(§9.1.2a),主要面向以下场景:
Type 3码本的核心增强: 1. 支持按TRP分组的HARQ-ACK子码本 2. 引入HARQ-ACK重传机制(通过MAC CE触发) 3. 支持更细粒度的K1值(子时隙级偏移)
Q1:Type 2动态码本中,如果最后一个PDCCH监听时机没有调度任何PDSCH,码本大小如何确定?
UE使用最后一个包含有效DCI调度的PDCCH监听时机中的T-DAI值来确定码本大小。如果没有任何DCI成功解码(极端情况),UE可能发送空的HARQ-ACK码本或仅包含SPS释放的ACK。规范要求UE至少反馈最后一个PDCCH监听时机中T-DAI所指示数量的HARQ-ACK比特。
Q2:C-DAI和T-DAI都是2 bit,如何区分模4循环和DCI漏检?
这是UE实现中的关键难点。UE需要结合以下信息综合判断: - 前一个PDCCH监听时机的C-DAI/T-DAI值 - 当前的调度模式(是否有持续调度) - SPS配置状态 - 如果T-DAI < C-DAI,则大概率发生了模4循环
Q3:动态码本中SPS PDSCH释放如何计入DAI?
SPS PDSCH释放(通过DCI指示)也需要HARQ-ACK反馈,且计入C-DAI计数。UE在收到SPS释放DCI时,需要在HARQ-ACK码本中对应位置填入ACK。值得注意的是,SPS释放DCI的DAI计数与常规PDSCH调度的DAI计数混合在一起,不单独处理。
Q4:为什么DCI Format 1_0不携带T-DAI?
DCI Format 1_0是fallback格式,设计目标是最小化DCI payload大小以提高PDCCH覆盖。T-DAI字段省略后,当UE仅收到DCI Format 1_0时,码本大小默认为C-DAI的值。这在实际网络中可能不常见,因为基站通常使用DCI Format 1_1来调度Type 2动态码本的PDSCH。
Q5:K1=0是否合法?什么场景下使用?
K1=0在规范中是允许的(dl-DataToUL-ACK取值包含0),意味着PDSCH和PUCCH在同一个时隙。这在TDD特殊时隙(S时隙)的下行部分调度PDSCH、上行部分反馈HARQ-ACK时可能使用。但实际部署中很少配置K1=0,因为UE处理时间可能不足以在同一个时隙内完成PDSCH解码和HARQ-ACK编码。
| 参数 | RRC信元 | 取值范围 | 默认值 | 说明 |
|---|---|---|---|---|
| K1偏移集合 | dl-DataToUL-ACK |
{0..15}的子集 | {1,2,3,4,8} | PDSCH-to-PUCCH时隙偏移 |
| 码本类型 | pdsch-HARQ-ACK-Codebook |
semi-static / dynamic | semi-static | HARQ-ACK码本构造方式 |
| 最大码字数 | maxNrofCodeWordsPerSCell |
n1 / n2 | n1 | 每个服务小区的码字数 |
| PUCCH资源集 | pucch-ResourceSet (Set 0-3) |
复杂结构 | - | 按码本大小选择PUCCH格式 |
| 最大CA小区数 | nrofServingCells (CA参数) |
1~32 (Rel-18) | - | 影响DAI二维矩阵大小 |
| K1 DCI指示字段 | PDSCH-to-HARQ_ACK timing indicator | ⌈log2(N_K1)⌉ bit | - | 从RRC集合中索引K1值 |
3GPP TS 38.213 V18.7.0 (2025-06), "NR; Physical layer procedures for control", Sections 9.1.1, 9.1.2, 9.1.2a, 9.2.5, 9.3
核心规范,定义了Type 1/2/3 HARQ-ACK码本的构造规则和DAI计数机制
3GPP TS 38.331 V18.6.0 (2025-06), "NR; Radio Resource Control (RRC); Protocol specification"
定义了 pdsch-HARQ-ACK-Codebook、dl-DataToUL-ACK 等RRC参数的ASN.1结构
ShareTechnote, "5G NR HARQ-ACK Codebook", https://www.sharetechnote.com/html/5G/5G_Harq_Codebook.html
提供了Type 1/2码本构造的图解说明和示例
TelecomHall, "5G HARQ-ACK Multiplexing Explained: Static vs Dynamic Codebook Traces", https://www.telecomhall.net/t/5g-harq-ack-multiplexing-explained-static-vs-dynamic-codebook-traces/35084
包含实际Log trace的HARQ-ACK码本分析案例
Aliyun Developer, "5G NR Type-2 HARQ-ACK动态码本构造与CBG级重传", https://developer.aliyun.com/article/1304391
中文深度分析,涵盖CBG级HARQ-ACK与动态码本的结合
关于DeepSpec:DeepSpec聚焦3GPP规范深度解读,从协议文本到工程实践,为通信工程师提供可操作的技术洞察。关注我们,获取更多NR RAN核心技术解析。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
