ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

深入理解5g<五十五>AM的接收过程

深入理解5g<五十五>AM的接收过程

与UM模式类似,5G RLC AM模式的接收端也需要进行按序重组和递交,但其核心区别在于引入了**反馈与重传机制**。接收端通过发送STATUS PDU,向对端明确指示哪些数据已成功接收(ACK)、哪些需要重传(NACK),从而在不可靠的底层链路上实现可靠传输。

### 📦 核心状态变量与接收窗口

AM接收端维护一个**接收窗口**,用于判断收到的PDU是否在处理范围内。窗口由状态变量 **`RX_Next`** 决定,其定义为**最后一个按序完整接收的RLC SDU的SN加1**,同时作为窗口的**下边缘**。一个SN位于窗口内的条件是:`RX_Next <= SN < RX_Next + AM_Window_Size`。

`AM_Window_Size`是常量,等于SN空间的一半:使用12位SN时为**2048**,使用18位SN时为**131072**。

此外,接收端还维护几个关键变量:

* **`RX_Highest_Status`**:构造STATUS PDU时,`ACK_SN`能指示的最高可能SN值。
* **`RX_Next_Highest`**:已接收到的最高SN的下一个值,作为重组窗口的上边缘。
* **`RX_Next_Status_Trigger`**:与`t-Reassembly`定时器关联,存储触发定时器时的SN值。

### 📥 接收与初步处理(TS 38.322 §5.2.3.2.2)

收到AMD PDU时,接收端首先进行**重复检测和窗口判断**:

1. **丢弃条件**:如果PDU的SN **落在接收窗口之外**(`x < RX_Next` 或 `x >= RX_Next + AM_Window_Size`),或该SN的**所有字节段之前已接收过**,则直接**丢弃**该PDU。
2. **放入缓冲区**:否则,将PDU放入接收缓冲区。如果PDU中包含**部分已接收的字节段**,则**丢弃这些重复的字节段**,仅保留新的数据。

### 🔗 重组与状态更新(TS 38.322 §5.2.3.2.3)

PDU放入缓冲区后,触发以下逻辑:

1. **更新`RX_Next_Highest`**:如果`x >= RX_Next_Highest`,则更新`RX_Next_Highest = x + 1`。
2. **重组与递交**:当SN为`x`的SDU的**所有字节段都收齐**后,重组出完整的RLC SDU,移除RLC头后**按序递交**给上层。
3. **推进`RX_Next`**:如果`x`恰好等于`RX_Next`,则将`RX_Next`更新为**大于当前值且尚未完整接收的第一个SN**。
4. **更新`RX_Highest_Status`**:如果`x`等于`RX_Highest_Status`,则将其更新为大于当前值且尚未完整接收的第一个SN。
5. **定时器管理**:根据重组进度,可能**停止或启动`t-Reassembly`**。例如,当`RX_Next_Status_Trigger`与`RX_Next`满足特定关系时停止定时器;当存在空洞(`RX_Next_Highest > RX_Next + 1`)时启动定时器,并将`RX_Next_Status_Trigger`设为`RX_Next_Highest`。

### ⏱️ t-Reassembly定时器超时处理(TS 38.322 §5.2.3.2.4)

`t-Reassembly`用于**检测丢失的PDU**。超时后:

1. 更新`RX_Highest_Status`为第一个未完整接收的SN。
2. **触发STATUS报告**,将丢失的PDU通过NACK告知对端。
3. 根据需要**重启`t-Reassembly`**。

### 📤 STATUS报告机制

STATUS报告是AM模式实现可靠传输的关键。

#### 触发条件

STATUS报告的触发主要包括:

* **收到轮询(Polling)**:当收到的AMD PDU的**P字段为“1”**时,触发STATUS报告(若PDU因重复等原因被丢弃,或`x < RX_Highest_Status`,或`x >= RX_Next + AM_Window_Size`,也触发)。
* **`t-Reassembly`超时**:定时器超时意味着检测到PDU丢失,触发STATUS报告。
* **检测到接收失败**:通过序列号空洞等机制检测到PDU丢失时。

#### STATUS PDU的构造

构造STATUS PDU时,接收端会:

* 对于`RX_Next <= SN < RX_Highest_Status`范围内**尚未完整接收**的SDU,按SN递增顺序添加**NACK_SN**。
* 对于部分接收的SDU,可添加**NACK_SN、SOstart和SOend**以指示缺失的字节段。
* 对于连续未接收的SDU序列,可添加**NACK_SN和NACK range**。
* 将**`ACK_SN`**设置为下一个未接收且未在NACK中指示的SDU的SN。

#### t-StatusProhibit定时器

为避免频繁发送STATUS PDU造成资源浪费,引入了**`t-StatusProhibit`定时器**:

* 当STATUS报告被触发时,**若`t-StatusProhibit`未运行**,则在第一个传输机会构造并提交STATUS PDU。
* 当STATUS PDU提交后,**启动`t-StatusProhibit`**。在定时器运行期间,即使有新的STATUS报告触发,也**不立即发送**,而是等到定时器超时后,在第一个传输机会构造一个**单一的STATUS PDU**(合并期间所有触发)。

### 💎 总结

AM接收端的核心是一个**基于窗口的可靠重组与反馈机制**:通过`RX_Next`界定有效数据范围,丢弃窗口外和重复的PDU,重组窗口内完整的数据单元并按序递交。当检测到数据丢失时,通过**STATUS PDU**向对端请求重传,而**`t-Reassembly`**和**`t-StatusProhibit`**两个定时器则协同工作,在**及时反馈**和**避免信令风暴**之间取得平衡。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进