Skip to content

Offer no WebTransport subprotocol when requesting draft-14 - #6

Merged
mondain merged 1 commit into
openmoq:mainfrom
rwl4:fix/draft14-webtransport-subprotocol
Apr 14, 2026
Merged

Offer no WebTransport subprotocol when requesting draft-14#6
mondain merged 1 commit into
openmoq:mainfrom
rwl4:fix/draft14-webtransport-subprotocol

Conversation

@rwl4

@rwl4 rwl4 commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Previously webtransport_protocol_offer returned a two-token list ("moq-00", "moqt-16") for --draft 14 and ("moqt-16", "moq-00") for --draft 16. The secondary token was a fallback intended to help negotiation succeed when the server did not advertise the primary token, but WebTransport subprotocol selection is at the server's discretion: when both tokens overlapped with the server's advertised set, the server could legitimately pick the "wrong" one for the draft the client was about to speak.

In practice relays that advertise only moqt-16/moqt-15 picked moqt-16 from moqxr's --draft 14 offer, completed the WebTransport handshake, and then rejected the draft-14 CLIENT_SETUP bytes (version 0xff00000e) as a control-stream parse error because the negotiated subprotocol implied draft-16.

Draft-16 now offers only "moqt-16", which matches the versioned-token convention introduced in draft-15+.

Draft-14 predates the versioned-token convention and is the legacy "moq-00" subprotocol. Some deployments accept "moq-00" as a WebTransport subprotocol; others do not and only accept an empty subprotocol offer, falling back to determining the version from CLIENT_SETUP/SERVER_SETUP. Offering no subprotocol is the broadest interoperable path for draft-14 over WebTransport and is the draft-14-over-WT handshake documented by Akamai's probe tool. Verified end-to-end against a draft-14-capable relay.

Previously webtransport_protocol_offer returned a two-token list
("moq-00", "moqt-16") for --draft 14 and ("moqt-16", "moq-00") for
--draft 16. The secondary token was a fallback intended to help
negotiation succeed when the server did not advertise the primary
token, but WebTransport subprotocol selection is at the server's
discretion: when both tokens overlapped with the server's advertised
set, the server could legitimately pick the "wrong" one for the draft
the client was about to speak.

In practice relays that advertise only moqt-16/moqt-15 picked
moqt-16 from moqxr's --draft 14 offer, completed the WebTransport
handshake, and then rejected the draft-14 CLIENT_SETUP bytes
(version 0xff00000e) as a control-stream parse error because the
negotiated subprotocol implied draft-16.

Draft-16 now offers only "moqt-16", which matches the versioned-token
convention introduced in draft-15+.

Draft-14 predates the versioned-token convention and is the legacy
"moq-00" subprotocol. Some deployments accept "moq-00" as a WebTransport
subprotocol; others do not and only accept an empty subprotocol offer,
falling back to determining the version from CLIENT_SETUP/SERVER_SETUP.
Offering no subprotocol is the broadest interoperable path for
draft-14 over WebTransport and is the draft-14-over-WT handshake
documented by Akamai's probe tool. Verified end-to-end against a
draft-14-capable relay.
@mondain
mondain merged commit 2d8719c into openmoq:main Apr 14, 2026
2 checks passed
@rwl4
rwl4 deleted the fix/draft14-webtransport-subprotocol branch April 14, 2026 21:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants