已经一年多没有写笔记,这期间固然工作很忙,自己在下班时间又想要运动一下以遵循“文武之道一张一弛”,但这也只是为自己的惰性找借口罢了。正如某个名人说的:死很容易,但活着难!写笔记也一样,放弃非常容易,但是坚持写(特别是在业余时间里)就非常难。
想到这里,就决心重新开始写。
然而在大概半个月前开始写这篇笔记后,却也一度想放弃,并非外部干扰/诱惑,而是学习过程遇到障碍:发现协议里有些看起来很简单的描述就是理解不了,查找提案和网络上的资料也找不到相应的范例。这个时候特别沮丧,把已经完成60%的草稿都删了,打算不写了。但是想想人生大部分事情不都要经历王国维关于做学问的三种境界吗?如果总在进入第一种境界时就放弃,那任何事情都做不成了。于是继续搜寻,终于在一个很老的LTE资料找到启示。
当然并不是说搜寻就有一定能找到答案,有些疑问在短时间可能就是没法找到答案,这个时候,可先暂时将其放在一边,继续前行,或许某天突然就领悟了,因为再回首时,你已经不是当时的自己了:可能你的配套知识更多了,也可能之前短路的部分突然打通了...


Overview

在RLC首篇曾提到RLC协议有很多令人剪不断理还乱的状态变量(State Variables), 这些变量主要用在RLC PDU收发相关的流程 - 发送/接收/ARQ等等, 同时跟这些状态变量及流程紧密相连的还有计数器(Counters)、常量(Constants)、定时器(Timers)、可配置参数(Configurable Parameters).

另外对RLC PDU结构本身的操作- 则涉及到RLC Header的各个字段(Field),深入理解这些字段,才能进一步理解后面针对RLC PDU/SDU的各种操作,比如,组装RLC PDU(生成RLC Header)、对RLC SDU进行分段或RLC SDU Segment进行重分段然后组装新的RLC PDU(生成新的RLC Header)、解析MAC层发送的RLC PDU进一步重组RLC SDU(解析RLC header). 并且这些字段跟RLC PDU收发流程也密切相关,比如用Polling字段来触发对端发送Status Report.

这篇主要是了解这些状态变量/计数器/常量/定时器/可配置参数/字段的基本含义,要真正深入理解他们,还得结合他们在RLC收发相关流程各种场景中的应用,这个将会贯穿在后续相关的篇幅中。

因AM情形最复杂,本篇将基于AM 讲解,特殊情况也会涉及另外的mode.


RLC PDU字段

AM RLC PDU分为Data PDU和Control PDU两种,由于Control PDU与ARQ紧密相连,将置于后面的ARQ单独篇章讲解,本篇主要基于AMD(AM Data) PDU,特殊情况也会提及UMD PDU.

各个字段的含义
既然RLC是对data的操作,那首先得理解一个词 – Data Field Element.
先看其定义:
    An RLC SDU or an RLC SDU segment that is mapped to the Data field.
字面意思是映射到Data Field的一个RLC SDU或RLC SDU分段。
那Data Field又是什么呢?
RLC PDU由两部分组成,一部分是RLC Header,另一部分就是Data Field了,也就是下图AMD PDU结构中的Data区域。一个RLC PDU可包含一个RLC SDU或一个SDU Segment.

现在挨个看看Header里的各个字段。

D/C: Data/Control, 指示这个PDU是Data PDU还是Control PDU.

P: Polling的缩写,就是字面意思‘查询/探询’,那么查询的是什么东西呢?查询的是已发送的那些RLC SDU(或SDU的一部分)的接收状态。既然有查询就得有反馈(Acknowledgement), 因此其只适用于RLC三种模式之一的AM(Acknowledged Mode)。发送端通过在AMD PDU中将Polling bit置为1来请求对端发送Status Report(由Control PDU承载),收到Status Report后,发送窗口才有可能往前移动,否则可能造成发送窗口阻塞从而影响系统吞吐量。由于polling跟PDU发送/ARQ/Status Report紧密相连,更多细节(比如polling触发条件、对应定时器t-PollRetransmit何时开启/停止及停止/超时后的action)将穿插在后面专门的AMD PDU发送、ARQ/Status Report的篇章讲解。

