<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sandeep Ahluwalia</title>
    <description>The latest articles on DEV Community by Sandeep Ahluwalia (@eventhelix).</description>
    <link>https://dev.to/eventhelix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4025556%2F1159e745-d525-47cd-a214-d922af2a5141.png</url>
      <title>DEV Community: Sandeep Ahluwalia</title>
      <link>https://dev.to/eventhelix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/eventhelix"/>
    <language>en</language>
    <item>
      <title>The Xn procedure that fetches a sleeping UE from another gNB</title>
      <dc:creator>Sandeep Ahluwalia</dc:creator>
      <pubDate>Thu, 30 Jul 2026 15:08:46 +0000</pubDate>
      <link>https://dev.to/eventhelix/the-xn-procedure-that-fetches-a-sleeping-ue-from-another-gnb-145a</link>
      <guid>https://dev.to/eventhelix/the-xn-procedure-that-fetches-a-sleeping-ue-from-another-gnb-145a</guid>
      <description>&lt;p&gt;5G gave the RRC state machine a third state. Between &lt;code&gt;IDLE&lt;/code&gt; and &lt;code&gt;CONNECTED&lt;/code&gt; sits &lt;code&gt;RRC_INACTIVE&lt;/code&gt;: a UE with no traffic gets &lt;em&gt;suspended&lt;/em&gt; rather than released, the gNB keeps its access-stratum context, and the UE walks away with an &lt;strong&gt;I-RNTI&lt;/strong&gt; — a token naming that stored context.&lt;/p&gt;

&lt;p&gt;Then mobility happens. The UE wakes up with data to send, but at a cell served by a &lt;em&gt;different&lt;/em&gt; gNB. The new node has no idea who this UE is. Resolving that is a small, tidy Xn procedure called &lt;strong&gt;Retrieve UE Context&lt;/strong&gt;, and a five-frame XnAP-over-SCTP capture holds all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the capture shows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The interface comes up first (frames 1-2).&lt;/strong&gt; Xn Setup Request and Response, non-UE-associated, each gNB advertising its served-cell configuration — PLMN, gNB ID, NR-PCI, TAC, slice. Nothing UE-specific can travel until this is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The I-RNTI is a pointer; the shortResumeMAC-I is a signature (frame 3).&lt;/strong&gt; The UE's &lt;code&gt;RRCResumeRequest&lt;/code&gt; carried both. The I-RNTI tells the target gNB &lt;em&gt;which node&lt;/em&gt; holds the context and &lt;em&gt;which context&lt;/em&gt; it is. The UE computes shortResumeMAC-I from its stored keys, so the anchor can verify the resume request is genuine before releasing anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resuming forward-secures the keys (frame 4).&lt;/strong&gt; The context comes back with a NextHopChainingCount (&lt;code&gt;NCC = 2&lt;/code&gt;) and a 32-byte &lt;code&gt;K_NG-RAN*&lt;/code&gt; next-hop key. The target derives fresh AS keys from those — vertical key derivation — so the new cell cannot read traffic the UE exchanged before the resume. Riding along: UE-AMBR, and one PDU session with its QoS flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Both ends get cross-referenced (frame 5).&lt;/strong&gt; The Confirm quotes both UE XnAP IDs, binding the two nodes' identifiers to the same UE-associated Xn connection.&lt;/p&gt;

&lt;p&gt;And the distinction that trips people up: this is &lt;strong&gt;not&lt;/strong&gt; Handover Preparation. Handover is source-driven — the serving gNB decides to move a connected UE and pushes the context to a target it chose. Retrieve UE Context is target-driven — the UE arrives, asks to resume, and the new gNB &lt;em&gt;pulls&lt;/em&gt;. Same outcome, opposite trigger.&lt;/p&gt;

&lt;p&gt;One caveat the write-up states plainly: it's a single-machine loopback capture with some trivial field values, so read it for the shape of the procedure rather than for realistic numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full walk-through, frame by frame:&lt;/strong&gt; &lt;a href="https://www.eventhelix.com/5G/xn-ue-context-retrieval/" rel="noopener noreferrer"&gt;https://www.eventhelix.com/5G/xn-ue-context-retrieval/&lt;/a&gt; — every field value, the decoded packet trees, and where the Xn leg sits in the end-to-end resume across Uu and NG.&lt;/p&gt;

&lt;p&gt;The sequence diagrams were generated from the PCAP with &lt;a href="https://www.eventhelix.com/visualether/" rel="noopener noreferrer"&gt;VisualEther&lt;/a&gt;, which turns a Wireshark capture into an annotated sequence diagram; there's a &lt;a href="https://www.eventhelix.com/visualether/download" rel="noopener noreferrer"&gt;free Community edition&lt;/a&gt;, and the &lt;a href="https://diagrams.eventhelix.com/call-flows/html/5g/xn-ue-context-retrieval/" rel="noopener noreferrer"&gt;interactive diagram&lt;/a&gt; for this capture opens each message's full Wireshark field tree on click.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>5g</category>
      <category>wireshark</category>
      <category>telecom</category>
    </item>
    <item>
      <title>The Life of a 5G Connection, One Packet at a Time</title>
      <dc:creator>Sandeep Ahluwalia</dc:creator>
      <pubDate>Wed, 22 Jul 2026 23:02:32 +0000</pubDate>
      <link>https://dev.to/eventhelix/the-life-of-a-5g-connection-one-packet-at-a-time-n2n</link>
      <guid>https://dev.to/eventhelix/the-life-of-a-5g-connection-one-packet-at-a-time-n2n</guid>
      <description>&lt;p&gt;&lt;em&gt;Reading a real &lt;a href="https://gitlab.com/ocudu/ocudu_docs/-/tree/ee8d7c659a5585337b70b3e37e2ec88837b6edc9/docs/knowledge_base/cots_ues" rel="noopener noreferrer"&gt;5G NR air-interface capture&lt;/a&gt; from a Motorola Edge 30 Pro — from the first random-access message to a textbook retransmission storm at the very end.&lt;/em&gt; The trace was decoded and annotated with &lt;a href="https://www.eventhelix.com/visualether/" rel="noopener noreferrer"&gt;VisualEther&lt;/a&gt;, which turns a Wireshark 5G-NR PCAP into a sequence diagram.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the annotated diagram&lt;/strong&gt; — click any message to open its complete Wireshark field tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/call-flows/5g/nr-connection-lifecycle/nr-connection-lifecycle.annotated_viewer.html" rel="noopener noreferrer"&gt;Interactive viewer&lt;/a&gt; (best on Chrome, Edge, or Firefox)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/call-flows/html/5g/nr-connection-lifecycle/" rel="noopener noreferrer"&gt;HTML sequence diagram&lt;/a&gt; (works in every browser)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://diagrams.eventhelix.com/call-flows/5g/nr-connection-lifecycle/nr-connection-lifecycle.pdf" rel="noopener noreferrer"&gt;Printable PDF&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: open one of the diagrams in a second window and read it side by side with this walkthrough, so the captions stay in view.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;The flow is based on 69 frames over about 5.5 seconds, taken on the UE side of a Motorola Edge 30 Pro modem — it contains the &lt;em&gt;entire life of a single radio connection&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Every step is visible in the packets. In the interactive viewer or the HTML sequence diagram above, click any message to open its parameter details and the complete Wireshark field tree for that frame.&lt;/p&gt;

