General
The SIP PRACK Reliability Trap: Why RFC 3262 Early Media Acknowledgments Deadlock Enterprise Trunks
calricon / field note
Enterprise telecom teams enable RFC 3262 PRACK to guarantee early media delivery, only to watch inbound calls drop after 32 seconds of ringing. When carriers and internal softphones mishandle RSeq sequence counters and provisional SDP offers, unacknowledged PRACK transactions deadlock the trunk.
The SIP PRACK Reliability Trap: Why RFC 3262 Early Media Acknowledgments Deadlock Enterprise Trunks
The short answer: In enterprise telephony and Contact Center as a Service (CCaaS) platforms, Session Initiation Protocol (SIP) provisional responses—such as 180 Ringing and 183 Session Progress—inform the caller that their call is routing and establish early media (ringback tones, IVR announcements, or queue music). Because baseline RFC 3261 transmits provisional responses unreliably over UDP with zero retransmission guarantees, telecom engineers mandate RFC 3262 Reliability of Provisional Responses (PRACK / 100rel) across carrier SIP trunks. In production, this creates an insidious failure mode: the 32-second Ringing Deadlock. When upstream PSTN carriers, cloud Session Border Controllers (SBCs), and downstream WebRTC softphones negotiate Require: 100rel asymmetrically, out-of-order RSeq sequence numbers, overlapping provisional SDP renegotiations, or unacknowledged PRACK transactions stall the signaling engine. The carrier's Timer B or Timer H expires after 32 seconds of dead ringing, abruptly terminating the call with 408 Request Timeout or 504 Server Timeout while packet captures falsely show both endpoints as reachable.
"When an inbound call rings for exactly thirty-two seconds and then drops into dead silence, your network engineers usually blame carrier routing or UDP packet loss. In reality, your SBC is locked in a PRACK glare—choking on an out-of-sequence RSeq number while the carrier's retransmission timer quietly runs out the clock."
1. The Mechanical Reality of RFC 3262: Why PRACK Exists
Under standard RFC 3261 SIP signaling over UDP, only final responses (2xx, 4xx, 5xx, 6xx) are acknowledged via ACK. Provisional 1xx responses are fire-and-forget: if a 183 Session Progress containing an early media Session Description Protocol (SDP) answer is dropped by intermediate routers, the caller hears dead silence instead of a ringback tone.
To guarantee delivery of critical early media parameters (e.g., custom ringback tones or regulatory pre-call announcements), the IETF introduced RFC 3262:
- The caller advertises support in the initial
INVITE:Supported: 100rel. - The callee requires reliability in its provisional response:
183 Session ProgresswithRequire: 100reland a unique sequence header:RSeq: 1001. - The caller must immediately acknowledge this specific provisional response by sending a PRACK (Provisional Response Acknowledgement) request matching the
RSeqandCSeq. - The callee responds to the PRACK with a standard
200 OK.
Once this handshake completes, early media is formally pinned, and the dialog can transition to a final 200 OK (INVITE) when an agent answers. The crisis emerges when intermediate proxies attempt to bridge disparate signaling topologies.
2. The 4 Fatal Traps of Production PRACK Deployments
A. The RSeq Sequence Number Desynchronization
RFC 3262 mandates that within a single SIP dialog, every reliable provisional response must increment its RSeq sequence number monotonically: RSeq: 1001, RSeq: 1002, etc. Furthermore, the receiving endpoint must not acknowledge a provisional response until all preceding reliable provisional responses have been received and acknowledged.
In multi-carrier enterprise architectures, modern contact centers frequently fork calls or receive multiple early media streams (e.g., a carrier sends a 183 Session Progress with local ringback, followed 200ms later by a 180 Ringing when the remote PBX starts alerting). If intermediate load-balanced SBC proxies forward these responses out of order, or if the client drops one packet, the client receives RSeq: 1002 while waiting for 1001. The client drops the out-of-sequence response. The carrier retransmits 1001 at exponential backoffs, but because the client's internal transaction state is wedged, PRACK is never generated. The call times out and dies.
B. The PRACK / UPDATE Glare Collision
When early media requires dynamic codec renegotiation (for example, switching from G.711u to G.729 or negotiating DTMF telephone-event payloads), endpoints frequently send a mid-dialog UPDATE request. RFC 3262 strictly forbids having more than one unacknowledged offer/answer exchange active in the same dialog.
If an enterprise SBC forwards a PRACK containing an SDP answer at the exact millisecond the carrier trunk sends an in-dialog UPDATE with a revised SDP offer, the transaction enters SDP Glare. Both sides reject the conflicting request with 491 Request Pending or 500 Server Internal Error. The early media path is destroyed, leaving the caller in acoustic dead air until they hang up in frustration.
C. The 32-Second Timer B/H Cliff
Why do these failures almost always occur at exactly 32 seconds? Because in SIP protocol state machines, RFC 3261 defines Timer B and Timer H as 64 * T1 (where T1 is the base round-trip estimate, typically 500ms):
64 * 500ms = 32,000ms (32 Seconds)
When an endpoint sends a reliable provisional response (Require: 100rel), it starts a retransmission timer. If no matching PRACK is received within 32 seconds, the signaling engine assumes the network is partitioned. The SBC immediately terminates the call by issuing an internal cancel or transmitting a 504 Server Time-out back to the PSTN gateway.
D. The Asymmetric "Require" vs. "Supported" Chasm
Many Tier-1 telecommunications carriers (such as Lumen, Verizon, AT&T, and British Telecom) mandate Require: 100rel on all inbound SIP trunks for regulatory and billing compliance. However, internal enterprise endpoints—specifically modern WebRTC softphones (browser-based agent desktops) or legacy internal SIP handsets—frequently do not implement RFC 3262, or only declare Supported: 100rel without handling inbound RSeq parsing.
If an enterprise SBC simply passes through carrier SIP headers without acting as a true Back-to-Back User Agent (B2BUA), the internal softphone ignores the RSeq header and never sends a PRACK. The carrier terminates the call at the 32-second mark, and telecom teams spend months fruitlessly troubleshooting firewall NAT settings.
3. Architecture Comparison: Early Media Reliability Strategies
| Signaling Pattern | Early Media Guarantee | SDP Glare Risk | Interoperability Stability | Production Verdict |
|---|---|---|---|---|
| End-to-End PRACK Pass-Through | Fragile (Depends on weakest endpoint) | High (RSeq desync across hops) | Severe failure on WebRTC softphones | Dangerous anti-pattern for hybrid CCaaS |
| Unreliable 183 (No 100rel) | Unreliable (Lost UDP packets = dead air) | Zero (No PRACK transactions) | Universal (Supported by all legacy PBX) | Incompatible with strict Tier-1 carrier trunks |
| B2BUA PRACK Termination (SBC Shield) | 100% Guaranteed on Ingress Leg | Zero (Decoupled transaction domains) | Optimal (Translates to standard 180 internally) | Gold Standard for Enterprise SIP Trunks |
| Early Offer Normalization | High (Media pinned in initial INVITE) | Low (Eliminates provisional SDP churn) | High | Mandatory hygiene for all enterprise trunks |
4. The Calricon Production Runbook: Bulletproofing SIP Trunks Against PRACK Deadlocks
1. Terminate 100rel Locally at the SBC Boundary (The B2BUA Shield)
Never permit RFC 3262 transactions to bridge end-to-end between your external PSTN carrier and internal agent desktops. Configure your Session Border Controller (AudioCodes, Ribbon, Oracle Acme Packet, or OpenSIPS/Kamailio) to operate as a strict Back-to-Back User Agent:
# OpenSIPS / Kamailio B2BUA Logic
# Absorb 100rel on carrier leg; strip from internal agent leg
if (has_header("Require") && $hdr(Require) =~ "100rel") {
# Terminate PRACK locally on the ingress carrier leg
b2b_enable_prack_handling();
# Strip 100rel requirement before routing to internal agent softphones
remove_hf("Require");
append_hf("Supported: timer\r\n");
}
When the carrier sends 183 Session Progress with Require: 100rel, the SBC generates the PRACK response itself in under 5 milliseconds. The carrier receives instant reliability, while the internal agent leg receives a clean, standard 180 Ringing without complex RSeq dependencies.
2. Enforce Early Offer on Outbound Trunks
Eliminate mid-dialog provisional SDP negotiation entirely by mandating Early Offer. Ensure that the initial INVITE leaving your platform always contains the complete local SDP payload (codecs, IP, port, ptime). This eliminates the need for carrier gateways to send offerless provisional responses or renegotiate media prior to final call pickup.
3. Implement Strict Provisional Response Filtering
Configure your SBC signaling profile to suppress redundant provisional responses. If an ingress carrier trunk has already received a 183 Session Progress with early media, suppress subsequent downstream 180 Ringing packets unless there is a material change in media endpoints. This prevents RSeq counter inflation and eliminates the race conditions that trigger 491 Glare errors.
Strategic Verdict for Enterprise Telecom Leaders & Solutions Architects
Reliability extensions in telecommunications protocols are designed to solve transient packet loss, but when implemented across uncoordinated heterogeneous networks, they become vectors for catastrophic deadlocks. The 32-second call drop is the hallmark of a broken PRACK transaction. Stop treating your Session Border Controller as a dumb SIP router. Isolate your carrier trunks, terminate 100rel reliability locally at your network perimeter, enforce Early Offer SDP across all interfaces, and ensure your enterprise voice calls connect cleanly on the very first ring.