RLC协议简单理解2-RLC窗口的维护

RLC协议简单理解2-RLC窗口的维护,第1张

RLC协议简单理解2-RLC窗口的维护

RLC窗口的维护

 RLC窗口是指的RLC协议层在处理数据时,需要维护的一个最大的处理数据范围。在此范围之外的数据,处理模块不需要理会。窗口的维护依赖于一系列变量,来确定这个窗口有多大,窗口的边界怎么确定?窗口边界值如何变化,也就是窗口的滑动。

发送变量及发送窗口

发送窗口的维护,非常依赖于接收端的ACK,通过ACK来推动发送窗口的移动。

TX_Next_Ack

该状态变量指示的是等待ACK的first AMD PDU的SN。该变量的初始值为0;当接收到SN等于TX_Next_Ack的AMD PDU的ACK指示时更新;此变量为传输窗口的下边界,也就是小于此变量的数据全部已经回复ACK。

AM_Window_Size

AM窗口的大小,取决于RLC SN号所占的bit数和对数据传输快慢及系统实现的综合考虑。当使用12位SN时AM_Window_Size = 2048,当使用18位SN时AM_Window_Size = 131072。此大小是协议确定。

TX_NEXT

该状态变量指示的是分配给下一个新产生的包含RLC SDU报文的SN。该变量的初始值为0。在此变量之前的报文都曾经发送且进行过编号,只是不一定成功送达。当包含分片场景时,当AMD PDU包含RLC SDU的最后一个segment时更新TX_Next=TX_Next+1。因为同一个报文的不同分片,其SN号是一致的。

如下场景为例:上层来包2和3被打包成报文2,而6号报文则被分片为两个分片发送。2号之前的报文都已经接收到ACK,所以发送窗口的下边界是3,窗口长度是5,所以窗口的上边界是8。大于等于8的报文在窗口之外,无法进行发送。6号及之前的报文都进行了发送,则下一个需要发送的报文TX_NEXT是7。

接收变量及接收窗口

接收窗口的维护与发送窗口不同,因为接收端要负责ACK的答复,所以引入t-reassembly定时器,用于主动触发ACK的答复。如果报文一直顺序接收,原则上可以不答复状态报告,发送端一直发,接收端一直收不会出现问题。所以状态报告的触发的是基于乱序接收而设计的。

 RX_Next

该变量指向已经正确收到的SN+1,即接收端期望收到的下一个最小的SN。此变量之前的报文,接收端都已经全部成功接收。

RX_Next_Highest

该变量指向所有已经收到的RLC SDU中的最大SN+1。

 RX_Next_Status_Trigger

该状态变量保持在触发t重组的RLC SDU的SN之后的SN的值。当发现乱序出现时,启动定时器,要求在定时器时间内收到之前的报文,否则应该通知发送端,报文丢失了。如果定时器超时前,此报文之前的数据全部收到,则停止定时器。此为重组定时器的意义。

RX_Highest_Status

该状态变量保持SN的最高可能值,当需要构造STATUS PDU时,该值可由“ACK_SN”指示。 它最初设置为0。当重组定时器触发,设置RX_Highest_Status为触发重组定时器的SN,也就RX_Next_Status_Trigger。用于标识重组定时器超时,哪些报文需要填写状态报告,同时用于判断是否有新的报文丢失出现。

上图为例:RX_Next = 4;RX_Next_Highest = 9;如果接到到一个超过此范围的报文将丢弃,如果接收到一个重复的报文也将丢弃

第一步:1/2/3号报文已经成功接收且成功答复。RX_Next = 4;RX_Highest_Status = 4;RX_Next_Highest = 4;无乱序不需要启动重组定时器。

第二步:当接收到5号报文时,发现4号报文未收到,此时RX_Next = 4不变;RX_Next_Highest = 6更新;发现RX_Next_Highest > RX_Next + 1, 启动重组定时器RX_Next_Status_Trigger = 6; 希望重组定时器超时前6号之前的报文都能收到。并更新RX_Highest_Status = 6。下次状态报告触发填写[RX_Next, RX_Highest_Status)的报文接收情况。

第三步:重组定时器超时,还未收到4号报文,触发状态报告,告知发送端5号报文收到,4号报文丢失。同时因为依然RX_Next_Highest > RX_Next + 1,重启重组定时器。

第四步:收到7号报文,发现6号报文未收到。此时RX_Next = 4依然不变;RX_Next_Highest = 8更新;发现RX_Next_Highest > RX_Highest_Status + 1, 说明又有新的报文未收到。因为重组定时器还在启动中,再次无法重启重组定时器。

第五步:重组定时器超时前,接收到6号报文。但是4号报文依然没有收到。 RX_Next无法更新,导致RX_Next_Status_Trigger > RX_Next, 也就是依然有可能丢失的报文未收到,定时器无法停止。如果定时器超时,则触发状态报告,继续报告4号报文丢失,5/6/7号报文收到。设置RX_Next_Status_Trigger = 8; 希望重组定时器超时前8号之前的报文都能收到。RX_Highest_Status = 8也同步更新。下次状态报告触发填写[RX_Next, RX_Highest_Status)的报文接收情况。

第六步:如果重组定时器再次超时前,收到4号报文,则定时器停止。更新RX_Next = 8;RX_Highest_Status = 8;RX_Next_Highest = 8;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5155644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存