Segmentation & Reassembly in 5G NR
How RLC fits SDUs to grants with segmentation and the segmentation offset — no concatenation in NR.
MAC never asks RLC "how big is your packet?" — it hands RLC a grant of exactly so many bytes and says "fill it." So RLC (TS 38.322) builds every PDU to fit the grant it is given, and when a PDCP packet is larger than the space on offer, RLC slices it into pieces and labels each piece so the receiver can glue them back together in the right order. Segmentation is the single tool NR RLC has for matching SDU size to grant size — because, unlike LTE, it can no longer concatenate.
Introduction
Segmentation is a transmit-side function of the RLC sublayer, defined in TS 38.322. RLC sits between PDCP above and MAC below: it takes each RLC SDU (one PDCP PDU handed down) and produces RLC PDUs sized to whatever uplink or downlink grant the MAC scheduler has issued for this slot. Whenever an SDU is larger than the space in the current grant, RLC segments it — and that happens constantly on any bearer carrying real traffic.
It runs on every bearer configured in UM (Unacknowledged Mode) or AM (Acknowledged Mode) — effectively all user-plane DRBs and all signalling SRBs. Only TM (Transparent Mode, used for BCCH/PCCH/CCCH broadcast-style transport) never segments, because it adds no RLC header at all. So from the moment a bearer is set up and data starts flowing, segmentation is in the path for nearly everything that crosses the air interface.
It matters because the transport-block size is not RLC's to choose: it is decided slot-by-slot by the scheduler and swings with the channel, the buffer occupancy and the cell load. Segmentation is what lets RLC honour whatever grant arrives immediately rather than stalling for a bigger one — which is exactly what NR's latency targets require.
On this page
Why RLC segments — and why it no longer concatenates
In plain words: imagine you must mail a long letter but the only envelopes you have arrive one at a time in random sizes. You cannot wait for a big envelope, so you tear the letter into page-runs that each fit the envelope on hand, and you number every page-run ("pages 1–3", "pages 4–5") so the reader can reassemble the letter in order. RLC does exactly this: the envelope is the MAC grant, the letter is the RLC SDU, and the page numbers are the SN + SO fields.
The size of a transport block is decided by the scheduler in the gNB and changes slot to slot with the channel, the buffer status, and how many UEs share the cell. RLC has no vote in it — it simply receives a grant and must produce a PDU that fits. An RLC SDU (one PDCP PDU handed down) might be 1500 bytes while this slot's grant is only 200 bytes. RLC cannot stall waiting for a bigger grant without inflating latency, so the only lever it has to reconcile a large SDU with a small grant is segmentation: cut the SDU into contiguous byte-ranges and send one range per PDU.
In LTE, RLC had a second lever — concatenation — where several small SDUs (plus framing information, the FI and E fields and per-SDU LI length indicators) were packed into one PDU to fill a large grant. NR deliberately removed this. Concatenation is now a MAC responsibility: MAC multiplexes multiple RLC PDUs into one transport block using MAC subheaders that already carry each PDU's length. Pushing the "combine small pieces" job up to MAC lets RLC pre-build most of its PDU header the moment an SDU arrives, before the grant size is even known, which shortens the processing pipeline and helps NR hit its low-latency targets. RLC keeps only the "split a big piece" job, which genuinely needs the live grant size.
Splitting one RLC SDU into multiple RLC PDUs, each carrying a contiguous byte-range of the original SDU, so that each PDU exactly fills the MAC grant that will carry it.
The grant size is fixed by the scheduler and varies every slot. Segmentation lets RLC use whatever grant arrives immediately, instead of stalling for one large enough to hold the whole SDU. NR has no concatenation, so this is the only sizing tool RLC owns.
RLC fills the grant with as much of the SDU as fits, marks the piece with a Segmentation Info (SI) field, and, for any piece that does not start at byte 0, a Segmentation Offset (SO) giving the byte position where the segment begins. All pieces of one SDU keep the same SN.
The grant drives everything: RLC does not choose PDU size — MAC's grant does. In NR that means "segment if the SDU is too big," never "concatenate to fill." That inversion from LTE is the single most important idea on this page: concatenation moved to MAC, segmentation stayed in RLC.
The SI and SO fields — how a segment is labelled
Two header fields carry all of the segmentation bookkeeping. The SI (Segmentation Info) field is 2 bits and tells the receiver which part of the SDU this PDU is. The SO (Segmentation Offset) field is 16 bits and tells it where that part starts, counted in bytes from the beginning of the original SDU (byte 0 is the first byte). Together with the SN, they are everything a receiver needs to rebuild an SDU that was scattered across several PDUs.
The SI encoding is fixed by TS 38.322 and worth memorising exactly, because the two data-segment codes are easy to swap in your head:
SI bits | Meaning | Starts at | SO present? |
|---|---|---|---|
00 | Data field carries a complete RLC SDU — not segmented. | byte 0 | No |
01 | Data field carries the first segment of the SDU. | byte 0 | No (implicitly 0) |
10 | Data field carries the last segment of the SDU. | > 0 | Yes |
11 | Data field carries a middle segment (neither first nor last). | > 0 | Yes |
The logic behind "when is SO present" is pure economy. A complete SDU (00) and a first segment (01) both start at byte 0, so their offset is known implicitly and the 16-bit SO is omitted — saving two bytes on the common case. Only a middle (11) or last (10) segment starts partway into the SDU, so only those two carry an explicit SO. Because SO is 16 bits, the largest offset it can express is 65 535 (0–65535), which comfortably covers any RLC SDU size the system will produce.
SN vs SO, in one line: the SN tells the receiver which SDU a piece belongs to; the SO tells it where inside that SDU the piece sits. You need both to rebuild an SDU split across PDUs — the SN groups the fragments, the SO orders them.
UMD and AMD PDU header formats
The exact header a segment carries depends on two things: the RLC mode (UM produces UMD PDUs, AM produces AMD PDUs) and which SI case applies. The rule of thumb is simple — the header grows as the segment needs more identity. A complete SDU needs the least; a middle or last segment needs the most because it must also carry SO.
UMD PDU (Unacknowledged Mode). UM has no ARQ, so its header carries no delivery control — no D/C bit (there are no UM control PDUs) and no P (poll) bit. The headline NR feature lives here: a complete SDU in UM carries no header at all — just the Data field, zero overhead. The SN only appears once an SDU is actually segmented, because only then does the receiver need to correlate fragments. First segments carry SI+SN; middle and last segments add the 16-bit SO.
AMD PDU (Acknowledged Mode). AM always carries a fixed header because ARQ needs it on every PDU: a D/C bit (Data vs Control, since AM also sends STATUS PDUs), a P (polling) bit that asks the peer for a status report, the 2-bit SI, and the SN. So even a complete SDU in AM has a real header. As in UM, middle and last segments append the 16-bit SO.
| Mode | SI case | Header fields present | Header size |
|---|---|---|---|
UM | 00 complete | none (Data only) | 0 bytes |
UM | 01 first | SI + SN | 1 B (6-bit SN) / 2 B (12-bit SN) |
UM | 10 last / 11 middle | SI + SN + SO | 3 B (6-bit SN) / 4 B (12-bit SN) |
AM | 00 complete / 01 first | D/C + P + SI + SN | 2 B (12-bit SN) / 3 B (18-bit SN) |
AM | 10 last / 11 middle | D/C + P + SI + SN + SO | 4 B (12-bit SN) / 5 B (18-bit SN) |
Every one of these headers is byte-aligned — each ends on an octet boundary so the Data field always begins at a whole byte, which keeps parsing cheap and lets hardware copy payload without bit-shifting. Alignment is not free with these field widths, so the spec inserts reserved (R) bits as padding where the fields do not naturally fill an octet. Two examples: the UM 12-bit-SN header packs SI (2 bits) + SN (12 bits) = 14 bits, so 2 reserved bits pad it to a clean 2 octets; the AM 18-bit-SN header packs D/C+P+SI+SN = 22 bits, so 2 reserved bits pad it to 3 octets. By contrast the UM 6-bit-SN first-segment header (SI+SN = 8 bits) and the AM 12-bit-SN header (4+12 = 16 bits) fall on octet boundaries naturally and need no padding.
Why UM can drop the whole header: UM never retransmits and has no control PDUs, so a complete, in-order SDU needs neither an SN nor a D/C bit — MAC's subheader already delimits the PDU. AM cannot do this: ARQ must be able to name, poll for, and acknowledge every PDU, so the fixed D/C+P+SI+SN header is mandatory even on an unsegmented SDU.
One SDU across several MAC PDUs
Here is a single 1400-byte RLC SDU (with SN = 42) being carried over three successive grants of different sizes. Every RLC PDU shares the same SN; the SI and SO fields let the receiver drop each fragment into the correct place. Notice that the first fragment omits SO (its offset is implicitly 0) while the middle and last fragments carry an explicit SO, and that each RLC PDU rides inside its own MAC subheader + MAC SDU slot within a transport block.
Sequence Number sizes and the reassembly window
The SN is what lets the receiver tell SDUs apart, detect loss, and place fragments, so its width sets how many PDUs can be outstanding before the numbering wraps. NR gives two choices per mode, configured by RRC in the RLC-Config IE (inside RLC-BearerConfig). The field is sn-FieldLength: size6/size12 under ul-UM-RLC/dl-UM-RLC, and size12/size18 under ul-AM-RLC/dl-AM-RLC. The choice is a direct trade between header overhead and how much data can be in flight.
| Mode | SN field length | SN space | Why two options |
|---|---|---|---|
UM | 6 or 12 bits | 64 / 4096 | 6-bit keeps header overhead tiny for small, delay-sensitive flows; 12-bit gives a bigger window when more PDUs are in flight or reordering is deeper. |
AM | 12 or 18 bits | 4096 / 262144 | ARQ must keep many un-acknowledged PDUs outstanding; 18-bit suits high-throughput bearers where a large volume of data awaits status before it can be released. |
The reason the window matters is wrap-around. The transmit and reassembly/reordering windows each span half the SN space (AM_Window_Size = UM_Window_Size = 2[SN−1]), so a 12-bit AM SN allows up to 2048 PDUs in flight and an 18-bit AM SN allows up to 131072. If the SN is too short for the volume of data outstanding, the window edge catches up with un-acknowledged PDUs: the transmitter stalls, and after a wrap the receiver can misinterpret an old SN as a new one. This is precisely why high-throughput AM bearers — large file transfers, high-order carrier aggregation — are configured with the 18-bit SN, while a small signalling or voice-like bearer is happy with the shortest option.
Window pitfall: the usable window is half the SN space, not all of it. Size the SN to the bandwidth-delay product of the bearer — too short and the window stalls or SNs alias after wrap; unnecessarily long and you pay an extra header byte on every single PDU.
Re-segmentation of retransmissions (AM only)
In AM, a PDU that was already sent can be flagged for retransmission when the peer's STATUS PDU NACKs it. But the grant available for that retransmission may be smaller than the original PDU — the channel has changed since the first attempt. Rather than wait for a matching grant and stall ARQ, AM can re-segment: take the PDU (or PDU segment) it needs to resend and cut it into still-smaller segments, each fitting the new, smaller grant.
Splitting an already-transmitted AMD PDU (or an existing PDU segment) further at retransmission time, producing smaller segments that fit a grant smaller than the original transmission used.
Grant sizes and channel conditions differ between the first transmission and the retransmission. Without re-segmentation, ARQ would stall until a grant as large as the original PDU appeared — hurting recovery latency exactly when the link is already struggling.
The retransmitted piece keeps the original SN but gets a fresh SO and updated SI describing its new, narrower byte-range. A piece that used to be a "first" segment becoming a re-sent tail, for instance, now carries SI=middle or last with a non-zero SO.
Two properties make this cheap. First, re-segmentation invents no new mechanism — it reuses the very same SN + SO + SI fields. A re-segmented piece is just another labelled fragment of the same SDU, so the receiver's reassembly logic handles it identically to an original segment; it never needs to know whether a fragment came from a first transmission or a re-cut retransmission. Second, only AM ever does this. UM has no ARQ, never retransmits, and therefore never re-segments — a UM segment is built once and either arrives or is lost.
Same fields, reused: re-segmentation is not a special PDU type. It is an ordinary AMD PDU segment whose SO and SI were recomputed for a smaller byte-range. Because the SN is unchanged, the receiver simply files it under the same SDU. See ARQ & Status Reporting for how the NACK that triggers it is built.
Reassembly at the receiver — SN + SO + t-Reassembly
The receiving RLC entity holds incoming fragments in a buffer keyed by SN, and within each SN it orders fragments by SO. When it has a contiguous byte run from a first (or complete) fragment through to the matching last fragment with no gaps, the SDU is whole and is delivered upward to PDCP. Because segments and whole PDUs can arrive out of order, or a middle piece can simply go missing, the receiver arms the t-Reassembly timer to bound how long it waits. t-Reassembly is set by RRC in RLC-Config and takes an enumerated value in milliseconds (a discrete ladder from single-digit values up to 200 ms), chosen against the bearer's latency budget.
The receive procedure that rebuilds each RLC SDU from its fragments: the SN groups fragments, the SO orders them, and t-Reassembly bounds the wait for a piece that has not yet arrived.
Fragments and PDUs can arrive out of order or be lost. The receiver must decide when to stop waiting: wait forever and the buffer stalls behind one hole; give up too soon and you discard data that was merely late.
t-Reassembly starts when a reception gap is detected (a fragment or SN is missing below the highest received). If it expires before the gap fills, the receiver declares the missing SDUs lost and advances its state variables past the hole.
What happens on expiry is where the two modes fork. In UM, the receiver discards the incomplete SDU, advances the reassembly window past it, and moves on — UM is for delay-sensitive traffic that would rather drop a packet than wait for a retransmission that arrives too late to be useful. In AM, expiry (and gap detection generally) drives a STATUS PDU: the missing SN ranges are reported as NACKs (with per-segment SOstart/SOend where only part of an SDU is missing), and the sender retransmits them — possibly re-segmenting as described above. Same timer, same "something is missing" detection, opposite reliability contract: UM abandons the gap, AM repairs it.
The UM/AM fork on timeout: t-Reassembly expiry means the same thing on both sides — a reassembly gap could not be filled in time. UM gives up and slides its window forward (no retransmit). AM turns the gap into a NACK inside a STATUS PDU and recovers it. The timer value is tuned to the bearer's latency budget: long enough to absorb normal reordering, short enough not to freeze the buffer.
⚠ Common pitfalls / gotchas
SOcounts SDU bytes, not PDU bytes. The offset is measured from byte 0 of the originalRLC SDU, not from the start of any PDU or after the header — a frequent off-by-header-length bug in home-grown parsers.- Undersizing the
SN. Picking 12-bit AMSNon a gigabit bearer lets the transmit window (2048 PDUs) fill before status returns, stalling ARQ even though the link is fine. Matchsn-FieldLengthto the bandwidth-delay product. t-Reassemblytoo short. If it expires faster than normal HARQ/ARQ reordering, UM needlessly discards SDUs that were merely late, and AM fires spuriousSTATUS PDUsthat waste uplink.- Assuming complete SDUs have a header in UM. A UM
SI=00SDU has zero RLC bytes; expecting anSNthere mis-parses the MAC SDU boundary.
LTE ↔ NR: LTE RLC (TS 36.322) could both segment and concatenate, packing several SDUs into one PDU with FI/E/LI framing; NR removed concatenation entirely and gave that job to MAC, so NR RLC only segments. SN widths changed too: LTE UM used 5 or 10 bits and LTE AM used a 10-bit SN, whereas NR UM uses 6 or 12 and NR AM uses 12 or 18. LTE marked segments with a FI (Framing Info) field rather than NR's SI; NR's byte-precise SO and header-less complete UM SDU are new. Both RATs support re-segmentation of AM retransmissions.
Summary
NR RLC segments because it has to: the scheduler fixes the transport-block size every slot, and RLC must fit its PDU to that grant with no ability to concatenate (that job moved to MAC). Segmentation cuts one RLC SDU into contiguous byte-ranges, all sharing the SDU's SN, each labelled by a 2-bit SI (complete/first/middle/last) and, for pieces that do not start at byte 0, a 16-bit SO.
Header size grows with segment identity: a complete UM SDU has no header at all, while AM always carries the fixed D/C+P+SI+SN, and middle/last segments add SO in both modes; reserved bits keep every header byte-aligned. The SN width (UM 6/12, AM 12/18) sets a window of half the SN space, which must cover the bearer's in-flight data. At the receiver, fragments are grouped by SN, ordered by SO, and bounded by t-Reassembly — on expiry, UM drops the gap while AM turns it into a NACK and repairs it, re-segmenting the retransmission if the new grant is smaller.
Quick Q&A
Q. Why does NR RLC segment, and what decides the PDU size?
A. The MAC scheduler decides the grant (transport block) size, which varies per slot. RLC sizes each PDU to fit that grant; if the RLC SDU is larger than the grant, RLC segments it into contiguous byte-ranges. Because NR RLC cannot concatenate (that moved to MAC), segmentation is the only sizing tool it has, and it lets RLC use whatever grant it receives without stalling.
Q. How does NR RLC differ from LTE RLC on packing PDUs?
A. LTE RLC could both segment and concatenate several SDUs into one PDU (using FI/E/LI framing). NR removed concatenation from RLC and made it a MAC job — MAC multiplexes multiple RLC PDUs into a transport block via MAC subheaders that carry each PDU's length. NR RLC keeps only segmentation, which lets it pre-build headers early and cut per-PDU latency.
Q. What are the four SI values, and when is SO present?
A. 00 = complete SDU, 01 = first segment, 10 = last segment, 11 = middle segment. The 16-bit SO is present only for last (10) and middle (11) segments, because those start partway into the SDU. Complete and first segments start at byte 0, so their offset is implicit and SO is omitted. All segments of one SDU share the same SN.
Q. How do UMD and AMD headers differ, and what makes them change size?
A. AMD PDUs always carry a fixed header (D/C + P + SI + SN) because ARQ needs it. UMD PDUs carry no header at all for a complete SDU and only add SN once segmented. In both modes, middle/last segments append the 16-bit SO, so a header grows from complete → first → middle/last. Reserved bits pad headers (e.g. UM 12-bit SN, AM 18-bit SN) to keep them byte-aligned.
Q. What are the NR RLC SN sizes, and how does the receiver reassemble?
A. UM SN is 6 or 12 bits; AM SN is 12 or 18 bits. The receiver groups fragments by SN, orders them by SO, and runs t-Reassembly to bound the wait for a missing piece. On expiry, UM discards the incomplete SDU and advances its window, while AM reports the gap in a STATUS PDU so the sender retransmits — re-segmenting if the new grant is smaller.
Q. Why can only AM re-segment, and what fields does it reuse?
A. Re-segmentation happens at retransmission time, and only AM retransmits — UM has no ARQ. It reuses the same SN + SO + SI fields: the re-sent piece keeps the original SN but gets a new SO and updated SI for its narrower byte-range, so the receiver treats it as just another fragment of the same SDU.
Fitting the grant, then guaranteeing delivery
Segmentation is how RLC squeezes an SDU into a grant; ARQ and timers are how AM makes sure nothing is lost on the way. Continue with: