NR RLC协议梳理【原创】

写在最前

        笔者实际工作中,AM mode对于data传输最为常见,本文以RLC AM mode作为主要介绍。

        NR和LTE的RLC SDU规则略有不同,本文暂不论述LTE相关的内容。

        如有错误敬请指正,转载请注明出处。

1.RLC层的功能概述

        The main services and functions of the RLC sublayer depend on the transmission mode and include:

  • 负责上层 PDU 的传输 (即PDCP传下来的包向底层递送)
  • 负责独立于 PDCP 中的序列编号(UM 和 AM) (即RLC有自行的序列号sn)
  • 通过ARQ做错误检测(AM only)
  • RLC SDU 的分段(AM 和 UM)和重分段(AM only)
  • RLC SDU 的重组(AM 和 UM)
  • 重复检测(AM only)
  • RLC SDU 丢弃(AM 和 UM)
  • RLC 触发重建RRE
  • 协议错误检测(AM only)

        * 节选自Ts 38.300概述 6.3.2

2.RLC的三种模式

  • TM(Transparent Mode),透明模式
  •  UM(Unacknowledge Mode),非确认模式
  •  AM(Acknowledge mode),确认模式

差异如下表中高亮差异,逻辑上三者属于层层递进、趋向逐渐复杂/完整。

TM模式① 不用加RLC包头(少了信令开销)
② 不用进行拆分/重组
③ 不需要ack/nack反馈
④ 支持信道为BCCH(广播信道)、 PCCH(寻呼信道) 和 CCCH(公共信息信道/用于initial RACH)
⑤ buffer只在Tx端需要支持
⑥ Tx和Rx的实体是两套(分离的entity)
UM模式① 要加RLC包头
② 可以进行拆分/重组
③ 不需要ack/nack反馈
④ 支持信道为DTCH(专用业务信道,Dedicated Traffic Channel),通常用于voip数据业务和ims业务(call/SMS/MMS)
⑤ buffer只在Tx和Rx端均需要支持
⑥ Tx和Rx的实体是两套(分离的entity)
AM模式① 要加RLC包头
② 可以进行拆分/重组
③ 需要ack/nack反馈(有ARQ能力)
④ 支持信道为DCCH、DTCH,通常用于data和IMS SIP消息(一般面向需要ack的业务)
⑤ buffer只在Tx和Rx端均需要支持
⑥ Tx和Rx的实体是一套(如上图AM RLC entity是一整块)

3.RLC AM模式下的传输概述

3.1 AM模式下可以发什么?

  • data PDU(可以是一整个,也可以是RLC的一个分段)
  • control PDU(STATUS PDU,用于进行ARQ)

3.2 发送侧数据怎么放?

  • PDCP来的data先放在transmission buffer,底层(MAC)有grant的时候就发出
  • RLC的data发出后,发出的data不会被丢弃,而是放在Retransmission buffer(备份),等到这个data收到了ack/发送失败之后,再丢弃

3.3 接收侧数据怎么放?

  • 接收到数据包,先放在Reception buffer,重组之后递交给PDCP

4.[重点]AM传输模式下的发送/Tx逻辑

  • 重点变量:
    • TX_Next: 下一个SDU的SN号. 当收到上传传递的新的SDU时,将其SN设置为TX_Next,同时TX_Next + +
    • TX_Next_ACK:窗口内未收到ACK的最小的SN号
    • AM_Window_Size:发送窗大小。

                - RRC高层消息(DRB建立过程) 配置了12比特SN时, AM_Window_Size =2048

                - 当配置了18比特SN时, AM_Window_Size = 131072(Ts 38.322 CH7.2)

  • TX window: [ TX_Next_ACK, TX_Next_ACK + AM_Window_Size ), 发送窗满则不能再发送新的数据了。
  • 快速理解:
    • TX_Next是当前发送的上限包的下一位
    • TX_Next_ACK是当前发送的下限的下一位,同时也表征比该值小的包统统都发完了

//发送示例图

5.[重点]AM传输模式下的接收/Rx逻辑

5.1 简单介绍下行接收逻辑

  • 重点变量
    • RX_Next: 接收窗内未接收完毕的SDU的SN中最小的SN。当SN=RX_Next的SDU接收完毕时,更新到下一个未接收完毕的SN.
    • RX_Next_Highest:接收窗内,接收到的最大SN的下一个SN。当接收到的SN > RX_Next_Highest时,更新其为SN, 此时SN的SDU并不一定接收完毕。
    • AM_Window_Size:接收窗大小
    • RX window: [ RX_Next, RX_Next + AM_Window_Size )
  • 快速理解:
    • RX_Next是当前全部接收的下限包的下一位
    • Rx_Next_Highest是当前零散接收到的上限包的下一位