&lt;p&gt;A couple of facts that hold for the whole capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is exactly one UE, identified by its cell radio identity &lt;code&gt;C-RNTI 0x4601&lt;/code&gt;, on an FDD carrier.&lt;/li&gt;
&lt;li&gt;Access-Stratum (radio) security negotiated the &lt;code&gt;NEA0&lt;/code&gt; "null" cipher with &lt;code&gt;NIA2&lt;/code&gt; integrity — nothing is encrypted over the air, but messages are genuinely integrity-protected. Separately, the NAS layer (a different security context) also used null ciphering here, and that — with Wireshark told to decipher null-NAS — is &lt;em&gt;why&lt;/em&gt; we can read the core-network message bodies. Both are test-rig choices; a commercial network would use &lt;code&gt;NEA1/2/3&lt;/code&gt;, and those bodies would be opaque.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A primer on the 5G radio stack
&lt;/h2&gt;

&lt;p&gt;Before the walkthrough, here's the layer cake every frame rides on. Reading top to bottom is reading a message from application intent down to radio symbols.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Job in one line&lt;/th&gt;
&lt;th&gt;What you'll see in the trace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAS / 5GMM &amp;amp; 5GSM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UE ↔ core-network signaling (registration, sessions)&lt;/td&gt;
&lt;td&gt;Registration Request, PDU Session Establishment, Deregistration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RRC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;UE ↔ gNB radio-connection control&lt;/td&gt;
&lt;td&gt;RRC Setup, Security Mode Command, Reconfiguration, Release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PDCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ciphering, integrity, sequence numbering&lt;/td&gt;
&lt;td&gt;PDCP SN / COUNT, MAC-I integrity tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RLC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reliable delivery (ARQ), segmentation&lt;/td&gt;
&lt;td&gt;RLC-AM Data &amp;amp; Status PDUs, ACK_SN, poll bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MAC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scheduling, multiplexing, control elements&lt;/td&gt;
&lt;td&gt;LCID, Contention Resolution, BSR, PHR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two ideas from this stack do all the heavy lifting in this capture:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signaling bearers vs. data bearers.&lt;/strong&gt; Control messages travel on a Signaling Radio Bearer (SRB) — here SRB1, which the trace calls "Bearer 1." User data travels on a Data Radio Bearer (DRB) — here "Bearer 4 / LCID 4," which doesn't exist yet at the start; watch it get built in Phase 3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RLC Acknowledged Mode (RLC-AM).&lt;/strong&gt; Both bearers run RLC-AM, a reliable-delivery protocol with its own ARQ. The sender numbers each PDU with a Sequence Number (SN); the receiver periodically returns a Status PDU carrying a cumulative &lt;code&gt;ACK_SN&lt;/code&gt; ("I have everything below this number"). A sender can set a poll bit to demand an immediate Status PDU, and if a polled PDU isn't acknowledged before the &lt;code&gt;t-PollRetransmit&lt;/code&gt; timer fires, RLC resends it. Hold onto that last sentence — it's the entire explanation for the drama at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow one protocol at a time
&lt;/h2&gt;

&lt;p&gt;You've just met the five layers. The &lt;a href="https://diagrams.eventhelix.com/call-flows/html/5g/nr-connection-lifecycle/" rel="noopener noreferrer"&gt;interactive diagram&lt;/a&gt; stacks them all on a single timeline — true to how the connections really happen, but a lot to absorb at once. These per-session views slice the same capture the other way: one protocol, one bearer, from the first frame to the last.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/nas-5gs/incomplete/00002.html" rel="noopener noreferrer"&gt;&lt;strong&gt;NAS-5GS&lt;/strong&gt;&lt;/a&gt; — the core-network conversation end-to-end: Registration → PDU session → deregistration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/rrc-connection/incomplete/00007.html" rel="noopener noreferrer"&gt;&lt;strong&gt;RRC&lt;/strong&gt;&lt;/a&gt; — every message on the signaling radio connection, from Setup through Release.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/pdcp-bearer/incomplete/00003.html" rel="noopener noreferrer"&gt;&lt;strong&gt;PDCP · SRB1 (Bearer 1)&lt;/strong&gt;&lt;/a&gt; — PDCP SN / COUNT on the signaling bearer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/pdcp-bearer/incomplete/00004.html" rel="noopener noreferrer"&gt;&lt;strong&gt;PDCP · DRB (Bearer 4)&lt;/strong&gt;&lt;/a&gt; — PDCP SN / COUNT on the data bearer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/rlc-bearer/incomplete/00005.html" rel="noopener noreferrer"&gt;&lt;strong&gt;RLC-AM · SRB1 (Bearer 1)&lt;/strong&gt;&lt;/a&gt; — ACK_SN, poll bit, and the Phase-2 / Phase-6 retransmissions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/rlc-bearer/incomplete/00006.html" rel="noopener noreferrer"&gt;&lt;strong&gt;RLC-AM · DRB (Bearer 4)&lt;/strong&gt;&lt;/a&gt; — segmentation and Phase 4's clean data transfer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://diagrams.eventhelix.com/visualether/html/5g-nr-radio/moto_edge_30_pro/mac-ue/incomplete/00001.html" rel="noopener noreferrer"&gt;&lt;strong&gt;MAC (C-RNTI 0x4601)&lt;/strong&gt;&lt;/a&gt; — contention resolution, LCID multiplexing, BSR, and PHR.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The flow at a glance
&lt;/h2&gt;

