5G系列RLC (Radio Link Control )协议详解

Posted 从善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5G系列RLC (Radio Link Control )协议详解相关的知识,希望对你有一定的参考价值。

本人就职于国际知名终端厂商,负责modem芯片研发。
在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。


博客内容主要围绕:
       5G协议讲解
       算力网络讲解(云计算,边缘计算,端计算)
       高级C语言讲解
       Rust语言讲解

RLC协议详解

RLC:radio link control

一、RLC概述

RLC层主要功能:

  • transfer of upper layer PDUs;
  • error correction through ARQ (only for AM data transfer);
  • RLC SDU分段、重组 (only for UM and AM mode);
  • 重分段RLC SDU segments (only for AM mode);
  • duplicate detection (only for AM data transfer);
  • RLC SDU discard (only for UM and AM data transfer);
  • RLC re-establishment;
  • Protocol error detection (only for AM data transfer,达到最大重传次数).
  • RLC预处理功能,NR新增功能,减少layer 2的处理时延,为高速数据传输提供基础. (需要注意的是,RLC实体必须接收到来自MAC的传输机会通知后才可以向下层递交包,而PDCP将预处理的PDCP PDU递交下层是取决于实现的,具体时间点不限定

5G RLC V.S. LTE RLC:
       去除RLC SDU级联功能和按序递交功能。对于UM RLC,虽然有一定的检测丢包功能,但是UM RLC仍然可能向上层递交重复包(e.g.没有SN的UMD PDU不能进行重复性检测)。AM RLC保留重复性检测功能。


二、RLC 架构

  • RLC实体与上层(PDCP)之间的通道为RLC channel,与下层(MAC)之间的通道称为逻辑信道
  • 数据传输存在三种模式:TM(Transparent Mode,透明模式),UM(Unacknowledged Mode,非确认模式)以及AM(Acknowledged Mode,确认模式);根据业务的具体需求采用不同的传输模式;
  • 基于数据传输模式,RLC实体分为TM RLC实体,UM RLC实体以及AM RLC实体;一个AM RLC实体包括发送端和接收端共同组成

三、传输模式

  3.1 TM模式及TMD PDU

  • TM RLC只能传输BCCH,DL/UL CCCH以及PCCH的控制面信息;
  • TM RLC实体对经由TM RLC传输的数据包不做任何处理这些控制面信息的大小都经过筛选以便能以很高的速率到达所有需要接收的终端。因此不需要进行分段以适应不断变化的信道条件,也不需要基于反馈重传),直接递交上层或下层;
  • TMD PDU只包含TMD SDU,没有字头,其格式如下:

  3.2 UM模式及UMD PDU

  • UM RLC只传输UL/DL DTCH的数据包;
  • 一个UMD PDU要么包含一个完整的RLC SDU要么包含一个RLC SDU segment;包含原始RLC SDU的SDU segment的多个UMD PDU具有相同的SN(这是与LTE的主要区别)
  • 包含完整RLC SDU的UMD PDU没有SN如Fig.1:
  • 携带RLC SDU第一个分段的UMD PDU不需要SO域;SO域占16比特,用以指示RLC SDU segment在原始RLC SDU中的位置
  • UM PDU的pdcp_SN_size为6bit或12bit,由RRC配置



两比特SI域用以指示UMD PDU包含的是完整RLC SDU还是第一个/中间/最后的RLC SDU分段;

  3.3 AM模式及AMD PDU

  • AM RLC只传输UL/DL DCCHUL/DL DTCH的数据包;
  • 一个AMD PDU要么包含一个完整的RLC SDU要么包含一个RLC SDU segment;包含原始RLC SDU的SDU segment的多个AMD PDU具有相同的SN
  • AM RLC具有ARQ功能,重传时可以对RLC SDU进行重分段以适应MAC指示的容量大小;
  • 除传输AMD PDU外,AM RLC还可以传输STATUS PDU(RLC control PDU)
  • AMD PDU都有SN,这是因为AM RLC需要基于SN确保每个RLC PDU都成功接收了;
  • 携带RLC SDU第一个分段的UMD PDU不需要SO域;SO域占16比特,用以指示RLC SDU segment在原始RLC SDU中的位置;(与NR UMD PDU相同)
  • AM PDU的pdcp_SN_size为12bit或18bit,由RRC配置以适应不同的传输速率。例如,低速率选用较短SN可降低头开销



  3.4 AM模式及STATUS PDU


  • NACK_range用以指示从NACK_SN(包含NACK_SN对应的RLC SDU)开始连续丢失的RLC SDU的个数(NR新增域,减少反馈开销。引入该域的前提是假设MAC 将来自同一逻辑信道的RLC PDU按照RLC SN连续放置在TB中);
  • STATUS PDU的pdcp_SN_size为12bit或18bit,由RRC配置;
  • STATUS PDU用以反馈接收端的包接收状态(稍后详细介绍)

