ARQ procedures僅在AM mode下實(shí)施。
Retransmission
AM RLC實(shí)體的發(fā)送端,可以通過其對等實(shí)體的STATUS PDU,接收到某個(gè)SDU或段的nack消息。
當(dāng)接收到這樣的消息時(shí),RLC 實(shí)體應(yīng):
- 若SN在 [TX_Next_Ack , 發(fā)送到下層的PDU中SN最高的值] 范圍內(nèi),則考慮將此SDU或段重傳。
ACK_SN指示的SDU不需要被重傳。
當(dāng)一個(gè)SDU或段被考慮重傳時(shí),RLC實(shí)體的發(fā)送端應(yīng):
- 若此SDU或段是第一次被重傳,則將其RETX_COUNT設(shè)為0
- 否則,RETX_COUNT+1
- 若RETX_COUNT = maxRetxThreshold,通知上層重傳次數(shù)已達(dá)上限
當(dāng)重傳一個(gè)SDU或段時(shí),RLC實(shí)體的發(fā)送端應(yīng):
- 若需要,將SDU或段進(jìn)行分段
- 生成符合下層在傳輸機(jī)會中關(guān)于total size規(guī)定的新PDU
- 發(fā)送PDU到下層
當(dāng)生成新PDU時(shí),RLC實(shí)體應(yīng):
- 只將原始SDU或段映射到新PDU中的data field
- 根據(jù)AMD PDU的格式規(guī)定,修改新PDU的header
- 根據(jù)輪詢的規(guī)定,設(shè)置P字段
Polling
當(dāng)RLC實(shí)體需要請求對等實(shí)體的STATUS reporting時(shí),就需要用到輪詢機(jī)制。
Transmission of a AMD PDU
若將要傳到下層的PDU包含未被傳過的SDU或段,RLC實(shí)體的傳輸端應(yīng):
- PDU_WITHOUT_POLL+1
- BYTE_WITHOUT_POLL增加PDU的data field中新byte數(shù)
- 若PDU_WITHOUT_POLL>=pollPDU;或
- 若BYTE_WITHOUT_POLL>=pollByte,則
- 在此PDU中加入輪詢
當(dāng)收到下層的傳輸機(jī)會時(shí),對于每一個(gè)已經(jīng)發(fā)送的PDU,RLC實(shí)體應(yīng):
- 若發(fā)送PDU后,transmission buffer和retransmission buffer都變?yōu)榭?除了已發(fā)送,但還在等待確認(rèn)的SDU或段);或
- 若發(fā)送PDU后,由于各種原因(如窗口堵塞),沒有新的SDU可被發(fā)送,則
- 在此PDU中加入輪詢。
要在PDU中加入輪詢,RLC的發(fā)送端應(yīng):
- 將PDU中的P字段設(shè)為1
- 將PDU_WITHOUT_POLL設(shè)為0
- 將BYTE_WITHOUT_POLL設(shè)為0
當(dāng)發(fā)送一個(gè)帶有輪詢的PDU到下層時(shí),RLC實(shí)體應(yīng):
- 將POLL_SN設(shè)為已發(fā)送的PDU中SN最大的值。
- 若t-PollRetransmit未運(yùn)行,將其啟動;否則將其重啟。
Reception of a STATUS report
當(dāng)收到對等實(shí)體的接收端傳來的STATUS report時(shí),RLC實(shí)體的發(fā)送端應(yīng):
- 若STATUS report包含的是SN=POLL_SN的SDU的ack/nack消息,則
- 若t-PollRetransmit正在運(yùn)行,stop and reset it
Expiry of t-PollRetransmit
當(dāng)t-PollRetransmit超時(shí)時(shí),RLC實(shí)體的發(fā)送端應(yīng):
- 若transmission buffer和retransmission buffer都為空(不包括已發(fā)送,但還在等待確認(rèn)的SDU或段);或
- 由于各種原因(如窗口堵塞),沒有新的SDU可被發(fā)送,則
- 考慮將已發(fā)送的SDU中SN值最大的那個(gè)重傳。
- 考慮將每一個(gè)未被ack的SDU重傳
此二者執(zhí)行哪個(gè)貌似并沒有硬性規(guī)定,都可以。執(zhí)行1比較簡單,執(zhí)行2比較可靠。
- 在PDU中加入輪詢
Status reporting
RLC實(shí)體發(fā)送STATUS PDU給其對等實(shí)體,是為了通知SDU或段的ack/nack情況。
觸發(fā)STATUS reporting的條件包括:
- 來自對等實(shí)體的輪詢
- 當(dāng)SN=x且p字段=1的PDU從下層被接收時(shí),RLC實(shí)體的接收端應(yīng)該:
- 若根據(jù)判斷,該P(yáng)DU應(yīng)該被丟棄;或
- 若x<RX_Highest_Status 或 x>=RX_Next+AM_Window_Size,則
- 觸發(fā)STATUS report
- 否則,等待,直到滿足x<RX_Highest_Status 或 x>=RX_Next+AM_Window_Size,再觸發(fā)STATUS report
該機(jī)制保證了RLC status report在HARQ reordering之后再發(fā)送
- 當(dāng)SN=x且p字段=1的PDU從下層被接收時(shí),RLC實(shí)體的接收端應(yīng)該:
- 發(fā)現(xiàn)PDU接收失敗
- RLC實(shí)體的接收端應(yīng)該在t-Reassemly超時(shí)后再觸發(fā)STATUS report
t-Reassembly超時(shí)會導(dǎo)致RX_Highest_Status更新和STATUS report的觸發(fā),但是后者應(yīng)該在前者之后發(fā)生。
當(dāng)觸發(fā)了STATUS report時(shí),RLC實(shí)體的接收端應(yīng)該:
- 若t-StatusProhibit未運(yùn)行,則在下層通知的第一個(gè)傳輸機(jī)會中,構(gòu)建STATUS report,將其傳到下層。
- 否則,即使t-StatusProhibit運(yùn)行期內(nèi)STATUS report已經(jīng)觸發(fā)了多次,也到等到t-StatusProhibit超時(shí)后的第一個(gè)傳輸機(jī)會時(shí),再構(gòu)造STATUS report,并傳出。
當(dāng)一個(gè)STATUS PDU被傳輸?shù)较聦訒r(shí),RLC實(shí)體應(yīng)該:啟動t-StatusProhibit
在構(gòu)建STATUS PDU的過程中,RLC實(shí)體應(yīng):
- 對于那些SN值在 [RX_Next , RX_Highest_Status)范圍內(nèi),且未被完整接收的SDU,它們的SN都放到STATUS PDU中,結(jié)果STATUS PDU的大小仍滿足下層關(guān)于PDU的總大小的規(guī)定的:
- 對于一個(gè)byte都沒有收到的SDU,在 STATUS PDU中包含NACK_SN,其值設(shè)為此SDU的SN值
- 對于部分被接收到,但還有一連續(xù)字節(jié)段沒被接收到的SDU,在STATUS PDU中包含一個(gè)NACK_SN,SOstart,SOend的集合。
- 對于還未被接收到的一段連續(xù)的SDU序列:
- 在STAUS PDU中包含一個(gè)NACK_SN和NACK range的集合
- 如果需要的話,在STATUS PDU中包含一對SOstart和SOend。
- 將ACK_SN的值設(shè)為:未被確認(rèn)收到,但未在STATUS PDU中標(biāo)為丟失(也就是沒有在NACK_SN中被標(biāo)出過)的下一個(gè)SDU的SN值。
比如現(xiàn)在有SN為1~100這一百個(gè)SDU需要狀態(tài)報(bào)告的反饋,即RX_Next=1,RX_Highest_Status=100.
如果在構(gòu)建STATUS PDU過程中,將1~100之間沒成功接收的SDU的SN都放到STATUS PDU的NACK_SN字段中,結(jié)果填到SN為70的時(shí)候,STATUS PDU大小已經(jīng)達(dá)到了下層規(guī)定的上限,那么STATUS PDU的ACK_SN的值就填70.
剩下的71~100中未被成功接收的SDU的SN值如果在下個(gè)STATUS PDU中能被全部放進(jìn)去,那么下一個(gè)STATUS PDU的ACK_SN值就為這些未成功接收的SDU中最大的SN值。