&lt;p&gt;The connection unfolds in six phases. Each is a section below; the &lt;a href="https://diagrams.eventhelix.com/call-flows/html/5g/nr-connection-lifecycle/" rel="noopener noreferrer"&gt;interactive diagram&lt;/a&gt; shows every arrow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RRC connection setup&lt;/strong&gt; (frames 1–3) — RRC Setup Request → Setup + Contention Resolution → Setup Complete, carrying the first NAS Registration Request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security + registration&lt;/strong&gt; (frames 4–18) — Security Mode Command/Complete, then Registration Accept/Complete and a Configuration Update Command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open a data session&lt;/strong&gt; (frames 19–31) — PDU Session Establishment Request, UE Capability exchange, and an RRC Reconfiguration that builds the DRB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User-plane data&lt;/strong&gt; (frames 32–52) — ciphered RLC-AM data on the DRB with increasing ACK_SN.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teardown + detach&lt;/strong&gt; (frames 53–57) — PDU Session Release and a UE-originating Deregistration Request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release + retransmission storm&lt;/strong&gt; (frames 58–69) — one RRC Release, retransmitted 11 more times because the UE has already gone.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This one connection advances three state machines in parallel — the radio link (RRC) and the two NAS layers, 5GMM (mobility) and 5GSM (session):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptj0ELgkAQhf_KsMfKS0cPQaiHIAzWbhUxtOO64K6xjl3E_96mZBTNbb73eI_Xi1ujSMQgWkam1KD2aKPH-uwg3GlxgSjagJTJdZfus4m-v1lKDnmeJccsjUFuYfliUBB3949_tnzlxaNVUk3Y0p_w0D9R1zCBN7piaMrfzsJoh7VxOlR3LXlQyChWICx5i0aFeb3giuw4VFGJXc1iGJ6QR0ni" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptj0ELgkAQhf_KsMfKS0cPQaiHIAzWbhUxtOO64K6xjl3E_96mZBTNbb73eI_Xi1ujSMQgWkam1KD2aKPH-uwg3GlxgSjagJTJdZfus4m-v1lKDnmeJccsjUFuYfliUBB3949_tnzlxaNVUk3Y0p_w0D9R1zCBN7piaMrfzsJoh7VxOlR3LXlQyChWICx5i0aFeb3giuw4VFGJXc1iGJ6QR0ni" alt="RRC state journey" width="316" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The RRC state journey: IDLE to CONNECTED and back to IDLE.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqFkT0PgjAQhv_K5UZjFxMXBhMSCGHQAdnEoYEDmggoLToQ_ru1fBniR5e27z3v22uuxbhKCC1AqbgiR_Cs5gW7b6IS9DIiRLj19nvmuIHr-cdQb06EwCUY5QM5c8w_-KFvh6PjVdHKT89E_ulhmd3XpvTT6gyM7d6bNEcjDqQFAWVCqporUZX6cmtIqh4ekBFfoHYc03Um55f6WIfqr8ETNpsskA-h4pxVabpsVf8D14AF1QUXiR5ViyqnwgwtoZQ3F4Vd9wRMxIVg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqFkT0PgjAQhv_K5UZjFxMXBhMSCGHQAdnEoYEDmggoLToQ_ru1fBniR5e27z3v22uuxbhKCC1AqbgiR_Cs5gW7b6IS9DIiRLj19nvmuIHr-cdQb06EwCUY5QM5c8w_-KFvh6PjVdHKT89E_ulhmd3XpvTT6gyM7d6bNEcjDqQFAWVCqporUZX6cmtIqh4ekBFfoHYc03Um55f6WIfqr8ETNpsskA-h4pxVabpsVf8D14AF1QUXiR5ViyqnwgwtoZQ3F4Vd9wRMxIVg" alt="5GMM mobility state journey" width="387" height="510"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;5GMM (mobility) state journey, UE side: Registration Request rides frame 3 and Registration Accept frame 8; the switch-off Deregistration Request is frame 56, for which no Accept is awaited.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqFkDEPgkAMhf9K09HI4shgQuRiWJCIuojDCVVIOFDucCH8d887FENi7NS-fH19aYdpnRG6gFJxRX7Brw0XzmORVKDLiJBg5O8hZnEcbEIIQm-1Cw4sQeDSTr9hizoRC_0gXNsVrb3mf0sf2ILH2QkcZ_l90LRGHCxdYNrvXBYyF1Qp2NK9JaksPTBvfsp6aUq3ER1vuWCykZRFXWnLkrikaQCdDueAghrBi0z_s0OVkzCfzejC21Jh3z8B7g5qig" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqFkDEPgkAMhf9K09HI4shgQuRiWJCIuojDCVVIOFDucCH8d887FENi7NS-fH19aYdpnRG6gFJxRX7Brw0XzmORVKDLiJBg5O8hZnEcbEIIQm-1Cw4sQeDSTr9hizoRC_0gXNsVrb3mf0sf2ILH2QkcZ_l90LRGHCxdYNrvXBYyF1Qp2NK9JaksPTBvfsp6aUq3ER1vuWCykZRFXWnLkrikaQCdDueAghrBi0z_s0OVkzCfzejC21Jh3z8B7g5qig" alt="5GSM session state journey" width="489" height="372"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;5GSM (session) state journey for the single PDU session, UE side: Establishment Request/Accept are frames 19/26; the UE-requested release runs across frames 53–55.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now the same story, frame by frame.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 1 — Getting onto the cell (frames 1–3)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkMFqwzAMQH9F-NTRFApbKfRQWB3DLnMhXW6F4SVaZojtzJZ7Kf33KWlvmU6S0HsSuoomtCh2IBL-ZvQNltZ00bizB47BRLKNHYwnqNW81-nDvVmr1X7P1Q7eU_cM57xef22hqiSckPIA1WhPBAsp5VsBLqxKQ-bpDjPHdK0m-GUOL0EGT-jJBs-mFPo8pv9s3sxhGdzQIyEslqBfT8x3NlE0D9l01uMOHXgsXDCytJiUtQJeizGNwk951FrJD1WKAoTD6Ixt-XVXQT_opie2-G1yT-J2-wM9jGxf" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkMFqwzAMQH9F-NTRFApbKfRQWB3DLnMhXW6F4SVaZojtzJZ7Kf33KWlvmU6S0HsSuoomtCh2IBL-ZvQNltZ00bizB47BRLKNHYwnqNW81-nDvVmr1X7P1Q7eU_cM57xef22hqiSckPIA1WhPBAsp5VsBLqxKQ-bpDjPHdK0m-GUOL0EGT-jJBs-mFPo8pv9s3sxhGdzQIyEslqBfT8x3NlE0D9l01uMOHXgsXDCytJiUtQJeizGNwk951FrJD1WKAoTD6Ixt-XVXQT_opie2-G1yT-J2-wM9jGxf" alt="Phase 1 — RRC connection setup" width="705" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A 5G connection begins with the four-step random-access handshake. The first two steps — Msg1 (the UE's PRACH preamble) and Msg2 (the gNB's Random Access Response) — happen on the physical layer and aren't in this MAC-level capture. Our story opens at Msg3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 1 — RRC Setup Request (Msg3).&lt;/strong&gt; The UE has no RRC identity on this cell yet, so it speaks on the Common Control Channel (CCCH, uplink &lt;code&gt;LCID 52&lt;/code&gt;). It carries a 39-bit random value, &lt;code&gt;46c66e3536&lt;/code&gt;, for contention resolution and an establishment cause of &lt;code&gt;mo-Data&lt;/code&gt; — &lt;em&gt;mobile-originated data&lt;/em&gt;, i.e., "a user wants to get online." (The C-RNTI &lt;code&gt;0x4601&lt;/code&gt; you see tagged on every frame is the &lt;em&gt;temporary&lt;/em&gt; identity the gNB already handed out in the Random Access Response — the UE doesn't pick it here.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 2 — RRC Setup + Contention Resolution (Msg4).&lt;/strong&gt; The gNB answers on the CCCH (&lt;code&gt;LCID 0&lt;/code&gt;) and does two things in one frame:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A MAC UE Contention Resolution Identity control element echoes back the first 48 bits of the UE's Msg3 (its CCCH SDU). Seeing its own bytes reflected, the UE knows it won the random-access contest — rather than a different UE that picked the same preamble — and the temporary &lt;code&gt;0x4601&lt;/code&gt; granted in the RAR becomes its C-RNTI.&lt;/li&gt;
&lt;li&gt;The RRC payload installs SRB1 and the master cell-group configuration: SRB1 runs RLC-AM with &lt;code&gt;t-PollRetransmit = 45 ms&lt;/code&gt;, along with the buffer-status and power-headroom reporting rules the UE will follow from now on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On receiving this, the UE enters &lt;code&gt;RRC_CONNECTED&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 3 — RRC Setup Complete (Msg5).&lt;/strong&gt; The UE confirms, now speaking on SRB1 (&lt;code&gt;LCID 1&lt;/code&gt;, RLC-AM SN 0). Crucially, it piggybacks its first NAS message to the core inside the RRC container: a Registration Request. This is the hinge of the whole trace — from here, the &lt;em&gt;radio&lt;/em&gt; conversation (RRC) and the &lt;em&gt;core-network&lt;/em&gt; conversation (NAS) proceed in parallel, with every NAS message tunneled inside an RRC envelope.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 2 — Security and registration (frames 4–18)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVkTFPwzAQhf_KyRNIqQgsSB0qpUmGijZCCd4qIeNcUovaDvYFCVX971wbxFBgwNPp-fl757uD0L5FMQcR8W1Ep7Ewqg_Kbh3wGVQgo82gHIEsf2p9tZxELmaLhSzn0KAeg6EP2DAYcm-tci1cVWWWAr_aYYAbqFbZHRhH2J-s1xNDloxg0C-MYY-El0nFGlau88EqMt7BU1Audozfjmn6cg819iZSmC4zrXGgyxz5D8JfXeTedaYfv1xyaBV9f3vyVp4V_85cWSbn3Hqdz7INBKRTojUUYXRKv2ILj4WMCWT5w3NT8YR0QBUxAqObenkrEhAWuV_T8s4OgnZoz9trsVPjnsTx-AnfgJi1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNqVkTFPwzAQhf_KyRNIqQgsSB0qpUmGijZCCd4qIeNcUovaDvYFCVX971wbxFBgwNPp-fl757uD0L5FMQcR8W1Ep7Ewqg_Kbh3wGVQgo82gHIEsf2p9tZxELmaLhSzn0KAeg6EP2DAYcm-tci1cVWWWAr_aYYAbqFbZHRhH2J-s1xNDloxg0C-MYY-El0nFGlau88EqMt7BU1Audozfjmn6cg819iZSmC4zrXGgyxz5D8JfXeTedaYfv1xyaBV9f3vyVp4V_85cWSbn3Hqdz7INBKRTojUUYXRKv2ILj4WMCWT5w3NT8YR0QBUxAqObenkrEhAWuV_T8s4OgnZoz9trsVPjnsTx-AnfgJi1" alt="Phase 2 — Security and registration" width="692" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 5 — Security Mode Command.&lt;/strong&gt; The gNB switches on Access-Stratum security: cipher &lt;code&gt;NEA0&lt;/code&gt; (null) and integrity &lt;code&gt;NIA2&lt;/code&gt; (AES-CMAC). From the next uplink message onward, traffic is integrity-protected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 6 — Security Mode Complete.&lt;/strong&gt; The UE confirms under the new keys. Security is now mutually active.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frames 8–9 — Registration Accept / Complete.&lt;/strong&gt; These arrive as DL/UL Information Transfer — RRC messages whose only job is to carry a NAS payload. The Registration Accept (frame 8) is the AMF's acknowledgment of UE's admission to the network; the Registration Complete (frame 9) is the UE's acknowledgment. The 5GMM registration procedure is now finished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frames 11–16 — Configuration Update Command (and a first taste of ARQ).&lt;/strong&gt; The core pushes a Configuration Update Command (updated UE configuration — allowed network slices, network name, time, etc.). Here's a subtle point worth internalizing: frames 11, 12, 13, and 16 carry identical NAS bytes. They are not four different commands — they are RLC retransmissions of a single PDU whose acknowledgment the gNB hasn't yet seen. Frame 14 is likewise a retransmission of the UE's Registration Complete. This is RLC-AM doing exactly what it's built to do, and it's a gentle rehearsal for the much larger retransmission event in Phase 6.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ARQ heartbeat.&lt;/strong&gt; Threaded through this phase are RLC Status PDUs (frames 4, 7, 10, 15, 17). Each reports a cumulative &lt;code&gt;ACK_SN&lt;/code&gt; on Bearer 1 (SRB1), and you can watch it increase in lockstep with the conversation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frame&lt;/th&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;&lt;code&gt;ACK_SN&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Confirms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;gNB → UE&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;RRC Setup Complete (SN 0) received&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;gNB → UE&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Security Mode Complete (SN 1) received&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;gNB → UE&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Registration Complete (SN 2) received&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;UE → gNB&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UE confirming the gNB's downlink&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note frame 17 flows the &lt;em&gt;other&lt;/em&gt; way: ARQ runs independently in each direction on the same bearer. One caveat these ACKs share: they confirm radio-link delivery to the gNB, not that the &lt;em&gt;core&lt;/em&gt; has processed the message — that's a separate, invisible hop we can't see from a UE-side radio trace.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 3 — Opening a data session (frames 19–31)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkUFrwkAQhf_KsCellkppKXgQNAlFaIMk5OZlkow6sNmNuxtFxP_e0bQHtXvb4b33vWFOqrI1qQkoT7uOTEUx48ZhszIgr0UXuOIWTYAieZxt0nk_LJLn6VR-E1jGBeTkPVsDiQ9YavbbhkScXQg-wCCd5fD-mX8Pe6_YxFwkE0mBCFssWXM4QmJ2HbvjPeBWtDBr6xoMF9xgaQ_kINLoPbxCiab2D4wsi6RJZc2aN537NT7d1J5VFbUBVt14XH5A2bGuPcTZHF5gTugE8Ta8b_VfbGSbVlOgXpvaQGD34i6S0dUTY0BwWLOFss8d_OUL6itaxAICYw-geU9qBKoh2ZVruddJhS0118vVtMZOB3U-_wACwZMm" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkUFrwkAQhf_KsCellkppKXgQNAlFaIMk5OZlkow6sNmNuxtFxP_e0bQHtXvb4b33vWFOqrI1qQkoT7uOTEUx48ZhszIgr0UXuOIWTYAieZxt0nk_LJLn6VR-E1jGBeTkPVsDiQ9YavbbhkScXQg-wCCd5fD-mX8Pe6_YxFwkE0mBCFssWXM4QmJ2HbvjPeBWtDBr6xoMF9xgaQ_kINLoPbxCiab2D4wsi6RJZc2aN537NT7d1J5VFbUBVt14XH5A2bGuPcTZHF5gTugE8Ta8b_VfbGSbVlOgXpvaQGD34i6S0dUTY0BwWLOFss8d_OUL6itaxAICYw-geU9qBKoh2ZVruddJhS0118vVtMZOB3U-_wACwZMm" alt="Phase 3 — Opening a data session" width="776" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything so far was signaling. Now the UE asks for an actual data path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 19 — PDU Session Establishment Request.&lt;/strong&gt; A NAS 5GSM message (wrapped in UL NAS Transport) asking, via the AMF, for the SMF to set up an IP session. This request is what will cause a Data Radio Bearer to be built — watch for its &lt;em&gt;Accept&lt;/em&gt; in frame 26.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frames 21–24 — UE Capability exchange.&lt;/strong&gt; Before configuring the DRB, the gNB asks what the UE supports (UE Capability Enquiry, frame 21) and the UE answers (UE Capability Information, frame 24) with its bands, MIMO layers, modulation, and — notably — Power Class 2 (&lt;code&gt;pc2&lt;/code&gt;) on the applicable bands (nominally 26 dBm in FR1, per band/band-combination — not a blanket device rating). File that away for the next frame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 26 — RRC Reconfiguration: the session is accepted, and the DRB is born.&lt;/strong&gt; The pivotal frame of the phase, doing double duty. Tucked inside the RRC message is a NAS PDU Session Establishment Accept — the SMF's "yes" to the frame-19 request — and the radio config that maps PDU Session 1's default QoS flow (&lt;code&gt;QFI 1&lt;/code&gt;) onto a brand-new DRB (&lt;code&gt;drb-Identity 1&lt;/code&gt;, carried on &lt;code&gt;LCID 4&lt;/code&gt; — the dissector's "Bearer 4"):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;default DRB, no SDAP header,&lt;/li&gt;
&lt;li&gt;PDCP 12-bit SN in both directions, ROHC off,&lt;/li&gt;
&lt;li&gt;RLC-AM with &lt;code&gt;t-PollRetransmit = 50 ms&lt;/code&gt;, &lt;code&gt;pollPDU = 16&lt;/code&gt;, &lt;code&gt;pollByte = 6500 kB&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p-NR-FR1 = 10 dBm&lt;/code&gt; — the configured maximum uplink power on FR1 (the same cap was already present back in the frame-2 cell-group config).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last value is worth a raised eyebrow: &lt;code&gt;10 dBm&lt;/code&gt; is well below the UE's advertised PC2 capability — a lot of uplink headroom the network is choosing not to use. The trace doesn't say &lt;em&gt;why&lt;/em&gt; (a lab rig is the likely reason), but on a real network it's exactly the setting to check first if you were chasing an uplink-coverage or throughput complaint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 30 — RRC Reconfiguration Complete.&lt;/strong&gt; The UE applies the new config. The data radio bearer is now live.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 4 — Moving user data (frames 32–52)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNp1kd1Kw0AQRl9l2KsUGkjAKgQstE29UUOp5K4g02RMFpLduDsRpPTdnfyIgjh3-7HnzLfsRRW2JJWA8vTekyko1Vg5bE8GZDp0rAvdoWHI93-zKttOYWaZwH6Qk2tLSRNIj1sItoROspsFnPooOt_B8WkXbp6_T4d0dxDfZ2Ox9CDOmhyVk7GxtoMUGeHcO89-ObDwkkEUxisIvG0JPFUtGaZyMTHD5PtwvR4bzLtGxyHNIehs08BZs3AM1sDg-EUKJGi-T6ZNjNz7EZzbbnaPr7Jfm8IRevIQGAuZpH6WkJm7_5getMHmf9c9xLcQoNTi2tm-qocHxquFWoJqybWoS_mbi-Ka2vGXSnrDvmF1vX4BQZaFVA" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNp1kd1Kw0AQRl9l2KsUGkjAKgQstE29UUOp5K4g02RMFpLduDsRpPTdnfyIgjh3-7HnzLfsRRW2JJWA8vTekyko1Vg5bE8GZDp0rAvdoWHI93-zKttOYWaZwH6Qk2tLSRNIj1sItoROspsFnPooOt_B8WkXbp6_T4d0dxDfZ2Ox9CDOmhyVk7GxtoMUGeHcO89-ObDwkkEUxisIvG0JPFUtGaZyMTHD5PtwvR4bzLtGxyHNIehs08BZs3AM1sDg-EUKJGi-T6ZNjNz7EZzbbnaPr7Jfm8IRevIQGAuZpH6WkJm7_5getMHmf9c9xLcQoNTi2tm-qocHxquFWoJqybWoS_mbi-Ka2vGXSnrDvmF1vX4BQZaFVA" alt="Phase 4 — Moving user data" width="667" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the DRB up, user traffic flows as RLC-AM Data PDUs on Bearer 4. The PDCP payloads are ciphered (opaque to us), but the RLC framing tells the whole delivery story. Two fields carry the plot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SI (Segmentation Info)&lt;/strong&gt; — is this PDU a whole SDU, or a &lt;em&gt;first/middle/last&lt;/em&gt; segment? Large packets get split and reassembled using a Segment Offset (SO).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The poll bit&lt;/strong&gt; — when set, it demands an immediate Status PDU from the receiver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transfer runs cleanly: SNs 0 through 15, several of them segmented (e.g. SN 2 reassembled from 2 fragments at &lt;code&gt;SO = 394&lt;/code&gt;; SN 9 and SN 12 similar), each poll promptly answered by a gNB Status PDU. The DRB's &lt;code&gt;ACK_SN&lt;/code&gt; increases 3 → 6 → 9 → 10 → 12 → 14 → 16, and — importantly — not a single NACK appears anywhere. This is what healthy user-plane delivery looks like.&lt;/p&gt;

