写在最前
笔者实际工作中,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
}