SI: Segmentation Info. 占两个bit,指示某个RLC PDU包含的是一个完整的RLC SDU还是某个RLC SDU的第一个分段、中间分段还是最后一个分段(上篇曾对这四种情形对应的字段值及详细含义做了说明)。

R: Reserved, 预留域,默认设为0,接收端会忽视该字段。

SN: 该PDU对应的RLC SDU的序列号,按字段长度分为12 bit和18 bit两类(UMD PDU是6 bit和12 bit),上图是18 bit情形。注意:对于AM,每个RLC SDU对应单一序列号,不管其是否分段。而对于UM,如果分段了,每个分段的SDU有一个单独的序列号。

SO: Segment Offset. 用于指示RLC SDU Segment在原始RLC SDU中的具体位置,也就是Data Field中的RLC SDU Segment的第一个byte在原始RLC SDU的位置。原始RLC SDU的第一个字节的起始位置设为"0000000000000000"。仅当RLC SDU Segment不是RLC SDU的第一个分段时才需要携带该字段(通过上面的SI字段我们可以知道是否第一个分段)。


状态变量/计数器/定时器/可配置参数/常量

1.发送端
1)三个状态变量
在RLC首篇曾提到NR的状态变量的名字比LTE更具启发性,也就是光从名字就能大致理解其含义,RLC实体在收发过程中会一直维护这些状态变量的值。

TX_Next_Ack – Acknowledgement state variable
对应下一个将按序(in-sequence)收到肯定确认(positive acknowledgement)的RLC SDU的SN,也就是说,该变量之前的RLC SDU都已经有明确状态了。
该值作为发送窗口的下边界(TX_Next_Ack <= SN < TX_Next_Ack + AM_Window_Size).
其初始值为0,每当SN=TX_Next_Ack的RLC SDU收到ACK时,更新该值。比如,发送端已经发送了SN=1, 2, 3, 4的SDU给对端,如果只收到了SN=2的正面确认,那么TX_Next_Ack就设为3而不是5.

TX_Next– Send state variable
对应下一个新生成的AMD PDU的SN,比如上面例子里,TX_Next就是5.
其初始值为0,在AM RLC实体构建SN=TX_Next的AMD PDU并且该PDU包含一个完整的RLC SDU或某个RLC SDU的最后一个分段时,更新该值。还是以TX_Next_Ack里的例子里的情形为例:

POLL_SN– Poll send state variable
该变量保存了设置POLL_SN时提交给下层的AMD PDU中最高的SN值,其初始值设置为0.
早期协议版本(V15.1.0及之前)将该值设置为TX_Next - 1, 但这样可能存在一个问题,就是如果TX_Next - 1的PDU如果还在buffer没有往下层发送,那么接收端反馈的Status Report就不会包含POLL_SN的PDU的ACK,这样的话,即便所有已发送的RLC SDU都收到肯定确认,t-PollRetransmit也不会停止,只能等待超时,而超时后,发送端又会试图去重发一个根本还没发送过的包SN=TX_Next-1,而此时该包又可能落在发送窗口外,这个时候就没法发出去从而导致系统紊乱。

2)三个计数器
RETX_COUNT
累计RLC SDU或RLC SDU segment的重传次数。
每个RLC SDU对应一个计数器,细节看ARQ篇章。

PDU_WITHOUT_POLL
初始化为0,从最新一次将poll bit置为1的AMD PDU开始累计发送过的AMD PDU的数量。
这个值累积到一个阈值(也就是后面的configurable parameter - pollPDU)时,就会触发将PDU poll bit置为1.

