通信人家园

标题: RLC-AM详解  [查看完整版帖子] [打印本页]

时间:  2025-10-13 16:10
作者: tongxinren2025     标题: RLC-AM详解

要理解 E1、E2、E3、NACK_SN、SOstart/SOend、NACK range 的逻辑,需结合3GPP RLC 协议(以 TS 38.322 为例,5G NR RLC 层标准) 中 “NACK 报告” 的核心设计目标 ——精准反馈 “哪些 SDU 的哪些字节丢失”,避免冗余反馈,提升空口效率。以下通过 “协议逻辑拆解 + 分场景举例” 详细讲解:

一、核心字段先明确:先理清每个字段的 “角色定位”
在 RLC 层的状态报告(Status Report) 中,NACK(Negative Acknowledgment,否定确认)用于告知发送端 “哪些 SN(序列号)的 SDU/PDU 丢失”。上述字段是 NACK 报告的 “子字段”,需按 “依赖关系” 激活(即 “可选项” 由前序字段指示是否存在),核心关系如下:



二、协议核心逻辑:字段的 “依赖激活链”
所有字段的存在与否,遵循严格的 “前序字段指示” 逻辑,避免无效字段浪费空口资源,链路由E1主导:

当 E1=0 时:最简单的 NACK 报告 —— 仅反馈 “整个 SDU 丢失”,无任何可选字段。
此时 NACK 条目结构:[E1=0] + [NACK_SN],含义:SN=NACK_SN 的整个 RLC SDU 丢失。

当 E1=1 时:需进一步判断 E2 和 E3,激活 “字节级定位” 或 “连续 SN 丢失” 功能:
E2 决定是否需要 “SOstart/SOend”(字节级精准反馈);
E3 决定是否需要 “NACK range”(连续多个 SN 丢失的批量反馈);
两者可组合(如 E2=1 且 E3=1,既反馈字节级丢失,又反馈连续 SN 丢失)。

三、分场景举例:结合协议实际传输场景理解
以下以 “接收端向发送端反馈丢失情况” 为例,覆盖 3 种典型场景,对应不同字段组合:
场景 1:E1=0—— 整个 SDU 丢失(无字节级 / 连续 SN 需求)
适用场景:接收端完全未收到某 SN 的 SDU(或收到后校验失败,判定整个 SDU 无效),无需细分 “哪部分字节丢了”。

字段组合:E1=0,NACK_SN=5

协议含义:SN=5 的 RLC SDU 整体丢失,发送端需重传整个 SN=5 的 SDU。

为什么不用 E2/E3?:因为 “整个 SDU 丢了”,SOstart/SOend(字节位置)无意义;且仅单个 SN 丢失,NACK range(连续数量)也无意义。
场景 2:E1=1、E2=1、E3=0—— 单个 SDU 的部分字节丢失(字节级精准反馈)
适用场景:接收端收到某 SN 的 SDU,但仅部分字节丢失(如 SDU 被分割成多个 PDU 传输,部分 PDU 丢失),需精准反馈 “丢了哪几个字节”。

协议背景:RLC SDU 可能被分割为多个 RLC PDU(如 AM 模式下的分段传输),若某几个 PDU 丢失,接收端能通过 “字节位置” 定位丢失部分。

举例:E1=1,E2=1,E3=0,NACK_SN=6,SOstart=100,SOend=250

字段逻辑:
E1=1:激活 E2/E3;E2=1:激活 SOstart/SOend;E3=0:无 NACK range(仅单个 SN 丢失);
SOstart=100:SN=6 的 SDU 中,丢失部分的第一个字节是 “原 SDU 的第 100 字节”;
SOend=250:SN=6 的 SDU 中,丢失部分的最后一个字节是 “原 SDU 的第 250 字节”;

