NR HARQ(二) CBG HARQ-ACK codebook

简介: 这篇开始看下HARQ-ACK codebook的相关内容,先看CBG-based HARQ-ACK codebook。那第一个关注点就是CBG 的划分规则,这部分内容主要在38.213 9.1.1章节中,PDSCH和PUSCH 的CBG 划分规则基本是一样的,这里以PDSCH为例介绍。

这篇开始看下HARQ-ACK codebook的相关内容,先看CBG-based HARQ-ACK codebook。那第一个关注点就是CBG 的划分规则,这部分内容主要在38.213 9.1.1章节中,PDSCH和PUSCH 的CBG 划分规则基本是一样的,这里以PDSCH为例介绍。

2f3ad8273d2446ebbbb54939f7542354.png

PDSCH 和PUSCH 都有 maxCodeBlockGroupPerTransportBlock;maxCodeBlockGroupPerTransportBlock:每个TB块最多分为n个码块组;当下行为2个TB块时,最大只能配置为n4,因为DCI中CBGTI位图只有8bits。

e3bd0cfe1c5649f992895b107003dc11.png

CBG划分首先要确定两个参数,一个是N由 RRC 层参数maxCodeBlockGroupsPerTransportBlock提供,C 是按照38.212中Code block segmentation and code block CRC attachment 规则进行CB分割时确定的参数,具体过程可以看下NR PDSCH(五) PDSCH 信道编码与调制流程,这里简单说下,NR中,PDSCH和PUSCH信道均采用LDPC编码,LDPC有最大码块长度和限定: LDPC base graph 1   Kcb =8448;LDPC base graph 2   Kcb =3840;当TB块(含CRC)超过码块最大长度限定后,TB块被切分为C个码块发送;当RRC配置参数codeBlockGroup Transmission时,C个码块按照多个码块组进行发送和应答。

2f9131cf88dd4d7abcb7001797e1ac67.png

然后由M=min(N,C)确定要划分的CBGs 的数量,具体的划分规则,通过3个例子,看下应该就比较清晰了,如下。

(1) N=8,C=5  M=min(8,5)=5 即要分5组。

M1=mod(5,5)=0,  k1=5/5 向上取整,k2=5/5 向下取整=1

M1=0  m=M1,M1+1, ....,M-1= 0,1,2,3,4

CB index =M1*K1+(m-M1)*k2+k     k=0,1...., k2-1   =0

CBG 0 m=0   0*K1+(0-0)*1+0=0

CBG 1 m=1   0*K1+(1-0)*1+0=1

CBG 2 m=2   0*K1+(2-0)*1+0=2

CBG 3 m=3   0*K1+(3-0)*1+0=3

CBG 4 m=4   0*K1+(4-0)*1+0=4

b9e3b5417afd4b75b23c4b5600c1b0c9.png

(2) N=8,C=9  M=min(8,9)=8 即要分8组。

M1=mod(9,8)=1,  k1=9/8 向上取整=2,k2=9/8 向下取整=1

M1=1>0  

CBG m ,m=0,1,....,M1-1=0

CBG 0 m*k1+k     k=0,  k1-1=0,1  则 code block index =0,1

其他CBG  m的情况, m=M1,M1+1,.....M-1 =1,2,3,4,5,6,7

CB index =M1*K1+(m-M1)*k2+k     k=0,1...., k2-1   =0

CBG 1 m=1   1*2+(1-1)*1+0=2

CBG 2 m=2   1*2+(2-1)*1+0=3

CBG 3 m=3   1*2+(3-1)*1+0=4

.....

CBG 7 m=7   1*2+(7-1)*1+0=8

3cb1c777662b4b2a9e340b3ea3c13ffa.png

(3) N=8,C=50  M=min(8,50)=8 即要分8组。

M1=mod(50,8)=2,  k1=50/8 向上取整=7,k2=50/8 向下取整=6

M1=2>0  

CBG m ,m=0,1,....,M1-1=0,1 即只有CBG 0和CBG 1

m*k1+k     k=0, 1,... k1-1=0,1,2,3,4,5,6

CBG 0 m*k1+k =k  则 code block index =0~6

CBG 1 m*k1+k =1*7+k  则 code block index =7~13


其他CBG  m的情况, m=M1,M1+1,.....M-1 =2~7

CB index =M1*K1+(m-M1)*k2+k     k=0,1...., k2-1 =0~5

CBG 2 m=2   2*7+(2-2)*6+k= 14~19

CBG 3 m=3   3*7+(3-2)*6+k=20~25

CBG 4 26~31

CBG 5 32~37

CBG 6 38~43

CBG 7 44~49

1530034b5fc4436f897006744c67b430.png

划分规则结束了,紧接着看下CBG传输的相关规定。

231927c71580451385671689d23ec17c.png

UE没有配置PDSCH-CodeBlockGroupTransmission时,UE 要针对每个TB 生成1个HARQ-ACK info;有配置PDSCH-CodeBlockGroupTransmission时,UE 会通过DCI 1_1 接收到包含CBGs的TB;RRC层通过maxCodeBlockGroupsPerTransportBlock指示每个TB支持的CBG 数量,然后UE需要针对每个TB中对应的CBG 生成各自的HARQ-ACK info bits。先看PUSCH部分相关内容。


UE procedure for transmitting code block group based transmissions

7a675772018841ac85d0fe7d4f5d2313.png

PUSCH CBG 相关的DCI 0_1 field CBGTI,在配置CBG传输时,其bit大小由maxCodeBlockGroupsPerTransportBlock决定,其可配置层2/4/6/8,即DCI 0_1 CBGTI分别对应2/4/6/8 bits,从最高位之最低位分别代表CBG0/1/2/....

