Three RLC modes
| Mode | Segmentation | ARQ | In-order delivery | Used for |
|---|---|---|---|---|
| TM | No | No | No | SRB0 (RACH), BCCH, PCCH — no overhead |
| UM | Yes | No | Yes (with gaps) | VoNR, streaming — low latency |
| AM | Yes | Yes | Yes (guaranteed) | SRB1/2, DRBs — reliable data ← our case |
RLC-AM — our SRB1 bearer
SRB1 uses RLC Acknowledged Mode. AM provides:
Segmentation and reassembly: If an RLC SDU (from PDCP) is larger than what fits in the current MAC grant, RLC splits it across multiple transport blocks. At the receiver, RLC reassembles the segments before passing to PDCP.
ARQ retransmission: Unlike HARQ (which operates on the transport block in milliseconds), RLC ARQ operates on the RLC PDU level. The receiver sends STATUS PDUs reporting which RLC PDUs were received and which are missing. The transmitter retransmits only the missing segments. RLC ARQ runs on a longer timescale (~hundreds of ms) and catches residual errors that HARQ missed.
RLC-AM PDU header
// RLC AM Data PDU (12-bit SN): D/C = 1 ← Data PDU (not Control PDU) P = 0 ← Poll bit (1 = request STATUS report) SI = 00 ← Segmentation Info: 00=full, 01=first, 10=last, 11=middle SN = 47 ← Sequence Number (12-bit field) SO = 0 ← Segment Offset (only present if SI≠00) // Window size for AM (TS 38.322 §7.3): SN field = 12 bits → max window = 2^12/2 = 2048 // (18-bit SN also supported for large TBS applications) // STATUS PDU (receiver → transmitter): D/C = 0 ← Control PDU CPT = 000 ← STATUS report ACK_SN = 48 ← Next expected SN (all SNs before 48 received) NACK_SN = 45 ← Missing SN 45 (needs retransmission)
RLC segmentation example
Suppose PDCP delivers a 4,000-byte SDU to RLC, but the first MAC grant only allocates 1,496 bytes. RLC segments the SDU:
// PDCP SDU = 4,000 bytes // RLC header = 2 bytes (12-bit SN, no SO) // MAC grant 1: 1,496 bytes available RLC PDU 1: header [SN=47, SI=01 (first)] + 1,494 bytes of SDU // MAC grant 2: 1,496 bytes available RLC PDU 2: header [SN=47, SI=11 (middle), SO=1494] + 1,492 bytes // MAC grant 3: 1,024 bytes available // Remaining: 4,000 − 1,494 − 1,492 = 1,014 bytes RLC PDU 3: header [SN=47, SI=10 (last), SO=2986] + 1,014 bytes // Receiver reassembles: waits for SI=01 and SI=10 with same SN // Delivers full 4,000 byte SDU to PDCP once all segments received