ARQ, Status PDUs & Polling in 5G NR
Acknowledged-Mode retransmission: polling, STATUS PDUs, ACK/NACK and windows.
In Acknowledged Mode, RLC makes a promise the layers below it cannot: every byte will arrive, in order, exactly once. It keeps that promise the old-fashioned way — the transmitter holds a copy of everything it sends, the receiver periodically reports what it did and did not get, and anything missing is sent again. That report-and-retransmit loop is ARQ (Automatic Repeat reQuest), and TS 38.322 specifies it down to the bit. This page walks the whole loop: how the transmitter asks for feedback, how the receiver answers, how the two ends bound "in flight" with sliding windows, and why this slow, careful mechanism sits on top of the fast HARQ retries at MAC rather than replacing them.
Introduction
ARQ is the retransmission engine that runs inside Acknowledged Mode (AM) RLC (TS 38.322). It sits between PDCP above and MAC below, and its single job is to guarantee that the stream handed up to PDCP is complete, in order, and duplicate-free — no matter what the radio channel did to individual transport blocks.
It matters because the fast retransmission layer beneath it, HARQ, is not perfect: its one-bit feedback can be misread and its retransmission count is capped, so it occasionally leaves a residual hole. AM RLC's ARQ closes exactly those holes using explicit sequence numbers and byte-precise acknowledgement, which is why the bearers that cannot tolerate loss — signalling radio bearers (SRB) and reliable data bearers — always run in AM.
Because ARQ is a request/response loop, a stalled or lossy AM bearer almost always breaks at one identifiable place: the poll that solicits feedback, the STATUS PDU that carries it, or the retransmission that acts on it. Reading those three in order is how you localise an AM problem.
On this page
Why ARQ is needed
In plain words: think of a registered letter with a return receipt. The sender keeps a photocopy of every page and won't shred it until the recipient signs and returns a slip saying exactly which pages arrived. If page 11 is missing from the slip, the sender re-posts just page 11 — not the whole bundle. ARQ is that receipt-and-resend discipline, applied to RLC data units.
Concretely, three things must hold for a reliable bearer. The transmitter must keep a copy of everything unacknowledged so it can resend on demand. The receiver must be able to report precisely what it has and has not received. And the transmitter must be able to resend exactly the missing bytes and free everything confirmed. ARQ provides all three, on top of HARQ, which handles the common case but leaves rare residual losses.
AM RLC adds a reliability layer above the HARQ retransmissions at MAC. HARQ fixes fast, per-transmission channel errors; RLC ARQ recovers the residual losses HARQ misses, so that PDCP above always sees a complete, gap-free stream regardless of what the radio did.
HARQ can and does fail — corrupted feedback, a NACK misread as an ACK, or the maximum number of HARQ transmissions exhausted. Each such failure leaves a hole. Without an AM layer those holes would surface at PDCP as lost packets. ARQ closes them using sequence numbers and explicit acknowledgement.
The transmitter sends AMD PDUs each carrying a sequence number (SN); it sets a poll bit (P) when it wants feedback; the receiver answers with a STATUS PDU carrying an ACK_SN and any NACK_SNs; the transmitter retransmits precisely what was NACKed, re-segmenting it to fit the grant if needed.
What ARQ in AM RLC Does
Acknowledged Mode (AM) is one of three RLC modes — the other two, Transparent Mode (TM) and Unacknowledged Mode (UM), never retransmit. AM is the only mode that runs ARQ, which is precisely why it carries the traffic that cannot tolerate loss: signalling radio bearers (SRB) and reliable data bearers such as TCP-based flows. The single AM RLC entity is bidirectional: it contains a transmitting side that generates AMD PDUs and a receiving side that reassembles them and issues status reports, and each side runs against its peer's opposite side.
The value of ARQ is that it is selective and byte-precise. A modern AM entity does not retransmit blindly on a timer the way early ARQ protocols did; it retransmits only the specific PDUs — or even the specific byte ranges within a PDU — that the receiver explicitly reports as missing. Everything the receiver confirms is discarded from the retransmission buffer, freeing memory and letting the transmit window slide forward. The rest of this page is really about the two messages that make that precision possible: the poll and the STATUS PDU.
Rule of thumb: HARQ is the fast local retry at MAC (round-trip on the order of milliseconds); RLC ARQ is the slower, bearer-wide safety net that only wakes up when HARQ has already given up. See RLC Overview for how TM, UM, and AM compare.
Polling — Asking for a Status Report
A receiver does not report continuously; that would burn uplink on feedback nobody asked for. Instead the transmitter solicits a report exactly when it needs one, by setting the poll bit — the P field in the header of an AMD PDU — to 1. When the receiving side sees P=1, it is obliged to construct and return a STATUS PDU. Polling is the transmitter saying, in effect, "tell me how far you have got, so I know what to free and what to resend."
The transmitter decides when to poll using two counters, a state variable, and a timer, all governed by parameters that RRC sets in RLC-Config:
| Trigger / control | Meaning |
|---|---|
pollPDU | Poll once this many AMD PDUs (new data, not counting retransmissions) have been sent since the last poll — a count-based trigger. Tracked by the counter PDU_WITHOUT_POLL. |
pollByte | Poll once this many bytes of data have been sent since the last poll — a volume-based trigger. Tracked by the counter BYTE_WITHOUT_POLL. |
POLL_SN | State variable holding the SN of the highest AMD PDU submitted to lower layers at the moment the poll was set. The transmitter uses it to recognise when a returning STATUS PDU has "covered" the poll. |
t-PollRetransmit | Timer started whenever a poll is sent. If no STATUS PDU covering POLL_SN arrives before it expires, the transmitter polls again — typically by retransmitting the PDU with SN = POLL_SN (or the highest-SN PDU) with P=1. |
Beyond the two counters, the specification requires a poll in two structural situations. First, when the transmitter has just submitted the last AMD PDU in its transmission buffer — there is no more data coming, so it needs feedback now to make progress rather than idling. Second, when the transmit window has stalled — the window is full and no new SN can be sent until acknowledgements arrive. In both cases the transmitter cannot advance without a fresh report, so it forces one. When a poll is set, the transmitter resets PDU_WITHOUT_POLL and BYTE_WITHOUT_POLL to zero, records POLL_SN, and (re)starts t-PollRetransmit.
Why a poll-retransmit timer at all: the poll bit can be lost with its PDU, and the resulting STATUS PDU can be lost on the way back. t-PollRetransmit guarantees the transmitter never waits forever — on expiry it re-polls, so a single dropped report cannot deadlock the bearer. See RLC Timers & Windows for the timer interactions.
✅ Debugging steps
- Confirm the transmitter is actually setting
P=1at the expected cadence — check the configuredpollPDU/pollByteagainst the observed poll interval in the trace. - Verify
POLL_SNis recorded andt-PollRetransmitstarts each time a poll is sent. - Check that a returning
STATUS PDUwithACK_SN>POLL_SNstopst-PollRetransmit; if it keeps expiring, feedback is not getting back. - Look for the structural polls: last PDU in buffer, and window-stall polls when the TX window is full.
⚠ Common causes of failure
pollPDU/pollByteset so high the transmitter rarely polls, so buffer freeing and window advance stall.- Poll bit lost with its PDU and
t-PollRetransmitmisconfigured (too long), so recovery of a lost poll is slow. - Window stalls but no forced poll is issued (implementation bug), deadlocking the bearer.
- Repeated re-polls because the
STATUS PDUpath is broken (see the receiver side).
The STATUS PDU — ACK_SN, NACK_SN, and Segment Offsets
The receiver's reply is a STATUS PDU (a control PDU, distinct from the AMD PDUs that carry data). Its job is to be compact yet exact: state the point up to which everything is present, then enumerate the gaps below that point. Four field types do all of this.
| Field | What it conveys |
|---|---|
ACK_SN | The SN of the next AMD PDU not yet received and not reported as a NACK in this report. It is the cumulative upper boundary: every SN below ACK_SN that is not explicitly NACKed is confirmed fully received. |
NACK_SN | The SN of an AMD PDU the receiver is missing. Each NACK_SN punches one hole in the otherwise-acknowledged run below ACK_SN. There can be many in one report. |
SOstart / SOend | Segment Offsets attached to a NACK_SN when only part of that PDU is missing. They mark the first and last byte of the missing range within that PDU, so the transmitter resends only those bytes rather than the whole PDU. This is the segment-level (partial) NACK. |
NACK range | A count attached to a NACK_SN flagging a run of consecutive whole missing PDUs (that SN and the NACK range−1 that follow it). A burst of losses becomes one NACK entry instead of one per SN, keeping the report short. |
Each NACK_SN carries flag bits in the header that say which optional parts follow it: an E1-style indicator for whether another NACK follows, an indicator for whether SOstart/SOend are present, and an indicator for whether a NACK range is present. A NACK range and a segment offset can even combine to express "a run of whole PDUs is missing, and additionally a partial slice of the PDU at the end of the run." So a rich STATUS PDU reads like: "I have everything below ACK_SN=20, except I am missing NACK_SN=11 entirely, I am missing the three consecutive PDUs starting at NACK_SN=14 (NACK range=3), and I am missing bytes SOstart..SOend of NACK_SN=18." That single message tells the transmitter exactly what to resend and exactly what to free.
The receiver does not fire a STATUS PDU for every poll unconditionally — it is rate-limited by t-StatusProhibit. When the receiver sends a status report it starts this timer; while it runs, no further status report may be transmitted, even if additional polls arrive. Only when t-StatusProhibit expires can a fresh (and by then more complete) report go out. This prevents a flurry of polls from provoking a storm of near-identical reports that would clog the uplink and add nothing.
Key insight: ACK_SN is cumulative (it acknowledges one contiguous run), while each NACK_SN is selective (it carves a specific hole out of that run). Everything below ACK_SN and not NACKed is safe to delete from the retransmission buffer forever.
Reading a STATUS PDU in the logs
Representative RLC log — illustrative, values vary by vendor/build:
| Field | Meaning | Example | Check |
|---|---|---|---|
ACK_SN | Cumulative boundary; everything below it (not NACKed) is confirmed. | 13 | Should climb over time; a stuck ACK_SN means the window is not advancing. |
NACK_SN | An SN the receiver is missing. | 11 | Must correspond to a PDU still in the TX retransmission buffer; if it was already freed, something desynced. |
SOstart/SOend | Byte range missing within a partial NACK. | 40..79 | Confirm the transmitter resends only that range as an AMD PDU segment, not the whole PDU. |
POLL_SN | Highest SN outstanding when the poll was set. | 12 | ACK_SN > POLL_SN is what stops t-PollRetransmit. |
t-StatusProhibit | Started when a STATUS is sent; blocks further reports until expiry. | START | If set large, expect coalesced/late NACKs; a spurious storm of STATUS means it is too small or disabled. |
✅ Debugging steps
- Check the receiver builds a
STATUS PDUin response toP=1(subject tot-StatusProhibit). - Verify
ACK_SNand eachNACK_SNagainst the transmitter's buffer — NACKed SNs must still be held for retransmission. - For partial NACKs, confirm
SOstart/SOendbound a valid byte range inside the named PDU. - Watch
t-StatusProhibit: an over-large value can delay a needed NACK and shift recovery ontot-PollRetransmit.
⚠ Common causes of failure
STATUS PDUlost on the uplink, so the transmitter re-polls and recovery is delayed.t-StatusProhibittoo large, suppressing timely NACKs and stalling recovery.- NACK for an
SNthe transmitter already freed — a window/state desync between the two ends. - Malformed segment offsets (
SOstart>SOend) causing the transmitter to resend the wrong bytes.
Retransmission and Re-segmentation
On receiving a STATUS PDU, the transmitting side processes it against its buffer. First it acts on the positive part: every SN below ACK_SN that is not NACKed is now delivered, so those PDUs are removed from the retransmission buffer and TX_Next_Ack advances past them. Then it acts on each NACK.
For a whole missing PDU, the transmitter re-queues that entire AMD PDU for transmission. For a partial NACK carrying SOstart/SOend, it resends only that byte range as an AMD PDU segment; the segment's header carries a Segmentation Offset (SO) field giving the byte position of the segment within the original RLC SDU, so the receiver can slot the bytes back into exactly the right place during reassembly. This byte-level precision is what makes AM efficient: a 30-byte hole punched in the middle of a large PDU costs a ~30-byte resend, not a full-PDU resend.
Crucially, a PDU or segment queued for retransmission can be re-segmented again at transmission time. If the grant the MAC layer hands RLC is smaller than the data waiting to be resent, RLC splits the retransmission into smaller AMD PDU segments, each with its own SO, and sends as much as fits now. The remainder waits for the next grant. The original SN is preserved across all these fragments — segmentation changes byte boundaries, never the sequence number — so the receiver reassembles them all under one SN.
Every time a PDU is retransmitted for a NACKed SN, the transmitter increments a per-PDU counter, RETX_COUNT, and compares it against maxRetxThreshold. If a PDU keeps getting NACKed until RETX_COUNT reaches that ceiling, RLC concludes the radio link is broken beyond ARQ's ability to fix it and indicates the failure to RRC, which typically triggers re-establishment. This ceiling is what keeps a dead link from retransmitting forever; the threshold itself is covered in RLC Timers & Windows.
Spec note: re-segmentation is a property of the transmit operation, not of ARQ signalling. The receiver never asks for a particular segment size — it only says which bytes it lacks (via SOstart/SOend); how the transmitter chops the resend to fit successive grants is entirely a local, grant-driven decision.
✅ Debugging steps
- Confirm the transmitter frees all confirmed SNs and advances
TX_Next_Ackbefore acting on NACKs. - Check that whole NACKs re-queue the full
AMD PDUand partial NACKs resend only theSOstart..SOendrange as anAMD PDU segment. - Verify the original
SNis preserved across re-segmentation and each fragment carries a correctSO. - Track
RETX_COUNTper PDU againstmaxRetxThreshold; approaching it signals an unrecoverable link.
⚠ Common causes of failure
- Same
SNNACKed repeatedly — a persistently bad link drivingRETX_COUNTtomaxRetxThresholdand RLF/re-establishment. - Grants too small, forcing endless re-segmentation and slowing recovery.
- Wrong
SOon a retransmitted segment, so the receiver mis-places the bytes and reassembly fails. - Retransmitting a whole PDU when only a byte range was NACKed, wasting the air interface.
AM State Variables
Both sides of an AM entity keep a small set of SN-valued state variables. They are the moving parts behind everything above: the poll logic reads POLL_SN, the buffer-freeing reads TX_Next_Ack, and the receiver builds its STATUS PDU from RX_Highest_Status. All are counted modulo the SN space and interpreted relative to the appropriate window edge.
| Variable | Side | Meaning |
|---|---|---|
TX_Next | Transmit | The SN to assign to the next newly generated AMD PDU (fresh data, not a retransmission). Advances by one each time a new PDU is built. |
TX_Next_Ack | Transmit | The SN of the oldest AMD PDU still awaiting acknowledgement — the lower edge of the transmit window. Advances as ACK_SN in received status reports climbs. |
POLL_SN | Transmit | The highest SN submitted to lower layers when the last poll was set; used to detect when an incoming STATUS PDU has covered that poll so t-PollRetransmit can be stopped. |
RX_Next | Receive | The SN of the next in-sequence AMD PDU expected — the lower edge of the receive window. Everything below it is fully received and reassembled. |
RX_Next_Highest | Receive | The SN one above the highest SN of any AMD PDU received so far — the upper reach of what the receiver has seen (received PDUs may have gaps below it). |
RX_Highest_Status | Receive | The highest SN that may be reported as ACK_SN in a STATUS PDU — i.e. the boundary up to which the receiver can cumulatively acknowledge. It drives status-report construction. |
Two more receive-side counters are worth naming even though the full timer story lives elsewhere: RX_Next_Status_Trigger records the SN that started the reassembly timer t-Reassembly, and it is the expiry of that timer (a detected gap that never filled from HARQ) that ultimately triggers a NACK in the next status report. On the transmit side, PDU_WITHOUT_POLL, BYTE_WITHOUT_POLL, and the per-PDU RETX_COUNT round out the bookkeeping already described.
Transmit and Receive Windows
Sequence numbers are finite — the SN field is either 12 bits or 18 bits — so they wrap around. To keep an "old" PDU and a "new" PDU that happen to share the same SN value unambiguous, each side runs a sliding window that bounds which SNs may legitimately be in flight at once.
On the transmitter, the window spans from TX_Next_Ack (its lower edge, the oldest unacknowledged SN) upward. The transmitter may not assign an SN that would fall outside this window; if the receiver stops acknowledging, the window fills and the transmitter stalls — exactly the condition, mentioned earlier, that forces a poll to shake loose a fresh report. On the receiver, a matching window from RX_Next upward bounds which SNs it will accept and reassemble; anything falling outside it is discarded as stale or a duplicate.
SN, 131072 for an 18‑bit SNThe window is exactly half the total SN space. That is the whole trick: with the window capped at 2(SN−1), the set of "valid new" SNs and the set of "possible old wrap-around" SNs can never overlap, so the receiver can always tell a freshly wrapped SN from a lingering old one and never mistakes a new PDU for a stale duplicate. The precise arithmetic that positions each window edge relative to RX_Next and TX_Next_Ack is detailed alongside the timers in RLC Timers & Windows.
ARQ in Action — Message Sequence
The chart below shows one full turn of the AM loop between the transmitting and receiving RLC entities: a run of data PDUs (one of them lost to a HARQ residual error), a later PDU that carries the poll, the STATUS PDU that acknowledges up to a point and NACKs the gap, and the targeted retransmission that closes it.
How ARQ Complements HARQ
It is tempting to ask why 5G bothers with two retransmission layers. The answer is that they operate at different timescales and against different failure modes, and each is bad at the other's job.
HARQ lives in MAC/PHY: a fast stop-and-wait-per-process retry with soft-combining, correcting most block errors within a millisecond or two using ACK/NACK on the physical control channels.
HARQ is fast but not perfect: its 1-bit feedback can itself be misread (a NACK flipped to an ACK ends the retries prematurely), and it has a hard cap on transmissions. When it gives up, a block is simply lost.
RLC ARQ catches exactly those rare residual losses. It is slower (a full status-report round trip) but reliable, because its feedback carries explicit SNs and byte offsets rather than one ambiguous bit.
So the division of labour is: HARQ handles the common case — the overwhelming majority of channel errors, cleaned up locally and quickly so latency stays low. RLC ARQ handles the rare residual case — the few blocks HARQ fails to recover, which without ARQ would become permanent holes at PDCP. Because HARQ has already scrubbed out almost all errors, ARQ retransmissions are infrequent, which is what lets AM afford the luxury of precise, selective, byte-level resends without flooding the air interface. The two layers are complementary, not redundant: remove HARQ and ARQ would be far too slow to keep the error rate down; remove ARQ and HARQ's residual failures would break reliable bearers.
LTE ↔ NR: the AM ARQ machinery is largely carried over from LTE, but NR modernises it. LTE RLC AM used a fixed 10-bit SN; NR AM uses a configurable sn-FieldLength of 12 or 18 bits for far larger windows at high throughput / long RTT. NR also drops LTE's separate re-segmentation PDU format — in NR any AMD PDU can be segmented or re-segmented on the fly with a single SO-based header — and NR moved the in-order delivery guarantee for reordering into PDCP, leaving RLC to focus on per-bearer reliability.
One line: HARQ is the fast first line of defence at MAC that fixes almost everything; RLC ARQ is the exact, slower backstop that fixes the handful of errors HARQ lets through. Reliable bearers need both.
Summary
AM RLC's ARQ is a request/response reliability loop: the transmitter polls (sets P=1 per pollPDU/pollByte, on the last PDU, or on a window stall), the receiver answers with a STATUS PDU (cumulative ACK_SN plus selective NACK_SN, with SOstart/SOend and NACK range for precision), and the transmitter retransmits exactly what was NACKed, re-segmenting to fit each grant while preserving the SN. Two timers pace it — t-PollRetransmit guarantees feedback is chased, t-StatusProhibit stops feedback flooding — and maxRetxThreshold bounds retransmission before declaring failure to RRC.
To debug an AM bearer, walk the loop: is the transmitter polling? is the STATUS PDU coming back and advancing ACK_SN? are NACKs turning into correctly-scoped retransmissions? The first link that breaks localises the fault — a silent poll, a suppressed status, or a runaway RETX_COUNT.
Q&A
Q. What is the difference between the poll bit and the STATUS PDU?
A. The poll bit (P) is set by the transmitter in an AMD PDU header to request feedback. The STATUS PDU is the receiver's reply, carrying an ACK_SN and any NACK_SNs. Poll is the question; status is the answer.
Q. What triggers the transmitter to set a poll, and what does t-PollRetransmit guard against?
A. Reaching pollPDU PDUs or pollByte bytes since the last poll, having sent the last PDU in the buffer, or a window stall. When it polls it records POLL_SN and starts t-PollRetransmit; if no status covering POLL_SN arrives before expiry, the poll or the report was lost, so it re-polls.
Q. How does the receiver report a partial loss versus a run of losses?
A. A partial (segment-level) loss uses a NACK_SN plus SOstart/SOend marking the missing byte range within one PDU. A run of consecutive whole-PDU losses uses a single NACK_SN with a NACK range count instead of one entry per SN.
Q. What stops the receiver from sending a report to every poll?
A. t-StatusProhibit. After sending a STATUS PDU the receiver starts this timer and withholds any further report until it expires, coalescing bursts of polls into one up-to-date report and protecting the uplink.
Q. Why is AM_Window_Size exactly half the SN space?
A. Because the SN wraps, a window of 2(SN−1) keeps every in-flight SN unambiguous — the "valid new" and "possible old" ranges can never overlap, so the receiver never confuses a freshly wrapped SN with a stale duplicate.
Q. If HARQ already retransmits, why is RLC ARQ needed?
A. HARQ is fast but its feedback can be misread and its retransmission count is capped, so it occasionally leaves a residual loss. RLC ARQ uses explicit SN-based feedback to recover exactly those rare holes, keeping the stream delivered to PDCP complete and in order.
Quick LTE 4G / 5G NR Interview Questions
Q. What happens if an RLC AM PDU is lost and never NACKed because the corresponding STATUS report is also lost?
A. The receiver's t-Reassembly / t-StatusProhibit and the transmitter's poll mechanisms provide redundancy โ the transmitter proactively polls for status periodically (not just relying on receiver-triggered NACKs), so a lost STATUS report just delays detection until the next poll response, rather than losing the gap permanently.
Where this fits
ARQ is the reliability engine of AM RLC; the timers and windows that pace it, the mode comparison around it, and the layer it feeds are the natural next steps.