&lt;p&gt;You'll also spot ~1–2 second gaps between some bursts: the traffic is bursty, not a saturating stream, and in the quiet moments the UE reports empty buffers via Long BSR (all Logical Channel Groups "Not Present").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 52 — the last data ACK.&lt;/strong&gt; &lt;code&gt;ACK_SN = 16&lt;/code&gt; acknowledges everything through SN 15. The DRB has done its job; the conversation now returns to SRB1 to shut everything down.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 5 — Tearing it down (frames 53–57)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkEFrwzAMhf-K8GUdbNBbR2CFNslpJYwE3wpDi1XPEDutLe8S8t8nksNgnS6SHtL34E2qHw2pAlSiW6bQU-XQRvTnAFJXjOx6d8XAoOt7zTbHVdT1834vWwHvlYaOUnJjgJYGwkTShZ0YNi3ZPGAEQ9iz-0aWq8eVIM-C0PX_hHL0HoP5a1ZRJOsSx4X066PrhwQDyugFhJbuTNpTCR0j57T4nfN2-7mDQ_n20TXwCi_qCZSn6NEZSWdS_EV-ycnQBfPAap5_AAtPZYM" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNptkEFrwzAMhf-K8GUdbNBbR2CFNslpJYwE3wpDi1XPEDutLe8S8t8nksNgnS6SHtL34E2qHw2pAlSiW6bQU-XQRvTnAFJXjOx6d8XAoOt7zTbHVdT1834vWwHvlYaOUnJjgJYGwkTShZ0YNi3ZPGAEQ9iz-0aWq8eVIM-C0PX_hHL0HoP5a1ZRJOsSx4X066PrhwQDyugFhJbuTNpTCR0j57T4nfN2-7mDQ_n20TXwCi_qCZSn6NEZSWdS_EV-ycnQBfPAap5_AAtPZYM" alt="Phase 5 — Teardown and detach" width="662" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A graceful teardown, in three NAS messages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frame 53 — PDU Session Release Request&lt;/strong&gt; (UE → core), cause Regular deactivation. The UE asks to close the data session it opened in Phase 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frame 55 — PDU Session Release Command&lt;/strong&gt; (core → UE), same cause. The network confirms; the DRB from frame 26 is gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frame 56 — Deregistration Request&lt;/strong&gt; (UE-originating). The UE detaches from the network entirely.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the most important frame to remember. Frame 56 is the last message the UE ever sends. Frame 57 is the gNB's own RLC Status PDU (&lt;code&gt;ACK_SN = 8&lt;/code&gt;), sent &lt;em&gt;down&lt;/em&gt; to acknowledge that the Deregistration Request arrived over the air. It's the last exchange with a UE that's about to go silent — everything after this point is the network talking to a device that has already left.&lt;/p&gt;
&lt;h2&gt;
  
  
  Phase 6 — The release, and the retransmission storm (frames 58–69)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNp1kcFqwzAQRH9l8CkFG-ziJiWHQOvk0ENNcOpbLoq1cQS25ErrkhDSb68cN7RQqou0g_bNDnsOKiMpmCNw9N6TrmipRG1Fu9XwpxOWVaU6oRnl6q9W58-j6B_RYlGu5iiKDAU1JBxh28fxbob1Mltjk2Ma4vUpi14QH0lUu8eH2SxEZ5oGO8VwxCMrN0ywqj4wzB4Ds1xBNJaEPEGSpVo59pf0_Ps4SaENoxk0rXQNo5FFRf422KTTOBmhjTEdkuQI-iB7wmc6Resw4Wjt_QtiK7RrFd-Nv_-PNLHEx1sw2Xc_4b5bSctfMYx38-OHHjb3CjYsuHe-qbwOAk_rrXa3JJXofE0DxAUhgpZsK5T0-zkHfKD2uilJe9E3HFwuX37xizM" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmermaid.ink%2Fimg%2Fpako%3AeNp1kcFqwzAQRH9l8CkFG-ziJiWHQOvk0ENNcOpbLoq1cQS25ErrkhDSb68cN7RQqou0g_bNDnsOKiMpmCNw9N6TrmipRG1Fu9XwpxOWVaU6oRnl6q9W58-j6B_RYlGu5iiKDAU1JBxh28fxbob1Mltjk2Ma4vUpi14QH0lUu8eH2SxEZ5oGO8VwxCMrN0ywqj4wzB4Ds1xBNJaEPEGSpVo59pf0_Ps4SaENoxk0rXQNo5FFRf422KTTOBmhjTEdkuQI-iB7wmc6Resw4Wjt_QtiK7RrFd-Nv_-PNLHEx1sw2Xc_4b5bSctfMYx38-OHHjb3CjYsuHe-qbwOAk_rrXa3JJXofE0DxAUhgpZsK5T0-zkHfKD2uilJe9E3HFwuX37xizM" alt="Phase 6 — Release and retransmission storm" width="707" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frame 58 — RRC Release (the real one).&lt;/strong&gt; The gNB sends a command to return the UE to &lt;code&gt;RRC_IDLE&lt;/code&gt; (there's no &lt;code&gt;suspendConfig&lt;/code&gt;, so it's IDLE, not INACTIVE). It travels on SRB1 as PDCP &lt;code&gt;SN = 6&lt;/code&gt;, &lt;code&gt;COUNT = 6&lt;/code&gt;, with integrity tag &lt;code&gt;MAC-I = 0xeacb8577&lt;/code&gt;, and — critically — the RLC poll bit is set, so the gNB expects a Status PDU confirming delivery.&lt;/p&gt;