四、UM数据传输

  4.1 相关状态变量

  • SN取值范围: [ 0 , 2 [ s n − F i e l d L e n g t h ] – 1 ] [0, 2^{[sn-FieldLength]} – 1] [0,2[snFieldLength]1]范围内循环取值;
  • 状态变量取值范围:
    RLC实体通过一系列状态变量来维护发送/接收窗口。对于UM数据传输,状态变量有TX_NEXT/RX_Next_Reassembly/RX_Next_Highest/RX_Timer_Trigger;对于AM数据传输,状态变量有TX_Next_Ack/TX_NEXT/RX_Next/ RX_Next_Highest / RX_Next_Status_Trigger / RX_Highest_Status。所有状态变量均为非负值,在 [ 0 , 2 [ s n − F i e l d L e n g t h ] – 1 ] [0, 2^{[sn-FieldLength]} – 1] [0,2[snFieldLength]1]范围内循环取值;

由于SN循环取值,因此会出现SN wrap around的问题。为避免SN wrap around时实际接收窗口缩小导致丢包,协议规定相关状态变量在做运算和比较时必须遵守以下两个原则从而保证实际接收窗口固定不变:
状态变量的计算:
final value = [value from arithmetic operation] modulo 2 [ s n − F i e l d L e n g t h ] 2^{[sn-FieldLength]} 2[snFieldLength]

状态变量的比较:取模运算
例如,RX_Next <= SN < RX_Next + AM_Window_Size等价于:


[RX_Next – RX_Next] modulo 2 [ s n − F i e l d L e n g t h ] 2^{[sn-FieldLength]} 2[snFieldLength] <= [SN – RX_Next] modulo 2 [ s n − F i e l d L e n g t h ] 2^{[sn-FieldLength]} 2[snFieldLength] < [RX_Next + AM_Window_Size – RX_Next] modulo 2 [ s n − F i e l d L e n g t h ] 2^{[sn-FieldLength]} 2[snFieldLength]

  4.2 UM状态变量定义

    4.2.1发送UM RLC实体需要维护的状态变量

       UM RLC没有发送窗口

     发送UM RLC实体需要维护的状态变量:

  • TX_NEXT:该状态变量指示的是分配给下一个新产生的包含RLC SDU segment的UMD PDU的SN。该变量的初始值为0,在UM RLC向下层递交了包含RLC SDU最后一个片段的UMD PDU后按步长1更新

    4.2.2接收UM RLC实体需要维护的状态变量

  • RX_Next_Reassembly
    该变量指示的是接收到的UMD PDU中最早的待组装的PDU的SN。该变量的初始值为0,是接收窗口的下边界。
  • RX_Next_Highest
    该变量指示的是的接收到的UMD PDU的最大SN+1。该变量的初始值为0,是接收窗口的上边界。
  • RX_Timer_Trigger
    该变量指示的是触发t-Ressembly timer的UMD PDU的SN+1(用于RLC分段的重组)

  4.3 UM行为

发送操作:当UM RLC发送实体向底层递交UMD PDU时需要

  • 给包含SDU segment的UMD PDU关联SN=TX_NEXT;
  • 如果UMD PDU包含的是一个原始RLC SDU的最后一个片段,按步长1更新TX_NEXT;

接收操作:

  • NR UM RLC采用PULL window+t-reassembly timer的形式接收下层递交的UMD PDU;
  • 如果接收到的UMD PDU包含完整的RLC SDU,移除子头后直接递交上层;
  • 如果接收到的UMD PDU包含RLC SDU segment,首先判断该包是否该丢弃,如果没有被丢弃将放在接收buffer中;
  • 如果一个原始RLC SDU的所有SDU segment都接收到了,将重组成原始RLC SDU并递交上层(不需要按序递交);

【注】关于PULL window,接收RLC实体维护一个接收窗口如下:
(RX_Next_Highest – UM_Window_Size) <= SN <RX_Next_Highest
接收窗口只能依赖于接收窗口上边界状态变量(RX_Next_Highest)更新才能移动

  4.4 UM接收行为

以下以rlc-SN-Size=3bit,Window_Size=4为例介绍接收机制

