NR RLC Protocol General and Proc
1. General
1.1 RLC Archetecture
RLC entities
RRC控制RLC的配置
RLC子层的功能主要由RLC实体(entities)表现。 在通信过程中,gNB和UE端各有一个RLC entity。
RLC PDU既可以是 RLC data PDU,也可以是 RLC control PDU
RLC entity有3种mode:
- AM
- UM
- TM
在UM和TM mode下,RLC entity既是发送实体也是接收实体。
在AM mode下,RLC entity有发送端和接收端。
发送部分的功能为:接收上层的SDU,通过下层将PDU传给另一设备上的对等实体。
接收部分反之。
将RLC SDU构造成RLC PDU不需要下层的通知就可以直接进行。
在AM和UM mode下,根据下层的通知,RLC SDU可能会被分段,用多个RLC PDU来传输。
先将SDU组装成PDU,与之后可能将SDU分段再用PDU传输,这两者并不冲突。
在实际的组装PDU实现中,PDU数据域并不是简单的copy SDU数据并组装(这样buffer不够用),而是通过指针引用内存中的数据。如果之后要分段,只需要改一下offset即可。
仅当收到下层的通知(transmission opportunity)时,RLC PDU才会被传送到下层。
TM RLC entity
TM mode 下的 RLC entity 可在BCCH, CCCH, PCCH逻辑信道上收/发 RLC PDU。
TM RLC entity 只会在遇到以 TMD PDU 为内容的 RLC data PDU时,才会进行收/发。
UM RLC entity
可在 DTCH上收/发消息
- 发:
- 为每个 RLC SDU 生成 UMD PDU,在其中加上 RLC header.
- 当收到下层关于传输机会(transmission opportunity)的通知时,若需要,会将 RLC SDU 分段以满足下层对于PDU大小的规定。
- 收:
- 检查传输损失
- 重组SDU,若重组好则尽快发往上层。
- 当由于传输问题无法被正常重组进某个SDU时,丢弃PDU
AM RLC entity
可在 DCCH 或 DTCH 上收/发消息。
AM RLC 是唯一收/发 RLC control PDU 的,其内容为: STATUS PDU
- 发:
- 支持重传
- 若对SDU的分段不符合下层在一传输机会下对于PDU传输大小的规定,则AM RLC entity可对SDU重新分段。
- 重新分段的次数不受限制。
- 为每个RLC SDU(或段)生成 AMD PDU,在其中加上RLC header
- 支持重传
- 收:
- 检查是否重复接收,若是,丢弃重复的。
- 检查在下层传输时是否有丢失,若是,向对等实体请求重传。
- 重组SDU,若重组好则马上传给上层 (RLC实体的接收端不会缓存完整的SDU)。
1.2 Services
RLC向上层提供的服务: TM, UM, AM mode下的data transfer。
RLC向下层请求的服务:
- data transfer
- 关于传输机会的通知,以及在传输机会中RLC PDU大小的限制。
1.3 Functions
RLC子层支持的功能有:
- 上层PDU的传输
- AM mode下,用ARQ纠错
- AM, UM mode下,对RLC SDU的分段和重组。
- AM mode下,对RLC SDU段的重新分段。
- AM mode下,发现重复数据。
- AM, UM mode下,RLC SDU的丢弃
- RLC 重新建立
- AM mode下,对协议检错。
2. Procedures
2.1 RLC entity handling
RLC entity establishment
当上层请求RLC entity建立,则UE需要:
- 建立RLC entity;
- 将RLC entity的状态变量初始化;
- 按照2.2小节的流程进行。
RLC entity re-establishment
当上层请求RLC entity的重建立,则UE需要:
- 丢弃所有RLC SDU和段,RLC PDU;
- reset timers;
按照2.2小节的流程进行
RLC entity release
当上层请求RLC entity释放,则UE需要:
- 丢弃所有RLC SDU和段,RLC PDU;
- 释放RLC entity
2.2 Data transfer procedures
TM data transfer
- 发送:当发送一个新的TMD PDU到下层时,负责发送的TM RLC entity应该:
- 发送RLC SDU到下层,不做任何修改。
- 接收:当从下层接收一个新的TMD PDU时,负责接收的TM RLC entity应该:
- 传递TMD PDU到上层,不做任何修改
UM data transfer
Transmit
当发送一个UMD PDU到下层时,负责发送的RLC entity应该:
- 若UMD PDU包含RLC SDU的一个段,设SN(sequence number)为TX_Next;
- 若UMD PDU包含的段映射到RLC SDU的最后一byte,则TX_Next+1。
Receive
概述
UM RLC实体应该根据状态变量 RX_Next_Highest
维护一个重组窗口,范围为 [RX_Next_Highest - UM_Window_Size , RX_Next_Highest)
当从下层接收到一个UMD PDU时,UM RLC实体应:
- 要么将UMD PDU去掉RLC header后传到上层,要么丢弃UMD PDU,要么将其放入reception buffer
- 若接收的UMD PDU被放入reception buffer,则
更新状态变量,重组并传递RLC SDU给上层,并根据需要 start/stop t-Reassembly - 若t-Reassembly超时,则UM RLC 实体应:
更新状态变量,丢弃RLC SDU段并根据需要启动t-Reassembly
- RX_Next_Reassembly:当前等待重组的最早一个PDU的SN值。接收端默认SN小于该值的包都已被成功接收了。
- RX_Time_Trigger:保存了触发t-Reassembly的PDU的SN值的下一个SN。当启动t-Reassembly时,说明有小于该SN的PDU还未收到,此时需要等待这些PDU以便进行重排序。
- RX_Next_Highest:保存所有已接收的PDU中,最高的SN+1。该值对应reassembly window的上边界。
当一个UMD PDU从下层被接收,则UM RLC实体应:
- 若该UMD PDU不包含SN(说明这是个完整包),则去掉RLC header,将RLC SDU发给上层
- 若SN值落在 [ RX_Next_Highest - UM_Window_Size , RX_Next_Reassembly) 范围内,则出窗,将PDU丢弃
- 否则,将PDU放入reception buffer
为什么UM敢把落在特定范围内叫做“出窗”?因为UM没有重传,sn永远是向前走的,不可能落在窗口的左侧。
落在窗口左侧的pdu会被视为正常包接收,并移动窗口。
当一个SN = x 的 UMD PDU 放入 Reception buffer时,接收端会按照下列步骤操作:
-
若至此SN = x 的SDU的所有byte都已收到,则去掉RLC header,并将SDU重组传给上层。
-
若x = RX_Next_Reassembly,则更新RX_Next_Reassembly为目前下一个最早的SN值。
-
若x大于RX_Next_Highest,则RX_Next_Highest设为x+1,相应地 reassembly window也向前移。 因为前移而落到reassembly window之外的PDU,将被丢弃。
若前移后RX_Next_Reassembly也落到重组窗口外,则将其值更新为 大于等于RX_Next_Highest - UM_Window_Size,但还未被重组并传往上层的最早一个SN值。 -
若t-Reassembly正在运行
- 如果RX_Timer_Trigger <= RX_Next_Reassembly,或者;
- RX_Timer_Trigger落在reassembly window之外并且不等于RX_Next_Highest;
- RX_Next_Highest = RX_Next_Reassembly + 1,且SN = RX_Next_Reassembly的SDU已收齐;
则停止并重置t-Reassembly
-
若t-Reassembly没有运行(包括因为前面步骤导致的停止运行),且
- RX_Next_Highest > RX_Next_Reassembly+1(即至少还有一个 SN < RX_Next_Highest没收到,应启动定时器等待未接收的PDU)
- RX_Next_Highest = RX_Next_Reassembly + 1,且SN = RX_Next_Reassembly的SDU没收齐;
则启动t-Reassembly,并将RX_Timer_Trigger设置为RX_Next_Highest。
当t-Reassembly超时,则:
- 将RX_Next_Reassembly更新为不小于RX_Timer_Trigger,且未重组的第一个SN值。
- 丢弃所有SN < 新RX_Next_Reassembly的PDU。
- 若此时RX_Next_Highest >= RX_Next_Reassembly+1,且SN = RX_Next_Reassembly的SDU没收齐;
则启动t-Reassembly,并将RX_Timer_Trigger设置为 RX_Next_Highest