&lt;p&gt;That Status PDU will never come. The UE deregistered in frame 56 and is no longer listening on &lt;code&gt;0x4601&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frames 59–69 — the same release, eleven more times.&lt;/strong&gt; Wireshark flags each of these as &lt;code&gt;RLC retx (dup PDCP SN 6)&lt;/code&gt;. They are not new releases — they are byte-for-byte retransmissions of frame 58's PDU (identical PDCP SN 6, identical &lt;code&gt;MAC-I 0xeacb8577&lt;/code&gt;), fired because &lt;code&gt;t-PollRetransmit&lt;/code&gt; keeps expiring with no ACK. Check the timestamps, and you'll see them spaced &lt;code&gt;~46 ms&lt;/code&gt; apart — precisely the poll-retransmit timer from the bearer configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frame 58   RRC Release            PDCP SN=6   &amp;lt;- genuine
Frame 59   RRC Release (retx 1)   PDCP SN=6   dup
Frame 60   RRC Release (retx 2)   PDCP SN=6   dup
   ...          ...                  ...
Frame 69   RRC Release (retx 11)  PDCP SN=6   dup   &amp;lt;- capture ends
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to read it:&lt;/strong&gt; almost certainly harmless. The UE sent a &lt;em&gt;switch-off&lt;/em&gt; deregistration in frame 56, so it has gone — and RLC-AM did exactly what it's designed to do: retransmit a polled, unacknowledged PDU until the ACK arrives or &lt;code&gt;maxRetxThreshold&lt;/code&gt; (here &lt;code&gt;t8&lt;/code&gt;) is reached. Strictly, a gNB-side radio trace can't &lt;em&gt;prove&lt;/em&gt; the UE received nothing — only an NGAP or UE-side trace could — but the switch-off makes an absent UE the obvious cause. The signature that it's one message, not twelve, is that every copy carries the same PDCP SN and the same MAC-I.&lt;/p&gt;