接收示例:PULL window+timer的接收机制靠上边界更新移动接收窗口,如下
case 1:接收到窗口外的包(即接收到的RLC PDU的SN不满足 (RX_Next_Highest – UM_Window_Size)

如图,当SN=5收到时:

  • 更新RX_Next_Highest=6;
  • 丢弃落在接收窗口外的SN=1的UMD PDU;
  • 此时RX_Next_Reassembly落在窗口外,更新其值使其等于2;
  • RX_Next_Reassembly=RX_Next_Trigger=2,此时需停止定时器;
  • 由于RX_Next_Highest > RX_Next_Reassembly + 1,需要重新启动定时器,并设置RX_Next_Trigger=6;

【注】接收行为:

  • 1.更新RX_Next_Highest;
  • 2.丢弃所有落在接收窗口外的UMD PDU;
  • 3.如果RX_Next_Reassembly落在接收窗口外,则更新其值使其指向窗口内正等待重组递交上层的first UMD PDU;
  • 4.判断是否要停止或启动t-Reassembly 定时器;

如果t-reassembly定时器在运行,那么满足以下任一条件时,需要停止定时器:

  • RX_Timer_Trigger <= RX_Next_Reassembly;(认为接收窗口内小于RX_Next_Reassembly的包都收到了,不需要针对这些包开启定时器
  • RX_Timer_Trigger falls outside of the reassembly window and RX_Timer_Trigger is not equal to RX_Next_Highest;(接收窗口下边界
  • RX_Next_Highest = RX_Next_Reassembly + 1 and there is no missing byte segment of the RLC SDU associated with SN = RX_Next_Reassembly before the last byte of all received segments of this RLC SDU;(NR新增的判断条件,主要原因是NR中包含原始RLC SDU的多个RLC PDU共用SN

如果定时器没有运行(包括上述原因停止了定时器的情况),需要重启定时器:

  • RX_Next_Highest > RX_Next_Reassembly + 1;(这个条件说明还有包没有重组递交上层
  • RX_Next_Highest = RX_Next_Reassembly + 1 and there is at least one missing byte segment of the RLC SDU associated with SN = RX_Next_Reassembly before the last byte of all received segments of this RLC SDU;
  • 设置RX_Next_Trigger=RX_Next_Highest ;

接收示例:
case 2:t-reassembly定时器超时

如图,当定时器超时:

  • 更新RX_Next_Reassembly=2;
  • 丢弃SN=1的RLC PDU;
  • 由于RX_Next_Highest > RX_Next_Reassembly + 1,需要重新启动定时器,设置RX_Next_Trigger=6

【注】接收行为:

  • 1.更新RX_Next_Reassembly使其指向窗口内当前正等待重组递交上层的first UMD PDU;
  • 2.丢弃SN<RX_Next_Reassembly的UMD PDU;
  • 3.判断是否要重启t-Reassembly 定时器(判断方法依据case1所提的方法)

五、AM数据传输

5.1 AM状态变量定义

发送AM RLC实体需要维护的状态变量:

  • TX_Next_Ack
    该状态变量指示的是等待ACK的first AMD PDU的SN。该变量的初始值为0;当接收到SN等于TX_Next_Ack的AMD PDU的ACK指示时更新;(传输窗口的下边界)
  • TX_NEXT
    该状态变量指示的是分配给下一个新产生的包含RLC SDU segment的AMD PDU的SN。该变量的初始值为0;

接收AM RLC实体需要维护的状态变量:

  • RX_Next
    该变量指示的是last按序完全接收到的AMD PDU的SN+1。该变量初始值为0。是接收窗口的下边界
  • RX_Next_Highest
    该变量指示的是接收到的AMD PDU中具有最大SN的AMD PDU的SN+1。该变量初始值为0。
  • RX_Next_Status_Trigger
    该变量指示的是触发t-Ressembly timer的AMD PDU的SN+1
  • RX_Highest_Status
    该变量指示的是在构建STATUS PDU时可以通过ACK_SN指示的最高的可能的SN。该变量初始值为0。(考虑HARQ重传完成后,RLC实体可以判断接收状态的RLC SN.)

5.2 AM发送行为

💨发送操作:

  • AM RLC实体的发送端基于状态变量维护一个发送窗口:
    TX_Next_Ack <= SN < TX_Next_Ack + AM_Window_Size
  • 发送窗口移动依赖于收到下边界包的ACK指示;
  • 进行数据传输时,任何落在发送窗口外的AMD PDU是不能发送的,且重传包优于初传包

对于每一个从上层接收的RLC SDU(预处理):

  • 给RLC SDU关联SN=TX_NEXT(TX_NEXT记录的是处理的RLC PDU个数,不同于LTE,该变量不再是维护发送窗口所需的状态变量);
  • 按步长1增长TX_NEXT

当AM RLC实体的发送端向底层递交AMD PDU时:

  • 如果AMD PDU包含一个原始RLC SDU segment,那么关联该AMD PDU SN使其对应于原始RLC SDU的SN;

5.3 AM接收行为

💨接收操作:

  • NR AM RLC采用PUSH window+t-reassembly timer的形式接收下层递交的AMD PDU;
  • 如果接收到的AMD PDU落在接收窗口外,直接丢弃;
  • 如果接收到的AMD PDU落在接收窗口内,需要先进行重复性检测,没通过重复性检测的包或部分字节将被丢弃,通过重复性检测的包或字节放在接收buffer中;
  • 如果一个原始RLC SDU的所有SDU segment都接收到了,将重组成原始RLC SDU并递交上层

以下以rlc-SN-Size=3bit,Window_Size=4为例介绍

接收示例:PUSH window+timer的接收机制靠下边界更新移动接收窗口,如下
case 1:下边界状态变量对应的所有AMD PDU都接收到了

如图,当SN=0+1的包全部收到:

  • 将SN=0+1的包重组,去除子头递交上层;
  • 更新RX_Next=2;
  • RX_Next_Status_Trigger=RX_Next =2,需要停止定时器;
  • 由于RX_Next_Highest> RX_Next +1且SDU=3的包已全部收到,不需要重新启动定时器;

【注】接收行为:

  • 1.将下边界状态变量对应的AMD PDU重组,去除子头后递交上层;
  • 2.更新下边界状态变量RX_Next使其指向当前所有片段还没有全部收到的first RLC SDU;
  • 3.判断是否要停止或重启t-Reassembly 定时器

如果t-reassembly定时器在运行,那么满足以下任一条件时,需要停止定时器:

  • RX_Next_Status_Trigger = RX_Next;(认为小于RX_Next_的包都收到了,不需要针对这些包开启定时器
  • RX_Next_Status_Trigger = RX_Next + 1 and there is no missing byte segment of the SDU associated with SN = RX_Next before the last byte of all received segments of this SDU;(NR新增的判断条件
  • RX_Next_Status_Trigger falls outside of the receiving window and RX_Next_Status_Trigger is not equal to RX_Next + AM_Window_Size;(接收窗口下边界

如果定时器没有运行(包括上述原因停止了定时器的情况),需要重启定时器:

  • RX_Next_Highest> RX_Next +1;(这个条件说明还有包没有完全收到)
  • RX_Next_Highest = RX_Next + 1 and there is at least one missing byte segment of the SDU associated with SN = RX_Next before the last byte of all received segments of this SDU;
  • 设置RX_Next_Status_Trigger=RX_Next_Highest ;

接收示例:
case 2:定时器超时

如图,当定时器超时:

  • 更新RX_Highest_Status=2;
  • RX_Next_Status_Trigger=RX_Next =2,需要停止定时器;
  • 由于RX_Next_Highest> RX_Next +1且SDU=3的包还有多个片段没有收到,需要重新启动定时器,设置RX_Next_Status_Trigger=4;

【注】接收行为:

  • 1.更新RX_Highest_Status使其指向当前接收窗内所有片段还未完全收到的first RLC SDU;
  • 2.判断是否要重启t-Reassembly 定时器(判断依据case1所提的方法);

六、ARQ-状态报告(STATUS reporting)

状态报告的目的:对等AM RLC实体向发送端反馈哪些RLC SDU或RLC SDU segment已经成功收到,哪些还没有接收到

状态报告的触发条件:

  • 被动触发:发送端发送polling且满足一定条件
    • 条件为:
      1. P域为“1”的AMD PDU被丢弃了 或者
      2. 其SN满足x < RX_Highest_Status or x >= RX_Next + AM_Window_Size);
  • 主动触发:接收端检测到AMD PDU接收失败,在t-Reassembly定时器超时后触发;

t-StatusProhibit 定时器(防止频繁上报):

  • 状态报告触发后,如果t-StatusProhibit 定时器没有运行,则在新传时(MAC 指示的),将构建的STATUS PDU递交底层,同时开启定时器;
  • 状态报告触发后,如果t-StatusProhibit 定时器在运行,状态报告是不能发送的。需要等到定时器超时后,在第一个传输机会到来时,将构建的STATUS PDU递交给底层,同时开启定时器;

构建STATUS PDU:

  • 需要注意的是,t-Reassembly定时器超时会触发状态变量(RX_Highest_Status)更新以及状态报告。因此,应该以更新状态变量后的包接收状态来构建STATUS PDU可理解为状态报告的触发点在状态变量更新之后)。

七、ARQ-轮询(polling)

polling的目的:
发送端获取接收端的RLC PDU接收状态,从而进行数据重传;

polling的触发条件:

  • 累计传输AMD PDU(不包括重传)个数不小于预设阈值,即PDU_WITHOUT_POLL >= pollPDU;
  • 累计传输AMD PDU(不包括重传)总字节数不小于预设阈值,即BYTE_WITHOUT_POLL >= pollByte;
  • 传输完当前AMD PDU后传输buffer和重传buffer(等待ACK/NACK的RLC SDU或RLC SDU segment 除外)为空;
  • 传输完当前AMD PDU后不能再传输新的AMD PDU(如,传输窗口stalling)

t-PollRetransmit 定时器:

  • P域设置为“1”的AMD PDU递交下层后,启动或重启t-PollRetransmit定时器,并记录POLL_SN;
  • 当接收到反馈(NACK/ACK)的AMD PDU SN等于POLL_SN时,停止t-PollRetransmit定时器;
  • 当t-PollRetransmit定时器超时,如果没有待发数据,考虑重传POLL_SN对应的AMD PDU,同时设置P域;或者重传指示为NACK的AMD PDU并设置P域:

【注】:

  • 1.POLL_SN不一定指示的是携带有poll的AMD PDU的SN;
  • 2.t-PollRetransmit定时器超时后触发的poll,设置的POLL_SN可以与之前设置的值不同。

八、ARQ-重传

对丢失的RLC PDU重传是RLC的一项主要功能。该功能只适用于通过AM RLC实体传输的数据包。RLC的二级重传机制是MAC HARQ重传的补充,能进一步提高包传输的可靠性

重传的触发条件:

  • 对等AM RLC实体反馈的状态报告;

可以重传的包:

  • 如果接收端反馈的STATUS PDU指示某个RLC SDU或RLC SDU segment为NACK(意味着没有成功传输),AM RLC实体的发送端将对其进行重传,前提是:
    RLC SDU或RLC SDU segment的SN必须满足TX_Next_Ack <= SN < TX_Next

重传时,发送端行为:

  • 如果确定重传的RLC SDU或RLC SDU segment大于MAC指示的容量大小,则需要进行重分割;
  • AM RLC实体的发送端维护一个RETX_COUNT per SN的变量,用以记录重传次数;
  • 当达到最大传输次数(e.g., RETX_COUNT = maxRetxThreshold)时,指示高层已达到最大重传次数,然后触发后续行为(e.g. RRC re-establishment、SCell Failure)

九、SDU discard

SDU discard适用于AM RLC和UM RLC

当上层(PDCP)指示RLC丢掉某个RLC SDU,AM RLC 实体的发送端和发送UM RLC实体需要丢掉对应的包。但是能够丢掉的前提是:

  • 该RLC SDU或该RLC SDU segment还没有递交到下层(MAC)
  • 如果已经递交到MAC,则RLC 实体不能丢掉PDCP指示的RLC SDU(这种设计的原因是避免在AM RLC实体的发送端引入SN gap)。

十、RLC 可传数据(for BSR)

为便于MAC层执行缓存状态报告(buffer size report,BSR)以申请上行授权,UE认为以下为RLC层可传数据:
还没有被包含在RLC data PDU 的RLC SDU以及RLC SDU segment;

  • 等待初传的RLC PDU;
  • 对于 AM RLC,等待重传的RLC data PDU;
  • 触发的RLC STATUS PDU(估计在下一次传输机会时需要传输的STATUS PDU size,并将其作为可传数据的一部分);

【注】:MAC在上报BSR时需同时考虑PDCP可传数据以及RLC 可传数据并按照逻辑信道组上报待传数据量以请求上行授权。在后续MAC章节将详细介绍BSR相关技术点。


【5G系列】高层协议栈——协议栈架构
【5G系列】SDAP (Service Data Adaptation Protocol)协议详解
【5G系列】PDCP (Packet Data Convergence Protocol)协议详解
【5G系列】MAC (Medium Access Control)协议详解(Writing)


以上是关于5G系列RLC (Radio Link Control )协议详解的主要内容,如果未能解决你的问题,请参考以下文章

5G无线技术基础自学系列 | 5G信道结构

[4G/5G/6G专题基础-154]: 5G无线准入控制RAC(Radio Admission Control)

Radio Link Monitoring(RLM)

[深入研究4G/5G/6G专题-45]: 5G Link Adaption链路自适应-1-总体架构

[深入研究4G/5G/6G专题-46]: 5G Link Adaption链路自适应-2-常见缩略语

[深入研究4G/5G/6G专题-49]: 5G Link Adaption链路自适应-5-上行链路自适应ULLA-PUSCH信道