BYTE_WITHOUT_POLL
初始化为0,从最新一次将poll bit置为1的AMD PDU开始累计发送过的AMD PDU的Byte数量。
这个值累积到一个阈值(也是后面的configurable parameter - pollByte)时,就会触发将PDU poll bit置为1.
该计数器与PDU_WITHOUT_POLL任意一个达到阈值时都会触发poll bit设为1,属于“或”的关系。

3) 三个可配置参数(对应上面三个计数器)
maxRetxThreshold
用于每个AM RLC实体的发送端限制其对应的RLC SDU(包括其分段)的最大重传次数。

pollPDU
用于发送端每个AM RLC实体每隔pollPDU个PDU触发polling.

pollByte
用于发送端每个AM RLC实体每隔pollByte个字节触发polling.

2) 一个定时器
t-PollRetransmit
用于发送端RLC AM实体重传polling PDU.

2.接收端
2) 四个状态变量
RX_Next – Receive state variable
该变量保存的是最后一个完全按需接受的RLC SDU的的下一个SN值, 用作接收窗口的下边界(RX_Next<= SN < RX_Next + AM_Window_Size). 
其初始值为0,当接收到SN=RX_Next的RLC SDU时更新该值,具体例子见RX_Next_Status_Trigger的图。

RX_Next_Status_Trigger – t-Reassembly state variable
该变量保存的是触发t-Reassembly的RLC SDU的下一个SN的值。
比方说,收到了SN=1,然后收到了SN=3,说明SN=2没有收到,那么收到SN=3这个事件会触发t-Reassembly,这个时候变量设为 SN = 3 + 1.

RX_Highest_Status – Maximum STATUS transmit state variable
该变量保存的是:当需要生成一个STATUS PDU时,ACK_SN字段可以设置的最高值,其初始值为0. 也就是,此时该ACK_SN之前的所有PDU状态都已确定了:要么已收到, 要么认为丢失(那么仍在t-Reassembly控制下的那些AMD PDU自然不在此列,因为它们状态还未确定,仍然处于等待状态)。

RX_Next_Highest – Highest received state variable
保存已接收到的RLC SDU中SN最大值的下一个SN的值,其初始值为0.

2) 两个定时器
t-Reassembly
先顾名思义,Assembly是组装、装配的意思,那Re-assembly就是重新组装,具体到这里是什么意思呢?是指发送端将RLC SDU变成1到多(对应SDU Segment)个RLC PDU,接收端收到所有RLC PDU之后,去掉RLC PDU头部,将其Reassembly成RLC SDU.
该定时器用于AM RLC实体的接收部分或UM的RLC接收实体去侦测下层的RLC PDU的丢失。定时器触发的一个具体例子就是上面RX_Next_Status_Trigger部分提到的那个,更多触发场景会在AM RLC接收流程的篇章里讲。如果t-Reassembly正在运行,那么它不能被额外启动,也就是,一个RLC实体一次只运行一个定时器。

t-StatusProhibit
用于AM RLC实体的发送端在定时器运行期间禁止发送STATUS PDU,可避免STATUS report频繁发送,更多细节会在ARQ/Status Report专门章节讨论。

3. 常量

AM_Window_Size
用于AM RLC实体的发送端和接收端。当SN长度为12 bit时,AM_Window_Size = 2048 ,当SN长度为18 bit时,AM_Window_Size = 131072.

UM_Window_Size
用于UM RLC接收实体决定那些不需要推进接收窗口就能被接收的UMD SDU的SN. 当SN长度为6 bit时,AM_Window_Size = 32 ,当SN长度为12 bit时,AM_Window_Size = 2048.


笔者在公众号“协议工程师笔记”定期首发NR/LTE/IMS...学习笔记, 敬请关注、订阅和分享,谢谢!

一起努力,蒸蒸日上