&lt;p&gt;The diagnostic lesson is about &lt;em&gt;context&lt;/em&gt;. Twelve identical RRC Releases right after a deregistration are the expected tail of a normal shutdown. The very same pattern appearing mid-session on a UE you believe is still connected means something quite different — a UE that has dropped off the radio or a broken downlink — and is worth investigating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A connection has a sequence.&lt;/strong&gt; Setup → security → registration → session → data → teardown → release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signaling and data live on separate bearers.&lt;/strong&gt; SRB1 ("Bearer 1") carried every control message; the DRB ("Bearer 4") carried user data and didn't even exist until frame 26.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAS rides inside RRC.&lt;/strong&gt; Registration, PDU sessions, and deregistration are core-network procedures that are tunneled transparently via RRC DL/UL Information Transfer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RLC-AM is the reliability workhorse.&lt;/strong&gt; Cumulative &lt;code&gt;ACK_SN&lt;/code&gt;, poll bits, and timer-driven retransmissions are normal. Duplicate SNs mean retransmission, not new messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context decides the diagnosis.&lt;/strong&gt; The final retransmission storm is almost certainly harmless &lt;em&gt;because&lt;/em&gt; it follows a switch-off deregistration. The same packets in a different place would be a red flag.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it on your own capture
&lt;/h2&gt;