5.2 接收逻辑引申:重传和相关变量

  • 因为相对于Tx而言,Rx需要做ack/nack的反馈。所以新增了2个变量和1个timer,用来追踪哪个范围的包需要重传。
    • RX_Next_Status_Trigger(启动t-Reassembly时的最大接收SN+1)
    • RX_Highest_Status(该sn以下的包方可发送status report,更新时机是其下的包都ack/nack过了,或t-Reassembly超时)

 § 协议定义过于抽象,可以理解成最大的已完全接收到(已经发过ack/nack)的sn+1,或者t-reassembly超时了但还没完全收完的sn+1。

        主要是说明这个sn之下的sn是可以去发送status report的


更新节点:

        ①出现更大的PDU被接收完,要变更为当前最大的sn的下一位;

        ②t-reassembly超时,更新为当前sn≥RX_Next_Status_Trigger的还未完成全部分段接收的sn,也就是我等你重传,但最后你还是没发送成功,此时可以给tx端发nack

  • t-Reassembly:当出现离散收包之后启动

5.3 t-Reassembly详细解读

5.3.1 t-Reassembly

  • 启动条件:

            ①RX_Next_Highest>RX_Next+1,说明中间有包没收到(离散收包)
            ②RX_Next_Highest=RX_Next+1,但RX_Next的分段还没有完成重组(当前最低的包没有收完)

  • 启动t-Reassembly动作:

            将RX_Next_Status_Trigger设置为RX_Next_Highest(刷新状态报告上限)

  • t-Reassembly超时时的动作:

            ①发送Status PDU(ack/nack)
            ②重启t-Reassembly
            ③做RX_Highest_Status和RX_Next_Status_Trigger的刷新

5.3.2.RX_Highest_Status

        在出现离散收包的情况时,标记当前哪个sn之前的包还没有发送ack/nack,在t-Reassembly超时时,需要将其更新为当前已发送ack/nack包的下一包(如下图步骤4)

5.3.3.RX_Next_Status_Trigger

        在出现离散收包的情况时,标记当前的最高位sn,类似RX_Next_Highest在t-Reassembly启动时的打点。

6.AM传输模式下的RLC包头会包含哪些信息

  • D/C:标记当前RLC PDU是数据包还是Status PDU(log中一般看不到)
  • P:Polling bit,要求对端反馈Status PDU
  • SI:分片标记,标记当前PDU发送的是一个完成的SDU,或者是一个SDU的开始分片、结尾分片或者中间分片(1=首位 2=末位 3=中间)
  • R:Reserve bit
  • SN: SN号。当SN采用18bit时,需要Reserve bit填充。 (RLC序列号)
  • SO: SDU分片的在原始SDU中的开始type偏移量(日常log不咋看)

7. AM传输模式下的轮询机制[Polling]

Polling: AM发送实体主动触发对端AM实体发送Status report的方法,通过在AMD PDU中将P bit置位达成。

  • 携带poll的3种可能(5.3.3.2&4描述)

            ①上层配置,连续pollPDU个/pollBYTE(均由RRC配置下来)个PDU没有放置过poll
            ②数据已发完,当前传输和重传buffer都空
            ③定时器t_PollRetransmit超时(5.3.3.4)

注:这里多做一点解释。前两点的目的在于,发送了一定份额数据,以及数据量不大的时候,即使插入poll位。

第三点实际是用来保底的,表示从这包到达RLC到收到status report的容忍时间。如果超时还收不到status report,要对这个包放poll位并重启timer。

其中poll位的stop时间:当收到放poll那个sn的status report,不论是ack还是nack,都stop timer并reset timer。

8.RLC相关timer总结

  • t-PollRetransmit(7.3)

        用于发送端。携带poll位后重启t-PollRetransmit

  • t-Reassembly

        用于接收端。当接收端收RLC包没有收完整时启动(如收到了3和5,4持续没有收到),超时时若中间丢包还没有收到,则请求发送端重传

  • t-StatusProhibit

       用于接收端。为了控制status report的数量和洪泛,status report在启动期间只能收1次

9.附录

实际网络配置的相关变量

rlc-Config am : 
  {
    ul-AM-RLC 
    {
      sn-FieldLength size18,
      t-PollRetransmit ms60,
      pollPDU p32,
      pollByte kB25,
      maxRetxThreshold t32
    },
    dl-AM-RLC 
    {
      sn-FieldLength size18,
      t-Reassembly ms40,
      t-StatusProhibit ms60
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值