PDCP Duplication in 5G NR
Sending duplicate PDCP PDUs over multiple legs for reliability (URLLC, CA, DC).
PDCP duplication is the brute-force reliability trick of 5G: send the same PDCP PDU down two (or more) independent radio legs at once, so that if one leg drops the packet the other still delivers it. You trade radio resources for a much lower chance of loss and a tighter latency tail — exactly what URLLC needs. The data-plane behaviour lives in TS 38.323 (PDCP); the configuration and control live in TS 38.331 (RRC), with the runtime toggle carried by a MAC control element defined in TS 38.321.
Introduction
PDCP duplication is a transmit-side reliability feature configured by RRC and toggled at runtime by MAC. It lets one PDCP entity submit an identical copy of every PDCP Data PDU to two or more associated RLC entities, so the same packet rides two (or up to four in Rel-16) genuinely independent radio legs. If any one leg delivers the packet, the receiver's PDCP keeps it and discards the twin.
It is used where a bearer's reliability or latency-tail budget cannot be met by a single leg's HARQ/ARQ alone — URLLC data radio bearers, control-plane robustness during setup on marginal links, and mobility-edge flows across dual connectivity. It sits alongside the other PDCP functions (sequence numbering, ciphering, integrity, reordering) and reuses PDCP's COUNT-based duplicate-detection machinery on the receive side.
Because duplication is a configured-then-activated feature, most field problems live in one specific place: the RRC setup of the legs and mapping, the MAC-CE activation state, the transmit-side scheduling that must keep copies on separate carriers, or the receive-side discard. Walking those stages in order is the fastest way to root-cause "duplication is on but reliability didn't improve" tickets.
On this page
Why duplication is needed
In plain words: think of mailing the same signed contract by two different couriers on two different routes at the same time. If one van breaks down or is stuck in traffic, the other copy still arrives on time. You pay for two deliveries, but the chance that both fail is the product of two already-small chances — and you never wait for a re-send. Duplication is exactly that for a radio packet.
Concretely, a single radio leg protects a packet with HARQ and RLC ARQ, but both of those cost time: a lost transport block means waiting a round-trip for a retransmission, which inflates the latency tail. For a best-effort bearer that is fine; for a URLLC bearer with a 1–10 ms budget and a 10⁻⁵ residual-error target it is not. Duplication attacks both problems at once: the probability that every independent leg loses the same packet is the product of the per-leg loss probabilities (far smaller than any single leg), and because a copy already arrived on the other leg you rarely pay for a retransmission at all. The gain is real only if the legs are genuinely diverse, which is why the standard forces the copies onto different carriers or different nodes.
What PDCP Duplication Is
Normally one PDCP PDU takes one path down the stack: PDCP hands it to a single RLC entity, which hands it to MAC, which schedules it on one carrier. With duplication the transmitting PDCP entity makes an identical copy of the PDU and submits it to two or more associated RLC entities. Each copy travels its own RLC / logical-channel path and — crucially — is scheduled so the copies do not share the same radio resource. The receiver's PDCP keeps whichever copy arrives first and discards the rest by matching their COUNT.
One PDCP entity produces N identical PDCP Data PDUs (same PDCP SN, same COUNT) and routes them to N distinct RLC entities (legs). N is 2 in the common case, up to 4 in Rel-16.
Diversity. Two legs on different carriers or different nodes rarely fade or collide at the same instant, so the probability that every copy is lost is the product of the per-leg loss probabilities — dramatically smaller than any single leg alone.
RRC (pdcp-Duplication inside PDCP-Config) configures the extra RLC entities and the mapping; a MAC CE (Duplication Activation/Deactivation) or RRC turns duplication on/off per DRB at runtime. The receiver relies on normal PDCP duplicate detection to drop copies.
Core idea: reliability by repetition across independent paths. The gain only exists if the legs are genuinely diverse — different carriers (CA) or different nodes (DC). Duplicating onto resources that fade together buys you almost nothing, so the standard forces the copies apart with mapping restrictions.
Duplication applies to a DRB (and, in principle, to a signalling radio bearer for robustness during setup). It is a transmit-side feature entirely contained in one PDCP entity: nothing above PDCP is aware that a packet was sent twice, and nothing below PDCP needs to coordinate — each RLC leg treats its copy as an ordinary SDU with its own independent ARQ state and sequence numbering.
Two Ways to Get Independent Legs
Duplication needs at least two legs, and 5G offers two structurally different ways to provide them: within one node using carrier aggregation, or across two nodes using dual connectivity.
All the duplicate RLC legs sit under one MAC entity. The MAC scheduler is told to place each duplicate logical channel on a different serving cell (carrier), so the two copies leave the UE on different frequencies of the same node.
The duplicate RLC legs are split across the MCG and SCG — a split bearer whose two ends run on two MAC entities in two nodes. The copies leave the UE via the master cell group and the secondary cell group.
Up to four legs may be configured, and CA and DC duplication can be combined: e.g. two legs on the MCG (two carriers) plus two on the SCG. One leg is always the primary RLC entity.
| Aspect | CA duplication | DC duplication |
|---|---|---|
| MAC entities involved | One (single node) | Two (MCG + SCG, two nodes) |
| Source of diversity | Frequency — different serving cells/carriers of the same gNB | Spatial/site — different nodes, often different sites and backhaul |
| Legs mapped to | Different carriers via allowedServingCells in LogicalChannelConfig | Cell groups (MCG vs SCG) of a split bearer |
| Max legs | Up to 4 (Rel-16); 2 in Rel-15 | 2 in Rel-15; extendable when combined with CA in Rel-16 |
| Latency of adding a leg | Low — SCell already under the same MAC | Higher — needs SCG established and synchronised |
| Typical use | URLLC on a single site with wide/multi-band coverage | Robustness across nodes; macro + small cell; mobility edge |
| Backhaul dependence | None beyond the node | Depends on Xn/F1 to deliver a copy to the SCG in time |
In every case the anchoring rule is the same: to gain anything, the copies must never ride the same carrier at the same time. In CA that is enforced per logical channel; in DC it is intrinsic, because the two legs belong to physically different cell groups. Both flavours reuse exactly the same PDCP machinery — the only difference is where the second RLC entity terminates.
Primary and Secondary Legs, and the Mapping Restriction
When RRC configures duplication it turns the DRB from single-RLC into a multi-RLC bearer with a moreThanOneRLC structure inside PDCP-Config. One of the associated RLC entities is designated the primary path (primaryPath, identified by a cell-group and logical-channel pair); the others are the duplicate (secondary) legs. The primary path is special in one way: when duplication is deactivated, that is the leg the DRB collapses back to and behaves like an ordinary single-leg bearer.
Diversity is not automatic — if the MAC were free to schedule both copies on the same carrier, one fade or one collision would take out both and the redundancy would be worthless. So RRC constrains each duplicate logical channel with per-logical-channel mapping restrictions in LogicalChannelConfig (carried in the RLC-BearerConfig):
allowedServingCells— the set of serving cells (carriers) on which this logical channel's data may be transmitted. Duplicate legs are given disjoint sets, so the scheduler physically cannot place two copies on one carrier.allowedSCS-ListandmaxPUSCH-Duration— further restrict which numerology and grant types a leg may use, useful when the duplicate carrier has different characteristics.
These restrictions are what make CA duplication real diversity rather than two copies on the same beam. In DC duplication the separation is structural instead: the two legs terminate in the MCG and the SCG, so no allowedServingCells trickery is needed to keep them apart — they are already in different cell groups.
Spec note: the duplicate copies carry the same PDCP SN / COUNT but are otherwise independent SDUs from each RLC entity's point of view. Each RLC leg runs its own ARQ, its own SN space, and its own status reporting. PDCP is the only layer that knows the two are twins.
✅ Debugging steps
- Confirm the
RRCReconfigurationactually configuredPDCP-Config.moreThanOneRLCfor the DRB — a DRB with a single RLC bearer can never duplicate no matter what MAC CE arrives. - Check that the DRB has two (or more)
RLC-BearerConfigentries bound to it and thatprimaryPathnames a cell-group / logical-channel pair that actually exists in the configuration. - For CA duplication, verify each duplicate logical channel's
allowedServingCellssets are disjoint; overlapping sets let the scheduler co-locate copies and silently kill the diversity gain. - For DC duplication, verify the SCG leg is established and synchronised (PSCell added, SCG RLC bearer up) before expecting the second copy to fly.
⚠ Common causes of failure
- DRB configured single-RLC (no
moreThanOneRLC), so activation has no second leg to use. - Overlapping
allowedServingCellsacross duplicate legs — copies ride the same carrier and fade together, so reliability does not improve. primaryPathpointing at a logical channel that is not among the configured RLC bearers, so the DRB cannot fall back cleanly.- SCG not yet added/synchronised in DC duplication, so only the MCG leg carries traffic.
Activation, Deactivation and Control
Duplication is expensive, so you rarely leave it on permanently. 5G separates the slow act of configuring the capability from the fast act of toggling it, and provides two control paths accordingly.
RRC (TS 38.331) sets up the duplication capability: it configures the associated RLC entities and the primaryPath via PDCP-Config / moreThanOneRLC, sets the per-leg mapping restrictions, and via the pdcp-Duplication field sets the initial duplication state (activated or deactivated) for the DRB.
For fast, per-DRB runtime toggling the gNB sends the Duplication Activation/Deactivation MAC CE — a one-octet bitmap where each bit turns duplication on/off for one configured DRB. MAC-CE speed lets duplication follow the channel and the traffic within a few slots.
When duplication is deactivated the DRB collapses back to its primaryPath RLC leg and behaves like an ordinary bearer; the secondary legs simply carry nothing until re-activated. No data is lost in the transition — in-flight duplicates already submitted to RLC are handled by the peer's normal discard.
| Method | Layer / message | Speed | What it controls |
|---|---|---|---|
| Configure legs & mapping | RRCReconfiguration → PDCP-Config.moreThanOneRLC, LogicalChannelConfig | Slow (RRC round-trip) | Which RLC entities exist, the primaryPath, and allowedServingCells per leg |
| Initial state | RRC field pdcp-Duplication | Slow | Whether the DRB starts with duplication on or off |
| Runtime toggle (CA) | Duplication Activation/Deactivation MAC CE (TS 38.321) | Fast (few slots) | Per-DRB on/off bit; scheduler-driven, tracks the channel |
| Runtime toggle (DC) | Same MAC CE, per cell group | Fast | Activates/deactivates the SCG leg of a split-bearer duplication |
Why a MAC CE and not just RRC: RRC reconfiguration is slow and heavy. A URLLC bearer may want duplication only during a fading dip or a burst of critical traffic. The Duplication Activation/Deactivation MAC CE lets the scheduler switch legs on within a few subframes, then switch them off to reclaim spectrum when the channel is good — all without touching the RRC configuration.
How the MAC CE is delivered: the Duplication Activation/Deactivation MAC CE is carried as a DL MAC subheader/CE on DL-SCH (PDSCH), scheduled by a DCI format 1_0 or 1_1 whose CRC is scrambled with the UE's C-RNTI in the UE-specific search space, and identified by its dedicated LCID in the MAC subheader. Each bit position i maps to the DRB configured with pdcp-Duplication in ascending order of DRB identity; 1 = activate, 0 = deactivate.
Representative UE MAC-layer log (duplication activation) — illustrative, values vary by vendor/build:
| Field | Meaning | Example | Check |
|---|---|---|---|
LCID | MAC subheader logical-channel ID identifying this as the Duplication Activation/Deactivation CE. | DuplicationActivation/Deactivation | Confirm the CE was actually received on DL-SCH; if absent, the DRB stays in its pdcp-Duplication initial state. |
duplication_ce_bitmap | One bit per duplication-capable DRB; 1=activate, 0=deactivate. | 0b00000010 | Bit position must map to the intended DRB in ascending DRB-id order; a shifted bit toggles the wrong bearer. |
| DRB state | Resulting per-DRB duplication state after applying the CE. | DRB1 ACTIVATED | Cross-check against the gNB's intent; a DRB stuck deactivated means the CE bit or ordering is wrong. |
primaryPath / secondary LCID | The RLC legs the PDCP entity now feeds. | LCID 4 & 5 | Both LCIDs must map to disjoint serving cells; if the duplicate PDU line is missing, only one leg is active. |
COUNT | PDCP COUNT stamped identically on both copies. | 0x0000008E | The two submitted PDUs must share one COUNT; differing COUNTs means they are not true duplicates. |
✅ Debugging steps
- Confirm the
Duplication Activation/DeactivationMAC CE was received (correct LCID) and decode its bitmap; verify the bit for the target DRB is set. - Check the bit-to-DRB mapping is in ascending DRB-identity order — an off-by-one maps the CE onto the wrong bearer.
- After activation, verify the PDCP trace shows two submit lines per PDU (same COUNT, different RLC LCID); a single line means the second leg is not being fed.
- On deactivation, confirm the DRB collapses to
primaryPathonly and traffic continues without loss.
⚠ Common causes of failure
- MAC CE never delivered (PDCCH miss / poor DL), so the DRB never leaves its RRC initial
pdcp-Duplicationstate. - Bitmap bit maps to a DRB not configured with
moreThanOneRLC, so activation is a no-op. - Bit-position/DRB-id ordering mismatch between gNB and UE, toggling the wrong bearer.
- Duplication activated but scheduler starves the secondary leg (no grants on the second carrier), so effectively only one leg flies.
The Receiver Side — Discarding Duplicates by COUNT
Duplication would be useless if the receiver delivered both copies to the upper layers. It does not, and it needs no special "de-duplication" machinery to avoid that — it reuses the ordinary PDCP reception logic keyed on COUNT (the concatenation of the HFN and the PDCP SN). Each copy carries the same COUNT. The receiving PDCP maintains a reordering window and tracks which COUNT values it has already received and delivered; when the second copy of COUNT c arrives, it is recognised as an already-received COUNT and is simply discarded. The first-arriving copy is the one that counts.
Note: because in-order delivery and duplicate discard are already part of PDCP reception (the same logic that protects against RLC re-transmission artefacts and HFN wrap), duplication is essentially free on the receive side. The cost lives on the transmit side (extra RLC entities, extra grants) and in the air (extra radio resource). See PDCP Reordering for the window and the t-Reordering timer that make this work.
Two consequences are worth stating. First, duplication does not change the delivered COUNT space: upper layers see a single, in-order stream exactly as if one leg had carried everything. The second leg is invisible to them; it only ever removes latency-tail and loss events. Second, the receiver does not care which leg won. On a good day copy A arrives first and copy B is dropped; on a bad day the reverse. Either way the application sees one clean packet at the earliest possible moment.
It also matters that the discard is stateless with respect to the legs. The receiving PDCP does not track per-leg arrival order or hold a copy waiting for its twin; it simply delivers the first copy that falls into the window and marks that COUNT as received, so any later arrival — whether the duplicate or a delayed RLC re-transmission — is dropped on sight. This is why duplication composes cleanly with everything else PDCP does: header decompression, integrity verification and deciphering all run once, on the winning copy, and the loser is discarded before it ever reaches those steps.
✅ Debugging steps
- Confirm the receiving PDCP delivered each COUNT exactly once — the duplicate-discard counter should climb while the delivered-SDU count stays clean.
- If SDUs are missing, check the reordering window and
t-Reordering: a copy arriving far outside the window is dropped as stale, not delivered. - Verify both legs actually reach the receiver (per-leg RLC delivery counters non-zero); if only one leg ever delivers, duplication is not buying diversity.
⚠ Common causes of failure
- One leg persistently failing (bad carrier/beam) so the discard counter is zero — duplication configured but no real redundancy.
- Reordering window too small or
t-Reorderingtoo short, so a legitimately late copy is discarded as out-of-window and a gap is reported instead of healed. - COUNT desynchronisation (HFN mismatch) between the copies, so the receiver fails to recognise them as twins.
When to Use It — and the Throughput Cost
Duplication is the clearest reliability-versus-cost knob in the stack. On the benefit side you get a lower residual error probability and, just as important for URLLC, a shorter latency tail: you no longer wait for an RLC/HARQ retransmission on a single leg when the other leg already delivered the packet on time. On the cost side you spend roughly double (or N-times) the radio resources for the duplicated flow, plus scheduler complexity to keep the legs on separate carriers.
That is why the standard makes it dynamic and per-DRB. The clear candidates:
- URLLC 5QIs — a DRB with a hard 1–10 ms budget and a 10⁻⁵ reliability target justifies the doubled cost. The diversity gain shrinks the loss probability and cuts the tail latency that a retransmission on a single leg would add.
- Initial-access and setup robustness — duplicating an SRB during connection establishment or reconfiguration protects the control-plane message exchange when the radio link is marginal, so the UE does not fall back to a slow re-establishment.
- Mobility edge / handover margins — DC duplication across MCG and SCG keeps a critical flow alive while one leg's radio conditions degrade.
The throughput cost is direct: a duplicated flow consumes about twice the air resources for the same delivered user bits, so the cell's spectral efficiency for that flow roughly halves while duplication is active. On a loaded cell that is spectrum taken from other users. The gNB therefore activates duplication when reliability matters and the channel is marginal, and deactivates it — via the MAC CE — to give the spectrum back the rest of the time. A best-effort DRB would never justify it.
Rule of thumb: duplication buys reliability and a tighter latency tail at the price of throughput. Turn it on for the critical packet during the marginal moment; turn it off the instant the channel is good again.
LTE ↔ NR: LTE has no native PDCP packet duplication in Rel-8 — reliability came from RLC ARQ and, in LTE DC (Rel-12), split bearers used for throughput rather than redundancy. PDCP duplication was introduced with NR (Rel-15) as an explicit reliability tool for URLLC, then extended in Rel-16 to up to four legs and to combined CA+DC duplication. LTE later gained a comparable duplication feature for its own URLLC work, but the NR design — moreThanOneRLC, per-logical-channel allowedServingCells, and the MAC-CE runtime toggle — is the reference model.
Summary
PDCP duplication trades radio resource for reliability by sending the same PDCP PDU (same COUNT) down two or more diverse legs. The fastest way to root-cause a "duplication isn't helping" ticket is to walk the stages in order: RRC config → MAC-CE activation → transmit-side scheduling → receive-side discard. If the DRB was never configured with moreThanOneRLC, nothing downstream can work. If the Duplication Activation/Deactivation MAC CE never landed or its bitmap bit maps to the wrong DRB, the state stays at the RRC initial pdcp-Duplication value. If allowedServingCells overlap, the copies fade together and reliability never improves. And if the receiver's discard counter is zero, only one leg is really flying.
Used well — on the right DRB, during the marginal moment, with genuinely disjoint carriers — duplication shrinks both the loss probability and the latency tail; used carelessly it just doubles your airtime cost for nothing.
Quick Q&A
Q. Why must the duplicate copies be on different carriers?
A. The whole point is path diversity. If both copies ride the same carrier, one fade or collision loses both simultaneously and the redundancy adds nothing. RRC restricts each duplicate logical channel to disjoint serving cells via allowedServingCells so the MAC cannot co-locate them.
Q. What is the difference between CA duplication and DC duplication?
A. CA duplication keeps all legs under one MAC entity and maps them to different carriers of the same node (frequency diversity, up to 4 legs in Rel-16). DC duplication splits the legs across the MCG and SCG — two MAC entities in two nodes — for site/node diversity. They can be combined in Rel-16.
Q. How does the receiver avoid delivering the packet twice?
A. It doesn't need special logic. Both copies carry the same COUNT (HFN + PDCP SN); the ordinary PDCP reordering window treats the second arrival as an already-received COUNT and discards it, delivering only the first copy in order.
Q. RRC vs the MAC CE for duplication control?
A. RRC (PDCP-Config.moreThanOneRLC, primaryPath, mapping restrictions, and the pdcp-Duplication initial state) configures the capability. The Duplication Activation/Deactivation MAC CE toggles duplication on/off per DRB at runtime, fast enough to track the channel — much quicker than an RRC reconfiguration.
Q. What happens when duplication is deactivated?
A. The DRB collapses back to its primaryPath RLC leg and behaves like an ordinary single-leg bearer. The secondary legs carry nothing until duplication is re-activated; no data is lost in the transition.
Q. What is the main cost of duplication?
A. Throughput. A duplicated flow uses roughly N-times the radio resources for the same delivered bits, so its spectral efficiency drops accordingly. That is why it is applied dynamically, per DRB, and only for critical traffic during marginal channel conditions.
Where this sits
Duplication is one PDCP feature among several — it leans directly on PDCP's sequence numbering, COUNT and reordering, and it applies to data (and control) radio bearers configured over carrier aggregation or dual connectivity.