协议含义:SN=6 的 RLC SDU 中,第 100~250 字节丢失,发送端仅需重传这 151 个字节(无需重传整个 SDU,节省资源)。
特殊值补充(SOend = 全 1):若 E3=0 且 SOend = 全 1(如 8 位字段则为 0xFF),含义为 “从 SOstart 开始,到 SDU 的最后一个字节全部丢失”。
例:SOstart=300,SOend=0xFF → SN=6 的 SDU 中,第 300 字节至 SDU 末尾全部丢失。
场景 3:E1=1、E2=1、E3=1—— 连续多个 SDU,且每个 SDU 的部分字节丢失(批量 + 精准反馈)
适用场景:接收端连续丢失多个 SN 的 SDU,且每个 SDU 均为 “部分字节丢失”(如连续 3 个 SDU 都有分段 PDU 丢失),需 “批量反馈连续 SN”+“精准反馈每个 SDU 的丢失字节”。

关键逻辑:E3=1 时,NACK range 表示 “连续丢失的 SN 数量”,此时 SOend 的含义变为 “最后一个丢失 SN 的 SDU 的丢失字节结束位置”(而非 NACK_SN 的 SDU)。

举例:E1=1,E2=1,E3=1,NACK_SN=7,NACK range=3,SOstart=50,SOend=180

字段拆解:
NACK_SN=7 + NACK range=3 → 连续丢失的 SN 为:7、8、9(共 3 个 SN);
E2=1 → 这 3 个 SN 的 SDU 均为 “部分字节丢失”,且丢失字节的 “起始位置” 相同(均为 SOstart=50)(协议设计:连续 SN 的相同丢失起始位置可复用 SOstart,减少冗余);
E3=1 → SOend 不再对应 NACK_SN=7,而是对应 “连续 SN 的最后一个(SN=9)”;
协议含义:
SN=7 的 SDU:第 50 字节至 “该 SDU 末尾” 丢失(因 SOstart=50,且未单独指定其 SOend,协议默认 “连续 SN 的中间 SDU(7、8)丢失至末尾”);
SN=8 的 SDU:第 50 字节至 “该 SDU 末尾” 丢失(同 SN=7);
SN=9 的 SDU:第 50~180 字节丢失(SOend=180 明确指定其丢失结束位置);
发送端动作:仅需重传 SN=7(50 字节起)、SN=8(50 字节起)、SN=9(50~180 字节),无需重传完整 SDU,且无需为每个 SN 单独发 NACK 条目。
特殊值补充(SOend = 全 1):若 E3=1 且 SOend = 全 1,则 “连续 SN 的最后一个(SN=NACK_SN+NACK range-1)的 SDU 从 SOstart 开始至末尾全部丢失”。
例:NACK_SN=7,NACK range=3,SOstart=50,SOend=0xFF → SN=9 的 SDU 第 50 字节至末尾丢失。
四、总结:协议设计的核心思路
上述字段的 “可选项依赖逻辑”,本质是为了在 “反馈精度” 和 “空口开销” 之间做平衡:

简单场景(整个 SDU 丢失、单个 SN 丢失):用 E1=0 简化反馈,最小化开销;
复杂场景(部分字节丢失、连续 SN 丢失):用 E1=1 激活 E2/E3,通过 SOstart/SOend 实现 “字节级精准重传”,通过 NACK range 实现 “连续 SN 批量反馈”,既保证精度又避免冗余。

四 ACK_SN
ACK_SN字段表示下一个未接收到的RLC SDU的序列号(SN),该RLC SDU在STATUS PDU中未被报告为丢失。当AM RLC实体的发送端接收到一个STATUS PDU时,它会认为其对应AM RLC实体已收到所有RLC SDU,但不包括序列号为ACK_SN的RLC SDU,以及那些在STATUS PDU中用NACK_SN、NACK范围、SOstart和SOend指示的RLC SDU部分。




时间:  2025-10-13 16:29
作者: 为别人打工的人


时间:  2025-10-13 19:17
作者: 不吹不黑

很详细的!




通信人家园 (https://www.txrjy.com/) Powered by C114