&lt;p&gt;Every arrow in this walkthrough was decoded and captioned by &lt;a href="https://www.eventhelix.com/visualether/" rel="noopener noreferrer"&gt;VisualEther&lt;/a&gt; from a raw Wireshark PCAP — no manual diagramming. Point it at your own 5G, LTE, or IMS trace and read it the same way. The &lt;a href="https://www.eventhelix.com/5G/nr-connection-lifecycle/" rel="noopener noreferrer"&gt;full interactive walkthrough&lt;/a&gt; is on eventhelix.com.&lt;/p&gt;

</description>
      <category>5g</category>
      <category>wireshark</category>
      <category>telecom</category>
      <category>networking</category>
    </item>
    <item>
      <title>Turn Wireshark PCAPs into sequence diagrams — and let an AI read them</title>
      <dc:creator>Sandeep Ahluwalia</dc:creator>
      <pubDate>Tue, 14 Jul 2026 13:40:00 +0000</pubDate>
      <link>https://dev.to/eventhelix/turn-wireshark-pcaps-into-sequence-diagrams-and-let-an-ai-read-thempublished-290k</link>
      <guid>https://dev.to/eventhelix/turn-wireshark-pcaps-into-sequence-diagrams-and-let-an-ai-read-thempublished-290k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbql2ldm985tg6yno94ji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbql2ldm985tg6yno94ji.png" alt="VisualEther diagram (left) + Claude Code cross-layer analysis (right) of moto_edge_30_pro.pcap." width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For years I built satellite networks with an LTE air interface. Every time I opened a capture in Wireshark, I did the same thing: scroll thousands of packets across MAC, RLC, PDCP, RRC, and S1AP — then redraw the call flow on a whiteboard so the rest of the team could follow it.&lt;/p&gt;

