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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)