5G NR - RLC协议阅读笔记 - 字段/状态变量/计数器/定时器/可配置参数相关推荐

  1. 5G NR - RLC协议阅读笔记 - 从LTE到NR的变化

    在讨论NR RLC相对于LTE做出的重大变化的How和Why之前,我们先来看下What. 通过对比LTE和NR协议,我们注意到UM和AM的处理流程图有三个重大改动,协议其余部分的区别都是围绕这几个改动 ...

  2. 5G - NR RLC协议阅读笔记4 - 三个重要定时器的理解

    笔者在公众号"协议工程师笔记"定期发布5G/LTE/IMS...学习笔记, 敬请关注.订阅和分享,谢谢! 一起努力,蒸蒸日上

  3. 5G NR PDCP协议(一)

    5G NR协议栈其他博文参考: https://blog.csdn.net/qq_41245381/article/details/105805643 5G NR PDCP协议(二)参考: https ...

  4. 5G NR PDCP协议(二)

    5G NR协议栈其他博文参考: https://blog.csdn.net/qq_41245381/article/details/105805643 5G NR PDCP协议(一)参考: https ...

  5. 5G NR RLC:RLC架构和RLC entity

    其他相关内容 RLC data transfer procedure RLC PDU and Parameters 1 RLC架构 1.1 RLC架构 RLC的所有功能由RLC entity来实现.R ...

  6. 5G NR RLC层

    RLC(Radio Link Control)层位于PDCP层(或RRC层)和MAC层之间.它通过RLC通道(RLC channel)与PDCP层(或RRC层)进行通信,并通过逻辑信道与MAC层进行通 ...

  7. 5G NR RLC:Data Transfer ARQ

    其他相关内容 RLC PDU and Parameters RLC架构和RLC entity 一 RLC entity handling RLC entity有建立.重建和释放的过程(establis ...

  8. 5G NR RRC协议总体介绍

    1. 开机入网流程 UE入网过程包括几个子过程: 小区搜索与选择 UE开机选网,小区搜索并完成下行同步. 系统消息广播 UE读取广播信息,选择合适小区进行驻留. 随机接入 UE与gNB建立上行同步. ...

  9. nvme协议阅读笔记

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 nvme官网 NVMe ...

  10. VITA 49.0协议阅读笔记

    Vita Radio Transport (VRT) standard 定义了一个在射频收发机和信号处理装置之间的具有广泛应用的一个的传输层协议 ,用于提升射频和信号处理单元之间的协同性,其应用包括频 ...

最新文章

  1. 提取Jar2Exe源代码,JavaAgent监控法
  2. objectdatasource中delete的尴尬。
  3. AutoML自定义搜索网络类(如何在一个大的网络中搜索一个网络)
  4. 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
  5. angularjs与后台传值接收值
  6. 如何读论文?-如何写好科技论文之我见(八)
  7. java商品新增怎麽弄_添加新商品时如何初始化计数器 - java
  8. Spring事务那些事儿
  9. mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...
  10. 连接数据库的三种配置方式
  11. 数论基础——扩展欧几里德算法解析
  12. 数据集按指定比例划分为训练集、验证集和测试集
  13. 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝
  14. Codeforces Round #521 (Div. 3) B. Disturbed People
  15. 【selenium-python】显式等待和隐式等待的使用和区别
  16. 用计算机弹小猪佩奇,【绘本时间】小猪佩奇之弹弹球
  17. 一条校招/社招潜规则~
  18. 洛谷P5238 整数校验器【三月月赛】
  19. arista 交换机镜像端口配置(将某一端口的数据转发到指定端口)
  20. CVPR 2022 | 微软提出MiniViT:极致压缩视觉Transformer

热门文章

  1. 1101 Oh, my God!【错排】
  2. 兼阅万浅谈:什么是穷人思维
  3. 2020-3-21模拟赛题解
  4. 可以无线充电的充电宝推荐,充电宝推荐评测
  5. 打破校史!这所高校,首登Nature!
  6. 【unity小技巧】常用的方法属性和技巧汇总(长期更新)
  7. js验证各种文本框输入内容格式
  8. 趣拿社交电商,品牌营销新奇点
  9. 2022年Mysql5卸载及mysql8.0.26安装教程
  10. 分享103个PHP源码,总有一款适合您