&lt;p&gt;Wireshark is unbeatable at showing you every packet. But it shows you a flat list, not the &lt;em&gt;conversation&lt;/em&gt; — who said what to whom, in what order. That sequence diagram lives in your head, and you rebuild it by hand every time.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;VisualEther&lt;/strong&gt; to draw the conversation straight from the capture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo22plogrxjgqwvfgt3nj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo22plogrxjgqwvfgt3nj.png" alt="A Wireshark capture rendered as a sequence diagram" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;VisualEther reads a PCAP/PCAPNG and renders it as a readable sequence diagram. It's built on &lt;code&gt;tshark&lt;/code&gt;, so anything Wireshark can dissect, it can diagram — 5G, LTE, IMS, SIP, BGP, and dozens of other protocols out of the box. Extraction is driven by an XML "field extraction template" (FXT) that maps protocol fields to messages and sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI part: the context-budget problem
&lt;/h2&gt;

&lt;p&gt;Here's the wall I hit when I tried feeding captures to an LLM directly: a PCAP blows the context window before you finish pasting. Thousands of packets, dozens of fields per layer — megabytes of noise, and the model drowns.&lt;/p&gt;

&lt;p&gt;So VisualEther ships an &lt;strong&gt;MCP server&lt;/strong&gt;. Instead of raw packets, it extracts only the messages and fields that matter, so the agent reads &lt;em&gt;kilobytes&lt;/em&gt; of structured data, not megabytes of logs. It then runs an author → debug → verify loop and cites &lt;strong&gt;frame numbers&lt;/strong&gt; as evidence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fovp953blirz0n8614o8l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fovp953blirz0n8614o8l.png" alt="Ask an AI agent why a session failed; it answers in plain English, citing frame numbers" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;One worked case: an R16 gNB capture with the 5G user plane encrypted. With Claude Code driving the MCP server, VisualEther decrypted the PDCP (NEA2) down to the SIP REGISTER, then rebuilt the uplink BSR→grant→SDAP scheduling loop from PUSCH occupancy alone — because the grants were never in the capture. Every claim is anchored to a specific frame number. &lt;a href="https://www.eventhelix.com/visualether/case-studies/5g-nr-r16-mdt-mac-pdcp-decryption-scheduling-harq-ipsec-esp-analysis.html" rel="noopener noreferrer"&gt;Full walk-through.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Triage and CI
&lt;/h2&gt;

&lt;p&gt;Beyond a single diagram, the browser-based Session Navigator groups every session in a capture by outcome — pass, fail, late, timeout — so broken flows surface first. And because it emits machine-readable output (NDJSON / Markdown / HTML), you can wire it into CI to generate a diagram for every capture, unattended.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjlz72j7s0iuc3qn49cp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjlz72j7s0iuc3qn49cp.png" alt="The Session Navigator groups sessions by outcome" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;VisualEther is a commercial tool with a free tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Community&lt;/strong&gt; (free, no license): PDF sequence diagrams, up to 10 pages / 10 entities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional / Server&lt;/strong&gt; (45-day trial): MCP/AI analysis, session triage, larger diagrams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Runs on Windows, Linux, and macOS (Apple Silicon), installable via winget / Homebrew / apt / dnf. Needs tshark 4.6+.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free download: &lt;a href="https://www.eventhelix.com/visualether/download" rel="noopener noreferrer"&gt;https://www.eventhelix.com/visualether/download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live, interactive output (no install): &lt;a href="https://diagrams.eventhelix.com/visualether/5g-nr-radio/" rel="noopener noreferrer"&gt;https://diagrams.eventhelix.com/visualether/5g-nr-radio/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love feedback from anyone who lives in Wireshark — especially on the FXT format and the MCP tool design. Ask me anything.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>networking</category>
      <category>ai</category>
      <category>wireshark</category>
    </item>
  </channel>
</rss>