初次传输时, CBGTI =1的CBG代表要进行传输的CBG,之后UE要按照指示在对应TB中包含对应的CBGs data 传输出去;如果是TB 重传,UE只需要将CBGTI =1的CBGs传输出去。再看PDSCH部分。


UE procedure for receiving code block group based transmissions

223ebd59625d4f9382bdb6077102211f.png

对于PDSCH 接收,DCI 1_1 的CBGTI field的大小为N_TB*N,其中N_TB为RRC 层参数maxNrofCodeWordsScheduledByDCI,代表一个DCI 可能带的TB 个数,1个或2个;N根据maxCodeBlockGroupsPerTransportBlock 确定,即DCI 1_1 CBGTI分别对应2/4/6/8 bits,从最高位之最低位分别代表CBG0/1/2/....

初次传输时, TB 中的CBG应该都要送下来给UE;如果是TB 重传,CBGTI=0代表相关的CBG没有传送下来,CBGTI=1代表有对应的CBGs;在RRC层参数有配置codeBlockGroupFlushIndicator =true时,DCI 1_1中会带CBG flushing out information(CBGFI),CBGFI=0代表前面收到的CBGs可能是损坏的,需要清缓存,重新接收;CBGFI=1代表现在这次传输的CBGs是与前面收到的CBGs可以进行软合并;重传的CBG 要和初传时对应相同的CBs。

9999588d6f53475b98503eb59951ce38.png

对于DCI 1_1 中的CBGTI/CBGFI,当RRC 层有配置 priorityIndicatorDCI-1-1时,如果CBGTI和CBGFI的bit width与其他HARQ-ACK codebook不一样时,要对短的CBGTI/CBGTI 进行补0处理,以便使得所有的CBGTI/CBGFI的 HARQ-ACK codebook 相同,如下图两个CBGTI 长度不一样,要对短的补零,使得之后HARQ-ACK codebook bit width 保持一致。

1f5266637087467bb46b23cf029c224a.png

f8b7edca5b364e3e820cb56c4f3ee80d.png

在进行CBG划分后,生成HARQ-ACK codebook包含的HARQ-ACK info bits N 可能会小于maxCodeBlockGroupsPerTransportBlock规定的max数量,此时,要对max-N的剩余bits 生成NACK包含在反馈的HARQ-ACK codebook。

UE要对重传的TB 生成HARQ-ACK codebook时,前一个TB 正确接收的CBGs 直接生成ACK,再对重传中对应其余CBG生成HARQ-ACK。UE没有正确收到整个TB,只收到了N 个CBGs,那UE 直接将这些CBGs反馈NACK。


单TB传输,实际传输的CBGs =5小于maxCodeBlockGroupsPerTransportBlock=8,这时候反馈HARQ-ACK时,未传输的CBGs 要做NACK处理。

aa1967bb7a4c4666aa4206f80230a965.png

6505d59fec5a47ffb51c5a3ef62a74bf.png

在配置CBG 传输时,当CBG中所有的 code blocks 都成功收到时,针对CBG生成对应的HARQ-ACK info bit;只要CBG中有1个code block 没有正确接收就要生成NACK。如果UE 同一时间收到2个TBs,UE就将2个TB的CBG HARQ-ACK info 按照先第一个TB 后第二个TB 的顺序排放。

传输2个TB,maxCodeBlockGroupsPerTransportBlock=4,两个TB 的HARQ-ACK codebook下。

071fa2eba53f41568856760fae0dc2a1.png

下行HARQ-ACK时序示意图

PDCCH 调度PDSCH ,下行HARQ-ACK 时序示意图

8c85ea29745e40a0a5fd7728974e5c9f.png

调度DCI在时隙n,则PDSCH 接收时隙在n+K0,接收PDSCH 在时隙n,则发送HARQ-ack 的PUCCH在时隙n+K1

K1相关内容在NR PUCCH (三)PUCCH resource 的配置与调用 有介绍;K0相关内容在NR PDSCH (一)时域资源有介绍,不再赘述。

a85168919448471aa4a594f8f2f12791.png


还有一个因素和下行HARQ-ACK时序相关,即UE对PDSCH的处理时延

发送HARQ-ACK的PUCCH的第一个上行符号不能早于上行符号L1位置,L1 定义为T_proc,1=(N1+d1,1+d2)(2048+144)*k*(2的-u次方)*Tc+Text 后上行符号。其中确定UE PDSCH处理时延的参数包括UE的处理capability能力capability 1 和capability 2, PDSCH DM-RS position ,PDSCH mapping Type A/B 类型,子载波间隔及38.211 38.133中的内容,具体可以看38214 5.3节UE PDSCH processing procedure time。PUSCH也有类似的发送准备时延,具体在38.214 6.4 UE PUSCH preparation procedure time,这里不细说了。


通过上面的内容也可以看出只有DCI0_1和DCI 1_1支持CBG传输,在配置CBG时,对于其他DCI,也只能进行基于TB 的传输,这点后面也会用到。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
算法 调度 C++
NR HARQ(三) semi-static HARQ-ACK codebook
UE在一个PUCCH(或PUSCH)上发送HARQ-ACK信息时,信息bit很可能是多个bits位数,这个多bits位数的HARQ-ACK信息,也称为HARQ-ACK codebook码本 UE物理层在以下几种情况下,需要产生对应的HARQ-ACK 信息bit:UE收到PDCCH调度的PDSCH,动态调度;UE接收的PDSCH没有对应的PDCCH,即DL SPS PDSCH调度; UE接收到PDCCH指示的SPS release,并没有PDSCH。
|
8天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
18天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
77 12
|
21天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
23天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
50 2
|
1月前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
2月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
85 1
|
3月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
3月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
3月前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
155 17