v151 · origin trial · webrtc · data channel
WebRTC Data Channel: SCTP Negotiation Acceleration Protocol
An SDP-level acceleration for WebRTC data channels — the SCTP Negotiation Acceleration Protocol (SNAP) carries a base64-encoded SCTP INIT chunk in a new a=sctp-init media-level attribute inside the SDP offer/answer exchange, so the SCTP association is considered established as soon as the DTLS handshake finishes. Skipping the SCTP four-way handshake reduces the time to open a data channel by up to two network round-trip times.
SNAP is in origin trial on desktop in Chrome 151–156 (the Intent to Experiment records “Origin trial desktop first 151, last 156”, LGTM’d for M151–M156 inclusive). To use it:
- Register your origin at developer.chrome.com/origintrials (search “WebRTC Data Channel: SCTP Negotiation Acceleration Protocol”) and serve the token, e.g.
<meta http-equiv="origin-trial" content="YOUR_TOKEN">. - There is no
about://flagsentry (“No information provided” per the intent); the recorded Finch feature name isWebRtcSctpSnap. - The stated goal of the experiment is to keep the feature gated “until the IETF has had a chance to adopt the current draft into a WG and we know whether changes will be required” — as of 2026-07-28 the draft is an expired, unadopted individual Internet-Draft (see the specifications section), so the wire format may still change.
at a glance
| What it is | A new SDP media-level attribute, a=sctp-init:<base64>, that embeds the sender’s SCTP INIT chunk in SDP so the SCTP four-way handshake can be skipped once DTLS is up |
|---|---|
| JS API change | None — no new interfaces, methods, or properties. The change is entirely at the SDP/SCTP layer; RTCPeerConnection.createDataChannel() and RTCDataChannel semantics (including negotiated) are unchanged |
| Observable effect | The offer/answer SDP for a data m= section carries a=sctp-init (inspectable via pc.localDescription.sdp); data channels reach open up to two RTTs sooner; a peer that does not support the extension simply omits the attribute in its answer and the classic handshake runs |
| Chrome status | Origin trial, desktop 151–156 (milestone listing: “Origin trial”, verified 2026-07-28); the intent states the feature is supported on all six Blink platforms |
| Specification | draft-hancke-tsvwg-snap — individual Internet-Draft, expired 2026-07-03 (datatracker: “Expired Internet-Draft (individual)”), not adopted by a working group at fetch time |
| Runtime gating | Origin-trial token (no about://flags entry per the intent); Finch feature name WebRtcSctpSnap; usage measured via UMA WebRTC.PeerConnection.NegotiatedSctpSnap |
| Tracking bug | issues.webrtc.org #426480601 — “accelerate data channel setup with SNAP” |
| ChromeStatus | 5137946677215232 — WebRTC Data Channel: SCTP Negotiation Acceleration Protocol |
why it exists
WebRTC data channels run SCTP (RFC 9260) encapsulated in DTLS (RFC 8261), per the data-channel framework in RFC 8831. SCTP establishes associations with a four-way handshake (INIT / INIT ACK / COOKIE ECHO / COOKIE ACK) whose purpose is protection against half-open (SYN-flood) attacks. In WebRTC that protection is redundant: the DTLS layer underneath already provides a secure, encrypted channel that prevents half-open attacks — but the handshake still costs up to two round trips before the first DCEP open message can flow:
classic (draft §1) with SNAP (draft §1)
───────────── ─────────
SDP Offer ----------------> SDP Offer (sctp-init) --->
<--1-- SDP Answer -------- <--1-- SDP Answer (sctp-init)
<--2-- ICE checks -------- <--2-- ICE checks --------
DTLS handshake (3,4) -----> DTLS handshake (3,4) ----->
SCTP INIT ----------------> DCEP (Open Channel) --->
<--5-- SCTP INIT ACK ------ <----- DCEP ACK ----------
SCTP COOKIE ECHO -------->
<--6-- SCTP COOKIE ACK ----
DCEP (Open Channel) --->
<----- DCEP ACK ----------
The draft notes that RFC 9260 allows the COOKIE ECHO and COOKIE ACK packets to carry data, so the second saved RTT “is not strictly necessary but was observed in practice” — the real-world saving is up to two RTTs, with one RTT saved even when data piggybacking works.
Source: draft-hancke-tsvwg-snap-00 §1, fetched 2026-07-28.how it works
SNAP is negotiated entirely inside SDP offer/answer — no JavaScript surface changes:
- An endpoint that has created a WebRTC data channel MUST have its SCTP implementation serialize the INIT chunk it would normally send, base64-encode it, and add it as an
a=sctp-initline to the datam=section of its offer (offerer procedure). - The answerer parses and validates the attribute (base64 decoding, then SCTP-level INIT chunk validation — both are error paths), and if valid, responds with its own
a=sctp-init(answerer procedure). An endpoint not supporting the extension MUST NOT include the attribute in its answer — the classic handshake then runs, so SNAP is strictly additive and backwards-compatible. - When both sides negotiated
a=sctp-init, both SHOULD consider the SCTP association ESTABLISHED as soon as the DTLS handshake finishes, skipping steps A–E of RFC 9260 §5.1 — no COOKIE-WAIT state, no T1-init timer (SCTP state shortcut).
The attribute itself — syntax, placement rules, worked decode, renegotiation constraints, and IANA status — is documented on the a=sctp-init reference page.
examples
There is no new JavaScript to call — the observable change is in the SDP your RTCPeerConnection produces and consumes. Create a data channel before negotiating, then inspect the offer:
const pc = new RTCPeerConnection();
const dc = pc.createDataChannel("chat"); // triggers the data m= section
await pc.setLocalDescription(await pc.createOffer());
console.log(pc.localDescription.sdp.includes("a=sctp-init:"));
// true when SNAP is active (origin-trial token present, feature on)
An a=sctp-init line in a negotiated data m= section (full exchange on the offer/answer page):
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
...
a=sctp-port:5000
a=max-message-size:262144
a=sctp-init:AQAAHols3R0AUAAA/////+B5ZR3AAAAEgAgABoLA
sctp-init attribute.Source: chrome-platform-showcase (HEAD-checked 200, 2026-07-28)browser compatibility
| Browser | SNAP support | Notes |
|---|---|---|
| Chrome | Origin trial 151–156 (desktop) | Milestone listing “Origin trial” (verified 2026-07-28); intent states all six Blink platforms supported; token-gated |
| Edge | Not separately reported | Chromium-based; no separate signal recorded on the intent |
| Firefox | No signal | Gecko position recorded as “No signal” on the intent |
| Safari | No signal | WebKit position recorded as “No signal” on the intent |
Interim table: SNAP has no BCD entry and the draft is not a adopted standard, so rows above cite the Intent to Experiment directly. The underlying data-channel API is fully interoperable — BCD api/RTCDataChannel.json: Chrome 24+, Firefox 22+, Safari 11+ — and a non-SNAP peer simply falls back to the classic handshake (the answer omits the attribute).
security & privacy
- Amplification: SNAP removes SCTP’s anti-amplification mechanism (the four-way handshake) to accelerate startup. The draft argues this adds no new amplification risk because SCTP runs atop DTLS (RFC 8261): junk SCTP traffic fails DTLS decryption.
- Initiate Tag exposure: the SDP now reveals the SCTP INIT chunk contents, including the Initiate Tag. Per the draft this introduces no new concern because SCTP-over-DTLS protects against the off-path attacks described in RFC 9260 §5.3.1.
- Application-layer mutation: exposing the INIT chunk to the application (JavaScript / the signaling channel) lets it add or remove variable-length parameters. Removing one is equivalent to the peer not supporting that parameter; adding an unsupported one is equivalent to receiving a packet for an unnegotiated feature — the draft assesses neither as a new security risk.
specifications
| Specification | Status |
|---|---|
| draft-hancke-tsvwg-snap — SCTP Negotiation Acceleration Protocol | Individual Internet-Draft (Informational); revision -00 of 2025-12-29; expired 2026-07-03, not WG-adopted at fetch time; source + issue tracker at github.com/fippo/warp-snap-sped |
| RFC 9260 — Stream Control Transmission Protocol | Normative reference (INIT chunk §3.3.2, association setup §5.1) |
| RFC 8831 — WebRTC Data Channels · RFC 8832 — DCEP | Informative references (data-channel framework; webrtc-datachannel fmt value) |
| RFC 8841 — SDP O/A for SCTP over DTLS · RFC 8842 — SDP O/A for DTLS/TLS | Informative references (UDP/DTLS/SCTP proto; new-association rules SNAP §5.6 builds on) |
see also
- gendn — the
a=sctp-initSDP attribute - gendn — SNAP offer/answer procedures and the SCTP state shortcut
- Chrome Platform Status — this feature
- blink-dev — Intent to Experiment (OT 151–156)
- WebRTC issue 426480601 — accelerate data channel setup with SNAP
- Chrome Platform Showcase — interactive demos for this feature
- MDN — RTCDataChannel (the unchanged JS surface)