在5G NR系统中,当一个UE被调度获得PUSCH资源时,上行数据该发哪个逻辑信道?发多少?这不是简单的"先到先得",而是一套精密的令牌桶优先级调度机制——Logical Channel Prioritization(LCP)。TS 38.321 Section 5.4.3定义的LCP过程,决定了eMBB、URLLC、VoNR等差异化业务如何在共享的PUSCH资源上公平而高效地竞争。与此同时,BSR(Buffer Status Report)作为UE向gNB报告缓存状态的唯一信令,其触发时机和报告格式直接决定了调度器的资源分配精度。LCP与BSR的联动,是理解5G QoS保障在MAC层落地实施的钥匙。
根据TS 38.321 Section 5.4.3.1,每个逻辑信道(除LCID 0和1)通过RRC信令配置以下LCP相关参数:
| 参数 | 全称 | 取值范围 | 功能说明 |
|---|---|---|---|
| priority | Logical Channel Priority | 1~28(1最高) | 决定逻辑信道的服务顺序 |
| PBR | Prioritised Bit Rate | 0~∞ kBps | 令牌桶注入速率,保障最低带宽 |
| BSD | Bucket Size Duration | 20ms~1280ms | 令牌桶深度 = PBR × BSD |
| allowedSCS-List | Allowed Subcarrier Spacing | {15,30,60,120}kHz | 限制可用的SCS |
| allowedServingCells | Allowed Serving Cells | Cell ID列表 | 限制可用的小区 |
| allowedCG-List | Allowed Configured Grant | CG索引列表 | 限制可用的配置授权 |
| LCG ID | Logical Channel Group ID | 0~7 | BSR报告分组 |
graph TD
subgraph "逻辑信道配置参数体系"
A[LCID 2: SRB2] --> A1[priority: 1]
A --> A2[PBR: infinity]
A --> A3[BSD: infinity]
B[LCID 3: DRB-URLLC] --> B1[priority: 3]
B --> B2[PBR: 256 kBps]
B --> B3[BSD: 80 ms]
C[LCID 4: DRB-eMBB] --> C1[priority: 8]
C --> C2[PBR: 8 kBps]
C --> C3[BSD: 320 ms]
D[LCID 5: DRB-IMS] --> D1[priority: 5]
D --> D2[PBR: 64 kBps]
D --> D3[BSD: 100 ms]
end
subgraph "令牌桶模型"
E[令牌注入速率 = PBR]
F[桶容量 Bj = PBR × BSD]
G[数据到达消耗令牌]
E --> F
F --> G
end
令牌桶的核心思想是:每个逻辑信道维护一个虚拟令牌桶Bj,以PBR速率持续注入令牌,桶容量上限为PBR×BSD。
令牌桶状态Bj在每个TTI更新:
Bj = min(Bj + PBR × TTI_duration, PBR × BSD)
当逻辑信道j被服务时,实际传输的数据量Rj从Bj中扣除:
如果 Rj ≤ Bj: Bj = Bj - Rj (令牌充足,正常服务)
如果 Rj > Bj: Bj = 0 (令牌耗尽,超额部分不计入令牌桶)
设计意图:PBR保障每个逻辑信道的最低带宽——即使高优先级逻辑信道耗尽了资源,低优先级逻辑信道累积的令牌也能确保其PBR速率的数据被发送。BSD控制"容忍的突发时长"——URLLC的BSD通常很小(如20ms),因为URLLC需要持续低延迟;eMBB的BSD可以较大(如320ms),容忍较大的数据突发。
TS 38.321 Section 5.4.3.2定义了LCP的两轮分配过程。这是理解MAC层资源分配的核心算法:
第一轮:令牌桶约束的优先级服务
按优先级从高到低遍历逻辑信道,对每个逻辑信道j: - 如果Bj > 0,分配资源给该逻辑信道,最多分配min(Bj, 剩余PUSCH容量, 逻辑信道待发数据量) - 从Bj中扣除已分配的数据量 - 当某个优先级下所有逻辑信道的Bj都耗尽时,进入下一优先级
第二轮:剩余资源的贪婪分配
按优先级从高到低再次遍历,不考虑令牌桶约束,将剩余PUSCH资源全部分配给有数据的逻辑信道。
sequenceDiagram
participant UE as UE MAC层
participant LCH as 逻辑信道队列
participant TB as 令牌桶
participant PUSCH as PUSCH资源
Note over UE,PUSCH: 调度授权到达,PUSCH容量 = C bytes
UE->>TB: 更新所有Bj = min(Bj + PBR×TTI, PBR×BSD)
rect rgb(200, 230, 255)
Note over UE,PUSCH: 第一轮:令牌桶约束分配
loop 按priority从1到28
UE->>LCH: 查询逻辑信道j待发数据量 RRC_data_j
UE->>TB: 检查Bj > 0?
alt Bj > 0 且 有数据
TB-->>UE: 允许分配 grant_j = min(Bj, RRC_data_j, 剩余C)
UE->>PUSCH: 分配grant_j字节
UE->>TB: Bj = Bj - grant_j
else Bj ≤ 0
TB-->>UE: 跳过此逻辑信道
end
end
end
rect rgb(255, 230, 200)
Note over UE,PUSCH: 第二轮:贪婪分配(忽略令牌桶)
loop 按priority从1到28
UE->>LCH: 查询逻辑信道j剩余数据量
alt 有剩余数据
UE->>PUSCH: 分配min(剩余数据, 剩余C)
end
end
end
UE->>UE: 构建MAC PDU,填充MAC CE(BSR/PHR)
根据TS 38.321 Section 5.4.5,BSR在以下三种情况下被触发:
| 触发类型 | 条件 | 精确描述 |
|---|---|---|
| Regular BSR | 新数据到达空缓存 | 当属于某个LCG的逻辑信道有新数据到达,且该逻辑信道的优先级高于同一LCG内任何已有数据的逻辑信道 |
| Regular BSR | 定时器超时 | retxBSR-Timer超时,且该LCG有数据待发 |
| Periodic BSR | 定时器超时 | periodicBSR-Timer超时 |
| Padding BSR | MAC PDU填充 | MAC PDU组装后仍有剩余空间,可容纳BSR MAC CE |
stateDiagram-v2
[*] --> NoBSR: 无数据待发
NoBSR --> RegularBSR_Triggered: 高优先级新数据到达<br/>(空缓存 → 有数据)
NoBSR --> RegularBSR_Triggered: retxBSR-Timer超时<br/>且有数据待发
state "RegularBSR_Triggered" as RBT {
[*] --> WaitingSR
WaitingSR --> SR_Sent: 发送SR请求PUSCH
SR_Sent --> BSR_Sent: 获得PUSCH授权<br/>发送BSR MAC CE
BSR_Sent --> [*]: 重启periodicBSR-Timer<br/>重启retxBSR-Timer
}
NoBSR --> PeriodicBSR_Triggered: periodicBSR-Timer超时
state "PeriodicBSR_Triggered" as PBT {
[*] --> Send_PBSR
Send_PBSR --> [*]: 在下一个PUSCH中发送
}
RBT --> NoBSR: BSR发送完成
PBT --> NoBSR: BSR发送完成
TS 38.321 Section 6.1.3.1定义了四种BSR MAC CE格式:
| 格式 | 长度 | 结构 | 适用场景 |
|---|---|---|---|
| Short BSR | 3字节 | LCG ID(3bit) + Buffer Size(5bit) | 单个LCG报告 |
| Long BSR | 4+字节 | LCG bitmap + 多个Buffer Size | 多个LCG同时报告 |
| Short Truncated BSR | 3字节 | 格式同Short BSR | 资源不足时截断报告 |
| Long Truncated BSR | 4+字节 | 格式同Long BSR | 资源不足时截断报告 |
Buffer Size字段的量化表(5bit,32级)是关键——它使用非线性映射,小缓存区间粒度更细,大缓存区间粒度更粗:
| Buffer Size Index | 缓存字节范围 | 粒度 |
|---|---|---|
| 0 | BS = 0 | 精确 |
| 1 | 1~10 | 10字节 |
| 2 | 11~16 | 6字节 |
| 10 | 134~167 | ~33字节 |
| 20 | 2500~3163 | ~66字节 |
| 31 | >150000 | 极粗 |
设计意图:非线性量化降低了信令开销(5bit代替32bit精确值),同时保证小缓存场景的精度——这对URLLC等小包业务至关重要。量化误差在小缓存时小于10%,在大缓存时可能超过50%,但大缓存通常对应eMBB业务,调度精度要求相对宽松。
考虑一个典型的URLLC+eMBB共传场景:
| 配置项 | URLLC DRB (LCID 3) | eMBB DRB (LCID 4) |
|---|---|---|
| priority | 3 | 8 |
| PBR | 256 kBps | 8 kBps |
| BSD | 20 ms | 320 ms |
| 令牌桶容量 | 256×20 = 5120 bit = 640 Byte | 8×320 = 2560 bit = 320 Byte |
关键博弈:URLLC的PBR高(256kBps)但BSD小(20ms),意味着令牌桶每20ms清空一次,不容忍长时间等待。eMBB的PBR低(8kBps)但BSD大(320ms),令牌可以累积320ms的量(320 Byte),形成较大的突发容忍度。
运营商配置策略: - 保守策略(移动):URLLC的PBR设高(如512kBps),确保第一轮分配就能满足URLLC需求;eMBB的PBR设低(如4kBps),大量资源留给第二轮贪婪分配 - 激进策略(电信):URLLC和eMBB都给较高的PBR,通过priority差来保证顺序,减少第二轮分配的不确定性 - 成本影响:保守策略的URLLC保障更可靠,但PUSCH利用率可能较低;激进策略利用率高,但URLLC峰值时可能挤占eMBB
TS 38.321将逻辑信道映射到最多8个LCG(Logical Channel Group)。LCG的分组策略直接影响BSR报告的精度和调度效率:
策略A:按QoS特征分组(推荐) - LCG 0: SRB(信令承载) - LCG 1: URLLC DRB - LCG 2: eMBB DRB - LCG 3: IMS/VoNR DRB - 优势:gNB调度器能精确识别每类业务的缓存状态 - 开销:Long BSR可能需要4字节以上
策略B:按PDU Session分组 - 每个PDU Session一个LCG - 优势:与核心网QoS Flow一一映射 - 劣势:LCG数量可能不够(最多8个)
策略C:极简分组 - 所有DRB归入LCG 1 - 优势:Short BSR只需3字节,信令开销最小 - 劣势:gNB无法区分不同业务的缓存需求
graph LR
subgraph "LCG分组策略对比"
A["策略A: 按QoS分组<br/>BSR精度: ★★★★★<br/>信令开销: ★★★<br/>调度效率: ★★★★★"]
B["策略B: 按会话分组<br/>BSR精度: ★★★★<br/>信令开销: ★★★★<br/>调度效率: ★★★★"]
C["策略C: 极简分组<br/>BSR精度: ★★<br/>信令开销: ★<br/>调度效率: ★★"]
end
A -->|"推荐"| D[5G商用网络]
B -->|"MEC场景"| E[边缘计算部署]
C -->|"IoT海量连接"| F[mMTC场景]
在MAC层抓包中识别LCP和BSR行为:
1. 识别BSR MAC CE
| 字段 | Short BSR (LCID 61) | Long BSR (LCID 62) |
|---|---|---|
| LCID | 61 | 62 |
| 第一字节 | LCG ID(3bit) + Buffer Size(5bit) | LCG Bitmap(8bit) |
| 后续字节 | 无 | 每个活跃LCG一个Buffer Size(1字节) |
2. 识别Regular BSR触发
Regular BSR触发后,UE会先发送SR(Schedule Request)——在PUCCH Format 1上发送单bit SR。如果在sr-ProhibitTimer运行期间,SR不能重复发送。当sr-TransMax次SR都未获响应时,UE触发随机接入(RA)。
3. 通过BSR推测LCP行为
通过连续多个TTI的BSR值变化,可以反推LCP分配: - 如果某LCG的BSR持续下降,说明该LCG的逻辑信道正在被正常服务 - 如果某LCG的BSR不降反升,可能是PUSCH授权不足或LCP分配偏向了更高优先级的LCG
场景1:URLLC上行延迟突增 - 现象:URLLC数据包上行延迟从5ms突增到50ms+ - 排查: 1. 检查BSR是否正常发送(retxBSR-Timer配置是否过长) 2. 检查SR是否被gNB正确接收(PUCCH SR资源是否冲突) 3. 检查LCP配置——URLLC的PBR是否过低,导致第一轮分配不足 4. 检查是否有更高优先级的SRB数据占用了PUSCH资源 - 根因:运营商常见配置错误是将retxBSR-Timer设为320ms甚至更长,URLLC在等待BSR重传期间无法获得调度
场景2:eMBB吞吐量异常低 - 现象:eMBB业务上行吞吐量远低于预期 - 排查: 1. 检查eMBB逻辑信道的PBR和BSD配置 2. 检查是否有高优先级逻辑信道(如IMS)持续占用PUSCH 3. 检查BSR是否将eMBB和IMS归入同一LCG,导致gNB调度器无法区分 - 根因:LCG配置不当,eMBB和URLLC共用LCG,gNB按总量调度但LCP内部优先保证URLLC
场景3:VoNR上行MOS分偏低 - 现象:VoNR通话质量差,上行MOS低于3.0 - 排查: 1. 检查IMS DRB的PBR是否覆盖EVS编码速率(如12.65kbps → PBR至少16kBps) 2. 检查BSD是否过短——语音包20ms一帧,BSD至少需要40ms以容忍调度延迟 3. 检查BSR的5bit量化误差——语音包较小(~32字节),如果量化粒度太粗,gNB可能低估了缓存需求
LCP和BSR的核心RRC参数定义在TS 38.331的LogicalChannelConfig和MAC-CellGroupConfig中:
关键定时器配置(MAC-CellGroupConfig):
MAC-CellGroupConfig ::= SEQUENCE {
schedulingRequestConfig SchedulingRequestConfig,
BSR-Config BSR-Config,
PHR-Config PHR-Config OPTIONAL,
...
}
BSR-Config ::= SEQUENCE {
periodicBSR-Timer ENUMERATED {sf1, sf5, sf10, sf16, sf20, sf40,
sf80, sf128, sf256, sf320, sf640,
sf1280, sf2560, infinity},
retxBSR-Timer ENUMERATED {sf10, sf20, sf40, sf80, sf160, sf320,
sf640, sf1280, sf2560, infinity},
logicalChannelSR-DelayTimer BOOLEAN OPTIONAL,
logicalChannelSR-Mask BOOLEAN OPTIONAL,
...
}
逻辑信道配置(LogicalChannelConfig):
LogicalChannelConfig ::= SEQUENCE {
allowedSCS-List SEQUENCE OF SubcarrierSpacing OPTIONAL,
allowedServingCells SEQUENCE OF ServCellIndex OPTIONAL,
allowedCG-List SEQUENCE OF ConfiguredGrantConfigIndex OPTIONAL,
logicalChannelGroup INTEGER (0..7),
logicalChannelSR-Mask BOOLEAN,
logicalChannelSR-DelayTimerApplied BOOLEAN,
prioritisedBitRate ENUMERATED {kBps0, kBps1, ..., kBpsInfinity},
bucketSizeDuration ENUMERATED {ms5, ms10, ms20, ms50, ms80,
ms100, ms150, ms200, ms300,
ms500, ms750, ms1000, ms1280},
...
}
TS 38.321 Section 5.4.3.2还规定了MAC CE在MAC PDU中的优先级——这是一个容易被忽视但实战中极为重要的细节:
MAC PDU组装优先级(从高到低):
设计意图:MAC CE优先于数据——因为C-RNTI CE用于竞争解决(RA场景),BSR用于告知gNB缓存状态(影响后续调度),这些控制信息比数据更重要。这也意味着如果一个小的PUSCH授权到达,可能全部被MAC CE占用,数据一个字节都发不出去。
实战影响:在RRC重配置场景中,UE可能需要发送RRC重配完成消息(SRB1),如果同时还有BSR要发,PUSCH资源分配顺序为:C-RNTI CE → BSR → SRB1数据 → 其他DRB数据。对于极小的PUSCH授权(如窄带调度),可能出现SRB1消息都无法完整发送的情况。
Q1: Regular BSR和Periodic BSR的区别是什么? A: Regular BSR是事件触发的——当更高优先级的新数据到达时立即触发,确保gNB能及时调度;Periodic BSR是定时触发的——periodicBSR-Timer超时时触发,作为保底机制确保gNB定期获知缓存状态。Regular BSR触发后会发送SR请求PUSCH资源,Periodic BSR在已有PUSCH资源时直接携带。
Q2: Truncated BSR什么时候使用? A: 当MAC PDU的剩余空间不足以容纳完整的Long BSR MAC CE时(需要报告多个LCG但空间只够报告部分),UE使用Truncated BSR。此时UE优先报告最高优先级逻辑信道所在的LCG的缓存状态。
Q3: 为什么SRB(LCID 0/1)不参与LCP过程? A: TS 38.321规定SRB的优先级始终最高,PBR和BSD为infinity,且不参与令牌桶计算。SRB数据在任何逻辑信道数据之前被服务——这是设计选择,确保RRC信令(如切换命令、重配置消息)始终能及时传输。
Q4: allowedSCS-List和allowedServingCells参数如何影响LCP? A: 这两个参数限制了逻辑信道可以在哪些时频资源上传输。例如,URLLC DRB可以配置allowedSCS-List = {120kHz},只允许在120kHz SCS的BWP上传输,确保低延迟;eMBB DRB可以配置allowedServingCells限制只在主小区传输,避免CA场景下的额外调度复杂性。
Q5: BSR的5bit量化误差如何影响URLLC调度? A: URLLC典型包大小为32~200字节,对应BSR表Index 2~6,量化粒度为6~20字节。对于32字节的URLLC包,BSR报告可能显示为28~40字节的范围(Index 2~3),gNB按40字节调度是安全的。但如果多个URLLC包同时到达,量化误差可能累积——100字节可能被量化为84~109字节,gNB按84字节调度就不足了。这就是为什么URLLC场景建议使用更频繁的BSR报告(短periodicBSR-Timer)。
本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。
[!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 等场景全覆盖。
