ARQ, Status PDUs & Polling in LTE 4G
Acknowledged-Mode retransmission: polling, STATUS PDUs, ACK/NACK and the transmit/receive windows.
HARQ at the MAC layer is fast but not perfect — it gives up after a few attempts and can leave gaps or reorder blocks. RLC Acknowledged Mode (AM) is the slower, more thorough safety net stacked on top: it uses ARQ to work out exactly which bytes went missing and resend only those, so a bearer that needs reliability — SRBs, TCP flows — actually gets it. This page is grounded in TS 36.322.
Introduction
RLC ARQ is the outer retransmission loop of the LTE user and control plane, defined in TS 36.322. It runs inside the RLC layer whenever a radio bearer is configured in Acknowledged Mode (AM) — the mode used for anything that cannot tolerate loss or reordering: signalling on SRB1/SRB2, and reliable data flows such as TCP.
It sits between PDCP above and MAC/HARQ below. HARQ cleans up the great majority of air-interface errors within a few milliseconds; RLC ARQ mops up the residual few that HARQ could not fix and restores strict in-order delivery to PDCP. The whole machine is a closed feedback loop: the transmitter sends numbered PDUs and periodically polls for a status report; the receiver replies with a STATUS PDU naming exactly what did and did not arrive; the transmitter resends only the missing byte ranges.
Because ARQ is entirely bookkeeping — sequence numbers, byte offsets, windows and a handful of timers — a stall or a torn-down bearer almost always traces to one specific counter or timer: a poll that was never answered, a window that stalled, a retransmission budget that ran out. Reading the state variables in order is what turns "the bearer dropped" into a precise root cause.
On this page
Why RLC ARQ is needed — Acknowledged Mode and ARQ
In plain words: think of sending a numbered stack of pages by an unreliable courier. The courier (HARQ) re-tries a dropped page a couple of times, but sometimes still loses one, and pages can arrive out of order. So the recipient keeps a checklist: "I have pages 1–5 and 7, but page 6 is missing." They send that checklist back (the STATUS PDU), and you re-send only page 6 — not the whole stack. RLC ARQ is that checklist-and-resend discipline, and it only bothers you occasionally, because the courier handles most of the drops itself.
RLC has three modes — Transparent (TM), Unacknowledged (UM) and Acknowledged (AM). Only AM gives you reliable, in-order, loss-free delivery, and it does so through ARQ (Automatic Repeat reQuest): the receiver tells the transmitter what it did and did not get, and the transmitter resends whatever was lost. Bearers that carry signalling or anything intolerant of loss run in AM; latency-sensitive but loss-tolerant flows like VoLTE media typically run in UM, which has reordering but no retransmission.
A closed feedback loop inside RLC AM. The transmitter sends AMD PDUs carrying a 10-bit Sequence Number (SN); the receiver periodically returns a STATUS PDU that acknowledges or negatively-acknowledges ranges of SNs, and the transmitter retransmits the negatively-acknowledged pieces.
MAC HARQ is fast but bounded — it stops after maxHARQ-Tx attempts and can still deliver a residual error or reorder blocks across parallel HARQ processes. RLC ARQ is the outer loop that mops up those residual failures and restores ordered delivery to PDCP.
The transmitter does not send status after every PDU. Instead it polls: it sets the P (poll) bit on a chosen PDU to ask "please tell me what you have", and the receiver answers with a STATUS PDU. That keeps feedback cheap while still catching losses promptly.
The unit RLC AM operates on is the AMD PDU (Acknowledged Mode Data PDU). Its fixed header carries the D/C field (data vs control), a re-segmentation flag RF, the poll bit P, a framing-info field FI, an extension bit E, and the SN. When a PDU has been re-segmented for retransmission it becomes an AMD PDU segment, whose header additionally carries a last-segment flag LSF and a Segment Offset SO naming the byte position of this piece inside the original SN. The whole ARQ machine is built around two ideas: sequence numbers to name PDUs, and segment offsets to name byte ranges within a PDU.
Two retransmission layers: HARQ (MAC) is the fast inner loop measured in a few milliseconds; ARQ (RLC AM) is the slower outer loop that only acts on what HARQ failed to deliver. They are complementary, not redundant — HARQ handles the many, ARQ handles the few.
ARQ traffic is not scheduled on its own channel: AMD PDUs and STATUS PDUs are handed to MAC and ride the ordinary transport blocks — downlink on PDSCH (scheduled by DCI format 1/1A/2 on PDCCH, CRC scrambled by the UE's C-RNTI, in the UE-specific search space) and uplink on PUSCH (granted by DCI format 0 / C-RNTI). RLC sees only SNs and byte offsets; the physical addressing is entirely MAC/PHY's job.
Polling — asking for a status report
The receiver does not volunteer status constantly; that would waste uplink. Instead the transmitter requests feedback by setting the P field to 1 in the header of an AMD PDU. When the receiver sees P=1, it is obliged to send back a STATUS PDU — subject only to its own t-StatusProhibit timer, which rate-limits how often it may reply.
A poll is triggered by any of several conditions, so the transmitter learns about losses without polling on every PDU. TS 36.322 defines two counters that the transmitter maintains and compares against RRC-configured thresholds:
PDU_WITHOUT_POLLvspollPDU: the transmitter countsAMD PDUs sent since the last poll inPDU_WITHOUT_POLL; when it reaches the configuredpollPDUvalue, it setsP=1 and resets the counter.BYTE_WITHOUT_POLLvspollByte: in parallel it counts data bytes sent inBYTE_WITHOUT_POLL; when that reachespollByte, it polls and resets. Two counters means either "enough packets" or "enough volume" can trigger feedback, whichever comes first.- Window / last-PDU rule: if there is no new data or retransmission left to send once this PDU goes out (the buffer empties), or the transmit window is stalled and cannot advance, the transmitter must poll — otherwise it would sit idle forever waiting on feedback it never asked for.
When it sets the poll bit, the transmitter records POLL_SN — the SN of the highest-numbered AMD PDU it has submitted to lower layers at that moment — and (re)starts the t-PollRetransmit timer. POLL_SN is the "watermark" the pending poll is asking about: the poll is considered answered once a STATUS PDU arrives whose ACK_SN has moved past POLL_SN, or which explicitly reports POLL_SN.
If t-PollRetransmit expires before that happens, the transmitter assumes the poll (or its answer) was lost and polls again — either by transmitting the PDU with SN = VT(S)−1, or by transmitting a not-yet-acknowledged PDU, with P=1. This guards against a single lost poll deadlocking the whole loop.
Poll bit vs poll trigger: pollPDU, pollByte and the window/last-PDU rule decide when to poll; the P bit is how the poll is carried in the header; POLL_SN records what the poll is asking about; and t-PollRetransmit is the safety net if the answer never comes.
✅ Debugging steps — polling
- Confirm the transmitter is actually setting
P=1 at the expected cadence — checkPDU_WITHOUT_POLL/pollPDUandBYTE_WITHOUT_POLL/pollBytein the trace. - Verify
POLL_SNis recorded when the poll is set and that a returningSTATUS PDU'sACK_SNmoves past it. - Watch
t-PollRetransmit: repeated expiries mean polls or status reports are being lost, or the receiver is silenced byt-StatusProhibit. - On an empty buffer or stalled window, confirm the mandatory last-PDU/window poll actually fires — otherwise the entity can hang waiting for feedback it never asked for.
⚠ Common causes of failure — polling
pollPDU/pollByteset too high, so losses are detected slowly and latency spikes.- Poll or
STATUS PDUlost over the air; recovery only ont-PollRetransmitexpiry (re-poll). t-StatusProhibiton the receiver too long, delaying the answer pastt-PollRetransmitand causing redundant re-polls.- Missing last-PDU/window-stall poll, so a drained-buffer or stalled window never solicits the feedback that would unblock it.
The STATUS PDU — ACK_SN, NACK_SN and Segment Offsets
The receiver's reply is a STATUS PDU, a control PDU distinguished from data by its D/C field = 0 and a CPT (Control PDU Type) field = 000. It compactly describes exactly what has and has not arrived using two kinds of sequence number and a chain of extension bits.
ACK_SN: theSNof the next not-yet-received PDU that is not being reported as missing — in effect, "I have everything below this SN, except the NACKs I am about to list." There is exactly oneACK_SNperSTATUS PDUand it sits at the front.NACK_SN: theSNof a PDU belowACK_SNthat is missing. ASTATUS PDUcan carry manyNACK_SNfields, one per gap.
The fields are strung together by two extension bits. E1 follows the ACK_SN (and follows each NACK block): E1=1 means "another NACK_SN block follows", E1=0 means "the list ends here". E2 follows a NACK_SN and signals whether that NACK carries a segment-offset pair: E2=1 means "an SOstart/SOend pair follows for this SN". This lets a status report be as short as one ACK_SN, or grow to cover many gaps and partial gaps, without any wasted bits.
The segment offsets handle partial NACKs. When a lost PDU had already been re-segmented on a previous transmission, the receiver may be missing only part of an SN. In that case the NACK_SN is followed (via E2=1) by SOstart and SOend: byte offsets that mark the exact range within that SN that must be resent. SOstart is the first missing byte and SOend the last; a special SOend value of all-ones means "to the end of the PDU". This avoids resending a whole large PDU when only a slice is missing.
| Field | Width / where | Meaning |
|---|---|---|
D/C | 1 bit, first | 0 = control PDU (a STATUS PDU is control); 1 = data (AMD PDU). |
CPT | 3 bits | Control PDU Type; 000 identifies a STATUS PDU. |
ACK_SN | 10 bits | Everything below this SN is received except the listed NACKs; the cumulative acknowledgement point. |
E1 | 1 bit | 1 = a NACK_SN block follows; 0 = end of the status list. |
NACK_SN | 10 bits | SN (below ACK_SN) reported missing. Repeats, one per gap. |
E2 | 1 bit | 1 = an SOstart/SOend pair follows this NACK_SN (a partial NACK). |
SOstart | 15 bits | Offset of the first missing byte within the NACKed SN. |
SOend | 15 bits | Offset of the last missing byte; all-ones = to the end of the PDU. |
The STATUS PDU is itself rate-limited on the receive side by t-StatusProhibit. When the receiver sends a status report it starts this timer, and while it runs the receiver will not send another status report even if it is polled again. This stops a burst of polls (or a burst of losses) from triggering a flood of status reports that would themselves congest the uplink.
Mental model: read ACK_SN as a high-water mark — "everything under here is accounted for" — and each NACK_SN (optionally with an SOstart/SOend range) as a labelled hole punched below that mark that still needs filling. E1/E2 are just the glue that chains those holes together.
✅ Debugging steps — STATUS PDU
- Decode the
STATUS PDU: confirmD/C=0 andCPT=000, then readACK_SNand everyNACK_SN. - Cross-check
ACK_SNagainst the transmitter'sPOLL_SN— ifACK_SNis not pastPOLL_SN, the poll is still outstanding. - For each partial NACK (
E2=1), verify theSOstart/SOendrange matches a previously re-segmented PDU. - Check the
t-StatusProhibittimer on the receiver — frequent polls with no reply may simply be the prohibit timer holding status back.
⚠ Common causes of failure — STATUS PDU
- Malformed extension-bit chain (
E1/E2) so the report is mis-parsed and NACKs are missed. t-StatusProhibittoo long, so status is delayed and the transmitter re-polls needlessly.- Persistent NACKs for the same SN indicating repeated loss — a coverage/interference problem HARQ cannot clear.
- Segment offsets that do not line up with the original PDU boundaries, so the wrong byte range is requested.
State variables and the AM windows
ARQ is bookkeeping, and the bookkeeping lives in a handful of state variables per RLC entity — three on the transmit side, three on the receive side. They define two sliding windows that bound which SNs may be sent and which may be accepted. Because the AM SN is 10 bits, the SN space is 0…1023 and the AM window size is 512 (half the SN space, so wrap-around is unambiguous); this is the constant AM_Window_Size.
| Variable | Side | Meaning |
|---|---|---|
| VT(A) | TX | Acknowledgement state. The SN of the oldest PDU still awaiting acknowledgement — the lower edge of the transmit window. Advances as ACK_SN confirms PDUs. |
| VT(S) | TX | Send state. The SN to assign to the next brand-new AMD PDU. Incremented each time a new PDU is handed down. |
| VT(MS) | TX | Maximum send state. VT(A) + AM_Window_Size — the upper edge of the transmit window. New PDUs may only be sent while VT(S) stays below VT(MS). |
| VR(R) | RX | Receive state. The SN of the earliest PDU still not fully received — the lower edge of the receive window and the basis of ACK_SN. |
| VR(MR) | RX | Maximum acceptable receive state. VR(R) + AM_Window_Size — the upper edge; PDUs with SN at or above VR(MR) are discarded as outside the window. |
| VR(H) | RX | Highest received state. One above the highest SN received so far; used to spot gaps and to drive the reordering timer t-Reordering. |
The transmit window is the span [VT(A), VT(MS)). The transmitter may generate new PDUs only while VT(S) is inside it; if STATUS PDUs stop arriving and VT(A) cannot advance, VT(S) eventually bumps into VT(MS) and the window stalls — which is precisely why the last-PDU/window poll rule exists, to shake feedback loose before the entity locks up. The receive window [VR(R), VR(MR)) does the mirror job: PDUs inside it are buffered and reassembled in SN order, PDUs at or above VR(MR) are dropped, and VR(R) only advances once the PDU it points at is completely received. VR(H) tracks the leading edge so the receiver knows a gap exists even before it reports one.
Windows in one line: VT(A)…VT(MS) is what the transmitter is allowed to have outstanding; VR(R)…VR(MR) is what the receiver is willing to accept. Both are 512 SNs wide, and both slide forward as delivery is confirmed.
✅ Debugging steps — windows & state variables
- Track VT(A) and VT(S): if VT(S)−VT(A) approaches 512, the transmit window is close to stalling.
- Confirm VT(A) advances each time a
STATUS PDUacknowledges older SNs; a stuck VT(A) means acknowledgements are not arriving. - On the receive side, check VR(R) is advancing and VR(H) is not running far ahead of it (a persistent gap).
- Watch
t-Reordering: its expiry is what lets the receiver declare a lost PDU and report it — a mis-set value delays or falsely triggers NACKs.
⚠ Common causes of failure — windows
- Transmit window stall: status stops arriving, VT(A) freezes, VT(S) hits VT(MS), and no new PDUs can be sent until a forced poll unblocks it.
- PDUs arriving at/above VR(MR) are silently discarded as out-of-window, looking like extra loss.
t-Reorderingtoo long, so genuine gaps are reported late and delivery to PDCP is delayed.- SN wrap-around mishandled if the window logic is buggy, corrupting the ordered stream.
Retransmission and re-segmentation
When the transmitter receives a STATUS PDU it processes it against its state. Every SN in the range [VT(A), ACK_SN) that is not listed as a NACK_SN is now confirmed delivered: it is discarded from the retransmission buffer, and VT(A) (and hence VT(MS)) slides forward to free the transmit window. Every NACK_SN is queued for retransmission and given priority over new data.
Retransmission is not always a byte-for-byte copy. If the MAC grant available for the retransmission is smaller than the original PDU, RLC re-segments it: the AMD PDU is split into AMD PDU segments, the header RF flag is set to mark them as segments, and each carries its own Segment Offset SO so the receiver can slot the piece back into the correct byte position of the original SN. A partial NACK carrying SOstart/SOend tells the transmitter exactly which byte range to rebuild, so re-segmentation and partial NACK are two halves of the same byte-range mechanism.
A per-PDU counter RETX_COUNT is incremented when a PDU (or the segment containing the NACKed byte range) is retransmitted. If RETX_COUNT reaches the RRC-configured maxRetxThreshold, RLC declares an unrecoverable error and indicates it to upper layers — which for an SRB typically triggers RRC re-establishment for that radio link. This bounds how long ARQ will keep trying before it admits defeat, so a dead link is torn down rather than retried forever.
Grant shrinks → re-segment. ARQ retransmissions are re-sized to fit whatever grant the scheduler hands out on the retransmission opportunity. The Segment Offset fields are what make byte-accurate retransmission — and therefore partial NACKs — possible.
✅ Debugging steps — retransmission
- Confirm each
NACK_SNis actually being retransmitted and prioritised ahead of new data. - When a grant is smaller than the original PDU, verify re-segmentation occurs (
RF=1, correctSO) rather than a stalled retransmission. - Track
RETX_COUNTper PDU againstmaxRetxThreshold— a PDU nearing the threshold predicts an imminent unrecoverable-error / re-establishment. - Confirm VT(A) advances after acknowledged SNs are discarded from the retransmission buffer.
⚠ Common causes of failure — retransmission
RETX_COUNTreachesmaxRetxThreshold— RLC signals unrecoverable error; for anSRBthis triggers RRC re-establishment (a dropped/reset link).- Repeated re-segmentation from chronically small grants, inflating overhead and slowing the drain.
- Retransmission buffer not freed because acknowledgements never arrive, eventually stalling the window.
- Wrong Segment Offset on a re-segmented PDU, so the receiver cannot reassemble the original SN.
A poll / status / retransmit exchange
Putting it together: the eNB, acting as the RLC transmitter for a downlink AM bearer, sends a run of AMD PDUs and polls on the last one; one PDU is lost over the air; the UE reports the gap; the eNB retransmits just that PDU, re-segmenting it if the new grant is smaller.
P=1 and records POLL_SN; the UE's STATUS PDU acknowledges up to SN 8 but flags SN 6 as a NACK_SN; the eNB retransmits SN 6, re-segmenting it if the new grant is smaller, and slides VT(A) forward.Notice the eNB only resends SN 6 — SN 5 and SN 7 were confirmed by ACK_SN=8. That selectivity is the whole point of ARQ: retransmit the gaps, not the stream. And because ACK_SN=8 is above POLL_SN=7, the pending poll is satisfied and t-PollRetransmit can be stopped rather than firing a redundant re-poll.
Reading the ARQ loop in the logs
An RLC AM trace shows the poll being set with its POLL_SN, the returning STATUS PDU's ACK_SN/NACK_SN, the retransmission (with any re-segmentation), and the window sliding as VT(A) advances. Reading these in sequence tells you whether a stall is a lost poll, a lost status, or an exhausted retransmission budget.
Representative RLC AM log (QXDM/QCAT-style) — illustrative, values vary by vendor/build:
| Field | Meaning | Example (from log) | Debugging check |
|---|---|---|---|
P / POLL_SN | Poll bit set and the SN watermark it asks about. | P=1 / 7 | A returning ACK_SN must move past POLL_SN to satisfy the poll. |
ACK_SN | Cumulative ack point — all below received except listed NACKs. | 8 | If it does not advance, acknowledgements are not reaching the transmitter. |
NACK_SN / E2 | Missing SN, and whether a partial (byte-range) NACK follows. | 6 / E2=0 | Repeated NACKs for one SN = persistent air loss HARQ cannot clear. |
RETX_COUNT | Retransmissions of this PDU vs maxRetxThreshold. | 1/4 | Approaching the threshold predicts an unrecoverable error / re-establishment. |
RF / SO | Re-segmentation flag and Segment Offset on a retransmission. | 1 / 0 | Present only when the retx grant is smaller than the original PDU. |
| VT(A) slide | Transmit-window lower edge advancing on ack. | 5 -> 8 | A stuck VT(A) signals a stalling window; correlate with lost status. |
Summary
RLC AM ARQ is the outer, byte-accurate retransmission loop that turns a lossy, reordering radio link into reliable, in-order delivery. Walk it in the order it runs: the transmitter numbers PDUs (SN) and polls (sets P=1, records POLL_SN, starts t-PollRetransmit) when pollPDU/pollByte or the last-PDU/window rule fires; the receiver replies with a STATUS PDU (ACK_SN plus any NACK_SN, with SOstart/SOend for partial gaps, chained by E1/E2); the transmitter retransmits only the NACKed ranges, re-segmenting to fit the grant, and slides VT(A) forward.
When a bearer stalls or resets, the fault is almost always one specific piece of bookkeeping: an unanswered poll (t-PollRetransmit expiring), a stalled transmit window (VT(S) hitting VT(MS) because VT(A) is frozen), a silenced receiver (t-StatusProhibit), or an exhausted retry budget (RETX_COUNT reaching maxRetxThreshold → unrecoverable error → re-establishment). Identifying which one narrows a vague "call dropped" into a precise, testable cause.
Best used trace-in-hand: line up poll → status → retransmit → window-slide, and the first step that does not complete is your root cause.
Interplay with HARQ, and quick Q&A
RLC ARQ never works alone; it sits directly on top of MAC HARQ, and the two are deliberately tuned for different jobs. HARQ is the fast loop: each transport block is protected by a stop-and-wait process with soft combining, so a corrupted block is re-sent and combined within a few milliseconds, and the vast majority of air-interface errors are cleaned up there before RLC ever notices. But HARQ is bounded — it stops after maxHARQ-Tx attempts, and because several HARQ processes run in parallel a late success can deliver blocks out of order. Those two failure modes — a residual undecoded block, and reordering — are exactly what RLC ARQ is designed to catch.
So the division of labour is: HARQ handles the many fast errors; RLC ARQ handles the residual few. HARQ feedback (ACK/NACK on PUCCH) is per transport block and lives in the MAC; RLC feedback (the STATUS PDU) is per SN range and lives in RLC. Because HARQ already suppresses most errors, RLC polls sparingly and status reports stay small — a well-tuned link spends almost all its retransmission budget in the fast HARQ loop and only occasionally invokes the slower, byte-accurate ARQ loop. This layering is why LTE can offer both low latency and near-lossless delivery on the same bearer.
LTE ↔ NR: the AM ARQ core — polling, STATUS PDU with ACK_SN/NACK_SN, re-segmentation, maxRetxThreshold — carries over to NR (TS 38.322), but with key changes. NR RLC does not do concatenation and, crucially, no longer guarantees in-order delivery — reordering moves up to PDCP, so NR RLC AM just retransmits and hands PDUs up as they complete. NR uses a configurable SN field length (12 or 18 bits, versus LTE's fixed 10), giving a much larger window. NR also replaces the byte-offset re-segmentation with a Segmentation Offset (SO) plus a segmentation-info (SI) field, and its STATUS PDU can NACK a range of SNs (NACK range) in one field rather than listing each gap.
Q. What is the difference between HARQ and RLC ARQ?
A. HARQ is a fast MAC-layer retransmission with soft combining, bounded by maxHARQ-Tx attempts. RLC ARQ (in AM) is the slower outer loop: it uses STATUS PDU feedback to retransmit PDUs HARQ failed to deliver and to restore in-order delivery. HARQ handles most errors quickly; ARQ catches the residual ones and any reordering.
Q. What triggers a poll, what does POLL_SN record, and what protects against a lost poll?
A. A poll (setting the P bit) is triggered by pollPDU (via PDU_WITHOUT_POLL), pollByte (via BYTE_WITHOUT_POLL), or the last-PDU/window-stall rule. When it polls, the transmitter records POLL_SN = the highest SN sent, and starts t-PollRetransmit. If that timer expires before a STATUS PDU covering POLL_SN arrives, it re-polls.
Q. What do E1 and E2 do in a STATUS PDU?
A. E1 chains the list: E1=1 after the ACK_SN or a NACK block means another NACK_SN follows; E1=0 ends it. E2 follows a NACK_SN: E2=1 means an SOstart/SOend pair follows, i.e. this is a partial NACK for a byte range rather than a whole SN.
Q. When are SOstart and SOend used?
A. For a partial NACK — when only part of an SN is missing, typically because that PDU was re-segmented on a previous retransmission. SOstart/SOend mark the exact byte range within the NACK_SN that must be resent, so the transmitter rebuilds just that slice.
Q. Why is the AM window 512, and what happens when it stalls?
A. The AM SN is 10 bits (0…1023), so the window is half the space, 512, keeping wrap-around unambiguous. The transmit window is [VT(A), VT(MS)) with VT(MS)=VT(A)+512. If status stops arriving, VT(A) cannot advance, VT(S) hits VT(MS), and the entity stalls — which is why the transmitter polls on the last PDU or a stalled window to force feedback.
Q. What bounds how long ARQ keeps retransmitting?
A. The RETX_COUNT counter per PDU. When it reaches maxRetxThreshold, RLC declares an unrecoverable error to upper layers, which for an SRB generally triggers RRC re-establishment rather than retrying indefinitely.
Where ARQ connects
Polling, status and retransmission all lean on the timers and windows that pace them, sit inside the wider set of RLC modes, and stack on top of the HARQ loop below.