5GNR RLC
1 RLC概述
1.1 架构
RLC PDU分为:
- RLC data PDU
- RLC control PDU
如上图所示:RLC实体通过一个RLC channel从上层接收RLC SDU,然后组成RLC data PDU,通过逻辑信道发给下层。RLC实体有三种模式:
- TM,TM RLC实体,该模式只提供数据透传功能, 不会对数据进行任何更改,不会添加RLC头域。
- UM,Unacknowledge Mode,非确认模式,该模式不会对接收到的数据进行确认,即不会向发送端反馈ACK/NACK。类似是UDP,提供不可靠的传输服务。
- AM,Acknowledge mode,确认模式,通过出错检测和重传,提供可靠的传输服务,类似于TCP。
每个模式都可以进行数据的收发,在TM和UM模式,分别用不同的实体进行发送和接收,但是在AM模式使用相同的实体进行数据的收发。
每个逻辑信道都有指定的RLC模式:
- BCCH/PCCH/CCCH仅用于RLC TM模式
- DCCH仅用于RLC AM模式
- DTCH可用于RLC UM或者AM模式
1.2 功能
- 传输上层PDU
- 通过ARQ进行纠错(仅AM模式),MAC层的HARQ机制的目的在于实现非常快速的重传,反馈出错率在0.1~1%左右,对于某些业务,如TCP传输(要求丢包率小于),HARQ反馈的出错率就显得过高了,对于这类业务,RLC层的重传处理能够进一步降低反馈出错率。
- 分段/重组RLC SDU(AM和UM模式),在一次传输机会中,一个逻辑信道可以发送的所有RLC PDU的大小是有MAC层指定的,如果大小不能保证每一个要发送的RLC PDU都可以完整的发送,就需要对RLC PDU进行分段处理,以匹配MAC层指定的大小。同样的,在接收端要对被分段的RLC PDU进行重组,恢复出原因的数据,并且发送给上层。
- 对RLC SDU分段进行重分段(仅AM模式),当一个RLC SDU分段需要重传,但MAC层指定的大小无法保证该RLC SDU分段完全发送出去时,就需要对该RLC SDU分段进行重分段处理。
- 重复检测(仅AM模式),出现重复包的最大可能性是数据接收端反馈了HARQ ACK,但是发送端错误的将其解释为NACK,而导致了不必要的MAC PDU重传。另外RLC层的重传也可能带来重复包。
- RLC SDU丢弃处理(AM和UM模式),当PDCP层指示RLC层丢弃一个特定的RLC SDU时,RLC层会触发RLC SDU丢弃处理。如果此时没有将该RLC SDU或者部分分段递交给MAC层,则AM或UM实体发送端会丢弃指示的RLC SDU。
- RLC重建,切换流程中,RRC层会要求RLC层进行重建,此时RLC层会停止并重置所有定时器,将所有的状态变量重置为初始值,并丢弃所有的RLC SDU/RLC SDU分段和RLC PDU。
- 协议错误检测(仅AM模式)
2 PDU格式和参数
2.1 TMD PDU
TMD PDU只有数据部分,没有任何的RLC头域。
2.2 UMD PDU
UMD PDU由UMD数据域和UMD头域组成,UMD头域是按字节对齐。
当UMD PDU由一个完整的RLC SDU组成,则UMD头域仅包含SI和R域。UM RLC实体是有RRC配置6bit SN或者12bit SN,只有对应的RLC SDU是分段的时候,UMD PDU头域才包含SN域。传输RLC SDU第一个分段的UMD PDU头域中不包含SO字段,SO字段的长度是16bit。
2.3 AMD PDU
AMD PDU由AMD数据域和AMD头域组成,AMD头域是按字节对齐。
RRC配置AM RLC实体为12bit SN或者18bit SN,AMD PDU头域的长度分别为2字节和3字节。
AMD PDU头域包括一个D/C字段,一个P字段,一个SI字段和一个SN字段。只有当AMD PDU的数据是由分段组成,且不是第一个分段时头域中才包含SO字段,这个字段占16bit。
2.4 STATUS PDU
STATUS PDU是由STATUS PDU payload和RLC控制PDU头组成。
RLC控制PDU头由D/C和CPT字段组成。
STATUS PDU payload从RLC控制PDU头后面第一个bit开始,由一个ACK_SN和一个E1字段,0个或者多个NACK_SN,一个E1/E2/E3字段,可能包含一对SOstart和SOend字段或者为每一个NACK_SN的一个NACK字段组成。
2.5 参数
SN:对于AMD PDU为12bits或者18bits,对于UMD PDU为6bits或12bits。表示对应RLC SDU的序列号,对于RLC AM其值对每一个RLC SDU进行加1,对于RLC UM其值对于每一个RLC SDU分段进行加1。
SI:2bits,用于指示RLC SDU是否是完整的RLC SDU或者RLC SDU的第一,中间,最后一个分段。
Value | Description |
---|---|
00 | Data field contains all bytes of an RLC SDU |
01 | Data field contains the first segment of an RLC SDU |
10 | Data field contains the last segment of an RLC SDU |
11 | Data field contains neither the first nor last segment of an RLC SDU |
SO:16bits,表示在最初的RLC SDU中RLC SDU分段的位置,以字节为单位。具体地,SO表示初始RLC SDU的位置,对应着数据字段的RLC SDU分段的第一个字节。初始RLC SDU的第一个字节被SO字段值"0000000000000000"引用,编号从0开始。
D/C:1bit,表示RLC SDU是RLC数据PDU或者控制PDU:
Value | Description |
---|---|
0 | Control PDU |
1 | Data PDU |
P:1bit,表示发送端的AM RLC实体是否从他的对端AM RLC实体请求状态报告。
Value | Description |
---|---|
0 | Status report not requested |
1 | Status report is requested |
R:1bit,R15版本中为保留位,发送端把这个字段设置成0,接收端忽略这个字段。
CPT:3bits,表示RLC控制PDU的类型:
Value | Description |
---|---|
000 | STATUS PDU |
001- | Reserved(PDUs with this coding will be discarded by the receiving entity for this release of the protocol) |
ACK_SN:12bits或者18bits,ACK_SN字段指示在状态PDU中没有被报告为丢失的下一个未接收的RLC SDU的SN。当AM RLC实体的发送方接收到STATUS PDU时,它将解释其对等AM RLC实体已接收到所有但不包括SN = ACK_SN的RLC SDU,但不包括STATUS中指示的那些RLC SDU 带有NACK_SN的PDU,在状态PDU中以NACK_SN,SOstart和SOend指示的RLC SDU的一部分,在状态PDU中以NACK_SN和NACK_range指示的RLC SDU以及在状态PDU中的NACK_SN。
NACK_SN:12bits or 18bits,指示AM RLC实体接收端探测到丢失的RLC SDU的SN。
E1:1bit,指示是否有字段E1/E2/E3。
Value | Description |
---|---|
0 | A set of NACK_SN, E1, E2 and E3 does not follow. |
1 | A set of NACK_SN, E1, E2 and E3 follows. |
E2:1bit,指示是否包括SOstart和SOend字段。
Value | Description |
---|---|
0 | A set of SOstart and SOend does not follow for this NACK_SN. |
1 | A set of SOstart and SOend follows for this NACK_SN. |
E3:1bit,指示是否跟随关于尚未接收到的RLC PDU的连续序列的信息。
Value | Description |
---|---|
0 | NACK range field does not follow for this NACK_SN. |
1 | NACK range field follows for this NACK_SN. |
SOstart:16bits,指示SN=NACK_SN的已在AM接收侧检测为丢失的RLC SDU部分, 具体地,SOend字段指示RLC SDU部分的最后字节的位置,以原始RLC SDU内的字节为单位。
SOend:16bits,
NACK range:8bits,从NACK_SN开始并且包括NACK_SN的连续丢失的RLC SDU的数量。
3 RLC实体
3.1 TM RLC实体
-
TM RLC实体从BCCH, DL/UL CCCH, PCCH逻辑信道发送和接收RLC PDU。
-
TM RLC实体发送和接收的RLC data PDU称为:TMD PDU。
发送时,TM RLC实体从RLC SDUs生成TMD PDUs:
- RLC SDUs不进行分段
- TMD PDUs中不包括任何RLC头
也就是说TM RLC实体不对数据进行任何加工, bypass。。
接收时,TM RLC实体接收TMD PDUs:
- 传输TMD PDUs到上层。 bypass too
3.2 UM RLC实体
-
UM RLC实体通过DL/UL DTCH逻辑信道发送接收RLC PDUs。
-
UM RLC实体发送接收的RLC data PDU称为UMD PDU。
-
每个UMD PDU包含一个完整的RLC SDU或者一个RLC SDU段。
UM RLC实体发送端为每个RLC SDU生成UMD PDU,每个UMD PDU中都包括相关的RLC报头。当底层通知了传输机会,UM RLC实体发送端根据需要对RLC SDU进行分段,对应UMD PDU的RLC报头也进行更新,底层指示RLC PDU的总大小。
UM RLC实体接收UMD PDU时:
- 检测底层的RLC SDU段的丢失;
- 从接收的UMD PDU重组出RLC SDU,并且一旦可用就把RLC SDU传输给上层
- 丢失不能重组到RLC SDU中的UMD PDU,由于属于特定RLC SDU的UMD PDU是低层丢失所致。
3.3 AM RLC实体
-
AM RLC实体通过DL/UL DCCH 或者 DL/UL DTCH逻辑信道发送接收RLC PDUs。
-
AM RLC实体发送接收的RLC data PDU称为AMD PDU。
-
每个AMD PDU包含一个完整的RLC SDU或者一个RLC SDU段。
-
AM RLC实体发送接收的RLC控制PDU称为:STATUS PDU。
AM RLC实体发送端为每个RLC SDU生成AMD PDU,当底层通知传输机会时,如果需要AM RLC实体发送端对RLC SDU进行分段,对应AMD PDU的RLC报头也进行更新,底层指示RLC PDU的总大小。
AM RLC实体发送端支持RLC SDU或者RLC SDU段进行重传(ARQ)
- 如果重传的RLC SDU或RLC SDU段和底层通知的特定传输机会中底层指示的RLC PDU总大小不匹配,AM RLC实体会对RLC SDU进行分段或者对RLC SDU段进行重分段。
- 重传次数没有限制
当AM RLC实体发送端从RLC SDU或RLC SDU段形成AMD PDU:
- 在AMD PDU中包括相关的RLC 报头。
AM RLC实体接收段接收AMD PDUs时:
- 检测是否接收到了重复的AMD PDU,如果有就丢弃掉;
- 检测底层丢失的AMD PDU,并要求对等AM RLC实体进行重传;
- 从接收到的AMD PDU重组RLC SDU,尽快的发送RLC SDU到上层。
4 RLC流程
4.1 RLC实体处理
RLC实体建立
当上层请求RLC实体建立时,UE应该:
- 建立RLC实体
- 将RLC实体的状态变量设在为初始值
- 按照数据传输流程进行操作
RLC实体重建
当上层请求重建RLC实体时,UE应该:
- 如果有就丢弃所有的RLC SDU,RLC SDU片段和RLC PDU。
- 停止并重置所有计时器
- 将所有状态变量重置为其初始值
RLC实体释放
当上层请求释放RLC实体时,UE应该:
- 如果有就丢弃所有RLC SDU,RLC SDU片段和RLC PDU
- 释放RLC实体
4.2 数据传输流程
4.2.1 TM数据传输
当向下层提交新的TMD PDU时,发送端TM RLC实体应该:
- 只提交RLC SDU,而不对下层进行修改。
当从底层接收新的TMD PDU时,接收端TM RLC实体应该:
- 提供TMD PDU,而无需对上层进行任何修改。
4.2.2 UM数据传输
当向下层提及UMD PDU时,发送端UM RLC实体应该:
- 如果UMD PDU包含RLC SDU的一段,则将UMD PDU的SN设置为TX_NEXT
- 如果UMD PDU包含映射到RLC SDU的最后一个字节的片段,则将TX_NEXT递增1
接收端UM RLC实体应根据状态变量RX_Next_Highest维护的重组窗口:
- 如果(RX_Next_Highest – UM_Window_Size) <= SN <RX_Next_Highest,则SN落入重组窗口内。
- 否则SN落在重组窗口外面
当从底层接收UMD PDU时,接收端UM RLC实体应该:
- 移除RLC包头后,把UM PDU传送到上层,丢弃已经接收到的UMD PDU,或者将其放到接收缓存区中。
- 如果接收到的UMD PDU放在了接收缓存区中
- 更新状态变量,重新组装并且发送RLC SDU到上层,,并根据需要启动/停止t-Reassembly
当t-Reassembly超时,接收端UM RLC实体:
- 更新状态变量,丢弃RLC SDU片段,并根据需求启动t-Reassembly
当UMD PDU已经从底层接收,接收端UM RLC实体应该:
- 如果UMD PDU报头没有包含SN
- 移除RLC报头,并发送RLC SDU到上层
- 如果(RX_Next_Highest – UM_Window_Size) <= SN < RX_Next_Reassembly:
- 丢弃接收到的UMD PDU
- 或者
- 把接收到的UMD PDU放到接收缓存中。
当SN=x的UMD PDU放到了接收缓存中,接收端UM RLC实体将:
- 如果SN=x的所有字节片段都已经接收
- 重组SN=x的所有字节片段的RLC SDU,移除RLC报头,并且发送重组的RLC SDU到上层。
- 如果x = RX_Next_Reassembly:
- 更新RX_Next_Reassembly到SN>current_RX_Next_Reassembly的没有被重组和发送到上层的第一个SN中。
- 如果x落在了重组窗口之外
- 更新RX_Next_Highest=1
- 丢弃SN落在重组窗口之外的任何UMD PDU
- 如果RX_Next_Reassembly落在重组窗口之外
- 把RX_Next_Reassembly设置为第一个SN >= (RX_Next_Highest – UM_Window_Size) 的没有重组和提交到上层的SN中。
- 如果t-Reassembly在运行:
- 如果RX_Timer_Trigger <= RX_Next_Reassembly
- 如果RX_Timer_Trigger落在重组窗口之外,并且RX_Timer_Trigger不等于RX_Next_Highest
- 如果RX_Next_Highest = RX_Next_Reassembly + 1,并且在此RLC SDU的所有接收片段的最后一个字节之前,没有与SN = RX_Next_Reassembly相关联的RLC SDU的丢失字节段
- 停止并且重置t-Reassembly
- 如果t-Reassembly没有运行:
- 如果RX_Next_Highest > RX_Next_Reassembly + 1;
- 如果RX_Next_Highest = RX_Next_Reassembly + 1 ,并且在此RLC SDU的所有接收片段的最后一个字节之前,至少一个SN = RX_Next_Reassembly相关联的RLC SDU的丢失字节段
- 启动t-Reassembly
- 设置RX_Timer_Trigger = RX_Next_Highest.
当t-Reassembly超时,接收端UM RLC实体将:
- 更新RX_Next_Reassembly为没有重组的第一个 SN >= RX_Timer_Trigger的SN
- 丢弃所有SN < updated RX_Next_Reassembly的片段
- 如果RX_Next_Highest > RX_Next_Reassembly + 1
- 如果RX_Next_Highest = RX_Next_Reassembly + 1,并且在此RLC SDU的所有接收片段的最后一个字节之前,至少一个SN = RX_Next_Reassembly相关联的RLC SDU的丢失字节段
- 启动t-Reassembly
- 设置RX_Timer_Trigger = RX_Next_Highest
4.2.3 AM数据传输
AM RLC实体的发送端应优先考虑传输通过AMD PDU的RLC控制PDU,AM RLC实体发送端应优先传输包含先前发送的RLC SDU或RLC SDU段的AMD PDU的传输包含先前发送的RLC SDU或者RLC SDU段的AMD PDU。
AM RLC实体的发送端应根据状态变量TX_Next_Ack维护发送窗口。
- 如果TX_Next_Ack <= SN < TX_Next_Ack + AM_Window_Size,SN将落在传输窗口中。
- 否则SN将落在传输窗口之外。
AM RLC实体的发送端不会把SN落在传输窗口之外的任何AMD PDU传输给底层。
对于从上层接收到的每一个RLC SDU,AM RLC实体将:
- 关联一个RLC SDU的SN = TX_Next以及通过设置AMD PDU的SN = TX_Next来构造一个AMD PDU。
- TX_Next++
当传输一个包含RLC SDU段的AMD PDU到底层时,AM RLC实体的发送端应该:
- 设置AMD PDU的SN为对应RLC SDU的SN。
AM RLC发送端接收一个RLC SDU的积极确认(对端的AM RLC实体确认已经成功接收)
- 来自对端AM RLD实体的STATUS PDU。
当接收一个RLC SDU的SN=x的积极确认时,AM RLC对端实体将:
- 发送指示通知上层已经成功发出了RLC SDU。
- 把TX_Next_Ack设置为等于RLC SDU的最小的SN,SN在范围TX_Next_Ack <= SN <= TX_Next中,并且还没有接收到积极的确认。
AM RLC实体接收端将通过状态变量RX_Next维护一个接收窗口。
- 如果RX_Next <= SN < RX_Next + AM_Window_Size,SN落在接收窗口内;
- 否则SN落在接收窗口外
当从底层接收AMD PDU时,AM RLC接收端的实体将:
- 或者废弃AMD PDU,或者把它放到接收缓存中;
- 如果接收到的AMD PDU已经放到了接收缓存中;
- 更新状态变量,重新组装以及发送RLC SDU到上层,并且根据需要启动/停止t-Reassembly
当t-Reassembly超时,AM RLC接收端实体将:
- 更新状态变量,并且根据需要启动t-Reassembly
当一个AMD PDU已经从底层收到,其中AMD PDU包含SN=x的RLC SDU的字节段号y到z,AM RLC实体接收端将:
- 如果x落在接收窗口之外;
- 如果SN=x的RLC SDU的字节段号y到之前已经接收到了;
- 废弃接收到的AMD PDU。
- 或者
- 把接收到的AMD PDU放到接收缓存中。
- 如果包含在AMD PDU中的RLC SDU的一些字节段之前已经接收到了;
- 废弃重复的字节段。
当SN=x的AMD PDU已经放到了接收缓存中时,AM RLC实体接收端将:
- 如果x >= RX_Next_Highest
- 更新RX_Next_Highest = x+1
- 如果SN=x的RLC SDU所有字节已经收到:
- 重新组装从SN=x的AMD PDU的RLC SDU,移除RLC头字段,发送重组的RLC SDU到上层。
- 如果x = RX_Highest_Status
- 更新RX_Highest_Status为SN > current RX_Highest_Status的第一个RLC SDU的SN,但尚未接收到所有的字节。
- 如果x=RX_Next
- 更新RX_Next 为SN > current RX_Next的第一个RLC SDU的SN,但尚未接收到所有的字节。
- 如果t-Reassembly正在运行
- 如果RX_Next_Status_Trigger = RX_Next;
- 如果RX_Next_Status_Trigger = RX_Next+1,并且在此SDU的所有接收段的最后一个字节之前,没有与SN = RX_Next相关联的SDU的丢失字节段;
- 如果RX_Next_Status_Trigger落在接收窗口之外,并且RX_Next_Status_Trigger 不等于RX_Next + AM_Window_Size
- 停止并且重置t-Reassembly
- 如果t-Reassembly没有运行
- 如果RX_Next_Highest> RX_Next +1
- 如果RX_Next_Highest = RX_Next + 1,并且在该SDU的所有接收到的段的最后一个字节之前,至少有一个与SN = RX_Next相关联的SDU丢失字节段
- 启动t-Reassembly
- 设置RX_Next_Status_Trigger = RX_Next_Highest
当t-Reassembly超时,AM RLC实体接收端将:
- 将SN> = RX_Next_Status_Trigger的RX_Highest_Status更新为第一个RLC SDU的SN,但尚未收到所有字节;
- 如果 RX_Next_Highest> RX_Highest_Status +1;
- 如果RX_Next_Highest = RX_Highest_Status + 1,并且在此SDU的所有接收段的最后一个字节之前,至少有一个SN = RX_Highest_Status关联的SDU丢失字节段;
- 启动t-Reassembly
- 设置RX_Next_Status_Trigger = RX_Next_Highest
4.3 ARQ流程
ARQ过程仅由AM RLC实体执行。
4.3.1 重传
AM RLC实体发送端能接收RLC SDU或其片段的否定确认通过:
- 来自对端AM RLC实体的STATUS PDU
当正在接收来自对端AM RLC实体的否定确认时,AM RLC实体的发送端将:
- 如果对应RLC SDU的SN落在范围TX_Next_Ack <= SN < = 提交到底层的AMD PDUs中的AMD PDU的最高的SN。
- 考虑接收到否定确认以进行重传的RLC SDU或RLC SDU段。
当RLC SDU或其片段考虑重传,AM RLC实体接收端将:
- 如果第一次考虑RLC SU或其片段进行重传
- 将于RLC SDU关联的RETX_COUNT设置为0
- 或者 如果尚未等待重传,并且由于同一STATUS PDU中的另一个否定确认,与RLC SDU相关的RETX_COUNT尚未增加:
- RETX_COUNT++
- 如果RETX_COUNT = maxRetxThreshold
- 向上层指示已经达到最大重传。
当正在重传RLC SDU或者RLC SDU段时,AM RLC实体的发送端将:
- 如果需要, 对RLC SDU或者RLC SDU段进行分段;
- 形成一个新的AMD PDU,该AMD PDU将在特定的传输机会下由下层指示的AMD PDU的总大小;
- 提交新的AMD PDU到底层;
当形成新的AMD PDU时,AM RLC实体的发送端将:
- 仅把原始的RLC SDU或RLC SDU段映射到新AMD PDU的数据域;
- 修改新AMD PDU的头域
- 设置P字段
4.3.2 轮询
AM RLC实体可以轮询其对等的AM RLC实体,以便在对等的AM RLC实体处触发STATUS报告。
在下层通知传输机会后,对于每个要发送的AMD PDU,使得AMD PDU包含先前未发送的RLC SDU或包含先前未发送的字节段的RLC SDU段,AM RLC实体的发送端将:
- PDU_WITHOUT_POLL++
- 将BYTE_WITHOUT_POLL增加到它映射到AMD PDU的数据字段的数据字段元素的每个新字节;
- 如果PDU_WITHOUT_POLL >= pollPDU,或者
- 如果BYTE_WITHOUT_POLL >= pollByte
- 如下所述在AMD PDU中包含一个轮询
在下层通知传输机会后,对于每个要发送的AMD PDU,AM RLC实体的发送端将:
- 如果发送AMD PDU之后,传输缓存和重传缓存都为空,或者
- 如果发送AMD PDU之后,没有新的RLC SDU发送,
- 如下所述在AMD PDU中包含一个轮询
AMD PDU中包含轮询,AM RLC实体发送端将:
- 设置AMD PDU的P字段为1
- 设置DU_WITHOUT_POLL = 0;
- 设置BYTE_WITHOUT_POLL = 0;
提交包含轮询的AMD PDU到底层后,AM RLC实体发送端将:
- 设置POLL_SN 为发送到底层的AMD PDU的最高SN
- 如果t-PollRetransmit没有运行
- 启动t-PollRetransmit
- 或者
- 重启t-PollRetransmit
从接收RLC AM实体接收到状态报告后,AM RLC实体的发送端将:
- 如果状态报告包含对RLC SDU的肯定或否定确认,其序号等于POLL_SN:
- 如果t-PollRetransmit正在运行
- 停止并且重置t-PollRetransmit
- 如果t-PollRetransmit正在运行
在t-PollRetransmit超时,AM RLC实体的发送端将:
- 如果发送缓存和重传缓存都为空;或者
- 如果没有新RLC SDU或RLC SDU段传送,
- 考虑在提交给下层以进行重发的RLC SDU中具有最高SN的RLC SDU;
- 考虑尚未得到肯定确认的RLC SDU
- AMD PDU中包括轮询
4.3.3 状态报告
AM RLC实体发送STATUS PDU到对等的AM RLC实体来提供RLC SDU的肯定或者否定确认。
触发初始STATUS报告包括:
- 从对等RLC实体进行轮询
- 当从底层接收到SN=x的AMD PDU,并且P字段为1,AM RLC实体的接收端将;
- 如果AMD PDU被废弃了,或者
- 如果x < RX_Highest_Status or x >= RX_Next + AM_Window_Size;
- 触发STATUS报告
- 或者
- 延时触发STATUS报告直到 x < RX_Highest_Status or x >= RX_Next + AM_Window_Size
当STATUS报告已经触发,AM RLC实体接收端将:
- 如果t-StatusProhibit没有运行
- 在底层指示的第一个传输时机,构造STATUS PDU并且提交到底层;
- 或者
- 在t-StatusProhibit超时之后,底层指示的第一个传输时机。即使在运行t-StatusProhibit时触发了几次状态报告,也要构造一个STATUS PDU并将其提交给下一层。
当STATUS PDU已经提交到底层,AM RLC实体接收端将:
- 启动t-StatusProhibit
当构造STATUS PDU时,AM RLC实体将:
- 对于还没有完全接收的,RX_Next <= SN < RX_Highest_Status的RLC SDU,以RLC SDU的SN顺序增加和RLC SDU中的字节段顺序增加。从SN = RX_Next开始,直到结果STATUS PDU仍然适合下层指示的RLC PDU的总大小;
- 对于尚未收到字节段的RLC SDU;
- 在STATUS PDU中包括NACK_SN,该NACK_SN设置为RLC SDU的SN
- 对于尚未接收的部分接收的RLC SDU的字节段的连续序列
- 在STATUS PDU中包括一组NACK_SN,SOstart 和 SOend
- 对于尚未接收的连续序列的RLC SDU
- 在STATUS PDU中包括一组NACK_SN 和 NACK range
- 在STSTUS PDU中如果需要包含一对 SOstart 和 SOend
- 对于尚未收到字节段的RLC SDU;
- 将ACK_SN设置为下一个未接收到的RLC SDU的SN,在结果STATUS PDU中未将其指示为丢失。
4.3.4 SDU丢弃流程
当从上层指示丢弃特定RLC SDU时,如果RLC SDU及其片段都未被提交,则AM RLC实体发送端或者UM RLC实体发送端丢弃指示的RLCSDU。如果RLC SDU或者RLC SDU段已经发送到底层,当丢弃RLC SDU时,AM RLC实体发送端将不引入RLC SN间隙。
4.3.5 数据量计算
出于MAC缓冲状态报告的目的,终端应考虑下列的RLC数据量
- RLC SDU和RLC SDU段尚未包含在RLC数据PDU中
- 正在等待初始传输的RLC数据PDU;
- RLC数据正在等待重传的PDU(RLC AM)
此外,如果STATUS PDU已触发并且t-StatusProhibit没有运行或已经超时,终端将估计在下一次传输机会中出传输的STATUS PDU的大小,并将其视为RLC数据量的一部分。
reference
TS38322-Radio Link Control (RLC) protocol specification