Skip to main content

QMux
draft-ietf-quic-qmux-01

Document Type Active Internet-Draft (quic WG)
Authors Kazuho Oku , Lucas Pardue , Jana Iyengar , Eric Kinnear
Last updated 2026-04-01
Replaces draft-opik-quic-qmux
RFC stream Internet Engineering Task Force (IETF)
Intended RFC status Proposed Standard
Formats
Additional resources Mailing list discussion
Stream WG state WG Document
Document shepherd (None)
IESG IESG state I-D Exists
Consensus boilerplate Yes
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-ietf-quic-qmux-01
QUIC                                                              K. Oku
Internet-Draft                                                    Fastly
Intended status: Standards Track                               L. Pardue
Expires: 4 October 2026                                       Cloudflare
                                                              J. Iyengar
                                                                 Netflix
                                                              E. Kinnear
                                                                   Apple
                                                            2 April 2026

                                  QMux
                        draft-ietf-quic-qmux-01

Abstract

   This document specifies QMux version 1.  QMux version 1 provides,
   over bi-directional streams such as TLS, the same set of stream and
   datagram operations that applications rely upon in QUIC version 1.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the QUIC Working Group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/quic/.

   Source for this draft and an issue tracker can be found at
   https://github.com/quicwg/qmux.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 4 October 2026.

Oku, et al.              Expires 4 October 2026                 [Page 1]
Internet-Draft                    QMux                        April 2026

Copyright Notice

   Copyright (c) 2026 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.  Code Components
   extracted from this document must include Revised BSD License text as
   described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Revised BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
   2.  Conventions and Definitions . . . . . . . . . . . . . . . . .   4
   3.  The Protocol  . . . . . . . . . . . . . . . . . . . . . . . .   4
     3.1.  Properties of Underlying Transport  . . . . . . . . . . .   4
     3.2.  QMux Records  . . . . . . . . . . . . . . . . . . . . . .   5
   4.  QUIC Frames . . . . . . . . . . . . . . . . . . . . . . . . .   6
     4.1.  Ordering of STREAM Frames . . . . . . . . . . . . . . . .   7
     4.2.  QX_TRANSPORT_PARAMETERS Frames  . . . . . . . . . . . . .   8
     4.3.  QX_PING Frames  . . . . . . . . . . . . . . . . . . . . .   9
   5.  Transport Parameters  . . . . . . . . . . . . . . . . . . . .  10
     5.1.  Permitted and Forbidden Transport Parameters  . . . . . .  10
     5.2.  max_record_size Transport Parameter . . . . . . . . . . .  11
   6.  Forward Progress and Flow Control . . . . . . . . . . . . . .  11
   7.  Closing the Connection  . . . . . . . . . . . . . . . . . . .  11
   8.  Using TLS . . . . . . . . . . . . . . . . . . . . . . . . . .  12
     8.1.  Protocol Negotiation  . . . . . . . . . . . . . . . . . .  12
     8.2.  Using 0-RTT . . . . . . . . . . . . . . . . . . . . . . .  13
   9.  Extensions  . . . . . . . . . . . . . . . . . . . . . . . . .  13
     9.1.  Unreliable Datagram Extension . . . . . . . . . . . . . .  13
   10. Version Agility . . . . . . . . . . . . . . . . . . . . . . .  13
     10.1.  Negotiation Using ALPN . . . . . . . . . . . . . . . . .  14
     10.2.  In-band Upgrade  . . . . . . . . . . . . . . . . . . . .  14
   11. Implementation Considerations . . . . . . . . . . . . . . . .  15
   12. Security Considerations . . . . . . . . . . . . . . . . . . .  15
   13. IANA Considerations . . . . . . . . . . . . . . . . . . . . .  15
     13.1.  QUIC Frame Types . . . . . . . . . . . . . . . . . . . .  15
     13.2.  QUIC Transport Parameters  . . . . . . . . . . . . . . .  16
   14. References  . . . . . . . . . . . . . . . . . . . . . . . . .  16
     14.1.  Normative References . . . . . . . . . . . . . . . . . .  16
     14.2.  Informative References . . . . . . . . . . . . . . . . .  17
   Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . .  18
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  18

Oku, et al.              Expires 4 October 2026                 [Page 2]
Internet-Draft                    QMux                        April 2026

1.  Introduction

   QUIC version 1 [QUIC] is a bi-directional, authenticated transport-
   layer protocol built on top of UDP [UDP].  The protocol provides
   multiplexed flow-controlled streams without head-of-line blocking as
   a core service.  It also offers low-latency connection establishment
   and efficient loss recovery.

   However, there are downsides to QUIC.

   One downside is that QUIC, being based on UDP, is not as universally
   accessible as TCP [TCP], due to occasionally being blocked by
   middleboxes.

   Another downside is that QUIC is computationally more expensive
   compared to TLS [TLS13] over TCP.  This increased cost is partly
   because QUIC encrypts each packet, which is smaller than the
   encryption unit of TLS, leading to more overhead, and partly because
   UDP is less optimized within computing infrastructures.

   Due to these limitations, applications are often served using both
   QUIC and TCP.  QUIC is employed to provide the optimal user
   experience, while TCP acts as a fallback for ensuring network
   reachability and computational efficiency as needed.

   One such example is HTTP, which has different bindings for QUIC
   (HTTP/3 [HTTP3]) and TCP (HTTP/2 [HTTP2]).  Recently, security
   concerns have prompted proposals to revise HTTP/2
   ([h2-stream-limits]), which has sparked discussions about the costs
   of maintaining multiple HTTP versions.

   Another example is WebTransport, a superset of HTTP.  Because HTTP
   has different bindings for QUIC and TCP, WebTransport defines its own
   extensions for the two HTTP variants ([webtrans-h3], [webtrans-h2]).

   To reduce or eliminate the costs associated with duplicated efforts
   in providing services on top of both transport protocols, this
   document specifies a polyfill that allows application protocols built
   on QUIC to run on transport protocols that provide single bi-
   directional, byte-oriented stream such as TCP or TLS.

   The specified polyfill provides a compatibility layer for the set of
   operations (i.e., API) required by QUIC, as specified in Section 2.4
   and Section 5.3 of [QUIC].

Oku, et al.              Expires 4 October 2026                 [Page 3]
Internet-Draft                    QMux                        April 2026

2.  Conventions and Definitions

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

3.  The Protocol

   QMux can be used on any transport that provides a bi-directional,
   byte-oriented stream that is ordered and reliable; for details, see
   Section 3.1.

   QMux transfers one or more QUIC frames within a QMux record; see
   Section 3.2.  Neither QUIC frames nor QMux records are encrypted in
   this protocol; it is the task of the transport (e.g., TLS) to provide
   confidentiality and integrity.

   QUIC packet headers are not used.

   For exchanging the transport parameters, a new frame called
   QX_TRANSPORT_PARAMETERS frame is defined.

3.1.  Properties of Underlying Transport

   QMux is designed to work on top of transport layer protocols that
   provide the following capabilities:

   In-order delivery of bytes in both direction:  Underlying transport
      provides a byte-oriented and bi-directional stream that deliver
      the bytes in order; i.e., bytes that were sent in one order become
      available to the receiving side in the same order.

   Guaranteed delivery:  If the transport runs on top of a lossy
      network, that transport recovers the bytes lost; e.g., by
      retransmitting them.  This requires buffering and reassembly, in
      order to achieve the first bullet point (in-order delivery).

   Congestion control:  When used on a shared network, the transport is
      congestion controlled.  Implementations of QMux simply write
      outgoing frames to the transport when that transport permits.

   Authentication, confidentiality, and integrity protection:  Unless
      used upon endpoints between which tampering or monitoring is a
      non-concern, the transport provides peer authentication,
      confidentially, and integrity protection.

Oku, et al.              Expires 4 October 2026                 [Page 4]
Internet-Draft                    QMux                        April 2026

   Application Protocol Negotiation:  To avoid cross-protocol confusion,
      the underlying transport provides a mechanism for endpoints to
      agree on the protocols in use.  Without such a mechanism, QMux and
      application protocols built on top of QMux can only be used
      between endpoints that have out-of-band agreement on those
      protocols.

   TLS over TCP, combined with the Application-Layer Protocol
   Negotiation extension (ALPN) [ALPN], provides all these capabilities.

   UNIX sockets are an example that provide in-order and guaranteed
   delivery only.  Congestion control is not employed, as UNIX sockets
   do not face a shared bottleneck.  Confidentiality and integrity
   protection are deemed unnecessary in environments where the operating
   system is trusted.  Agreement on the application protocol can be
   achieved by using different listening sockets.

3.2.  QMux Records

   QMux Records are formatted as shown in Figure 1.

   QMux Record {
     Size (i),
     Frames (..),
   }

                        Figure 1: QMux Record Format

   QMux Records contain the following fields:

   Size:  A variable-length integer specifying the length in bytes of
      the Frames field.  Note that this length does not include the Size
      field itself.

   Frames:  A byte sequence that contains one or more QUIC frames.

   Each QMux Record is self-delimiting.  On a byte stream transport,
   endpoints parse QMux Records by first parsing Size and then reading
   exactly that many bytes as Frames.  The bytes in Frames are
   interpreted as a contiguous series of QUIC frames encoded using QUIC
   version 1 framing.

   As with QUIC packet payloads (Section 12.4 of [QUIC]), frames are
   complete units: a frame MUST fit entirely within a single QMux Record
   and MUST NOT span multiple QMux Records.

Oku, et al.              Expires 4 October 2026                 [Page 5]
Internet-Draft                    QMux                        April 2026

   Senders can choose record boundaries freely, subject to the
   max_record_size transport parameter (Section 5.2).  Receivers process
   frames within each record, using the record boundary as the payload
   boundary for frames that omit an explicit length.

   If the end of the Frames field is not aligned to a frame boundary
   (that is, if the final frame in the record is truncated), the
   receiver MUST close the connection with an error of type
   FRAME_ENCODING_ERROR.

4.  QUIC Frames

   In QMux, the following QUIC frames can be used, as if they were sent
   or received in the application packet number space:

   *  PADDING

   *  RESET_STREAM

   *  STOP_SENDING

   *  STREAM

   *  MAX_DATA

   *  MAX_STREAM_DATA

   *  MAX_STREAMS

   *  DATA_BLOCKED

   *  STREAM_DATA_BLOCKED

   *  STREAMS_BLOCKED

   *  CONNECTION_CLOSE

   The frame formats are identical to those in QUIC version 1.
   Likewise, the meaning and requirements for the use of these frames
   are consistent with QUIC version 1, with the exception to the
   specific changes made to the STREAM frames, as detailed in
   Section 4.1.

   Use of other frames defined in QUIC version 1 is prohibited for
   various reasons.

Oku, et al.              Expires 4 October 2026                 [Page 6]
Internet-Draft                    QMux                        April 2026

   Frames related to the cryptographic handshake are not used because an
   underlying security layer can provide equivalent features.  Use of
   frames that communicate Connection IDs and those related to path
   migration is forbidden.

   QMux relies on the underlying transport for reliable delivery and
   therefore does not use ACK frames.  QMux stacks do not track delivery
   or retransmit lost data or frames.  For the stream state machinery
   defined in Section 3 of [QUIC], references to acknowledgment are
   interpreted as though acknowledgments occurs as soon as data is
   passed to the underlying transport.  As in QUIC version 1,
   applications cannot assume that the peer application has consumed
   data based solely on transport events.

   The full list of prohibited frames is:

   *  PING

   *  ACK

   *  CRYPTO

   *  NEW_TOKEN

   *  NEW_CONNECTION_ID

   *  RETIRE_CONNECTION_ID

   *  PATH_CHALLENGE

   *  PATH_REPONSE

   *  HANDSHAKE_DONE

   Endpoints MUST NOT send prohibited frames.  If an endpoint receives
   one it MUST close the connection with an error of type
   FRAME_ENCODING_ERROR.

4.1.  Ordering of STREAM Frames

   In QUIC version 1, the order in which STREAM frames are sent or
   received is not guaranteed, because packets can be lost and frames
   can be retransmitted in different packets.  In contrast, QMux, which
   runs over an ordered and reliable byte stream transport, requires
   STREAM frames for each QUIC stream to be sent in order: i.e., for
   each QUIC stream being sent, senders MUST send the stream payload in
   order.

Oku, et al.              Expires 4 October 2026                 [Page 7]
Internet-Draft                    QMux                        April 2026

   This change eliminates the need for implementations to buffer and
   reassemble the stream payload.  As a result, the payload being
   received can be directly passed to the application as it is read from
   the transport.  This efficiency is due to the underlying transport's
   guarantee of in-order delivery.

   When receiving a STREAM frame that carries a payload not immediately
   following the payload of the previous STREAM frame for the same
   Stream ID, receivers MUST close the connection with an error of type
   PROTOCOL_VIOLATION_ERROR.

   These changes do not impact the senders' capability to interleave
   STREAM frames from multiple streams.

4.2.  QX_TRANSPORT_PARAMETERS Frames

   In QMux, transport parameters are exchanged as frames.

   QX_TRANSPORT_PARAMETERS frames are formatted as shown in Figure 2.

   QX_TRANSPORT_PARAMETERS Frame {
     Type (i) = 0x3f5153300d0a0d0a,
     Length (i),
     Transport Parameters (..),
   }

               Figure 2: QX_TRANSPORT_PARAMETERS Frame Format

   QX_TRANSPORT_PARAMETERS frames contain the following fields:

   Length:  A variable-length integer specifying the length of the
      transport parameters field in this QX_TRANSPORT_PARAMETERS frame.

   Transport Parameters:  The transport parameters.  The encoding of the
      payload is as defined in Section 18 of [QUIC].

   The QX_TRANSPORT_PARAMETERS frame is the first frame sent by
   endpoints.  To allow peers to open streams and start sending data as
   early as possible, endpoints MUST send the QX_TRANSPORT_PARAMETERS
   frame as soon as the underlying transport becomes available for
   sending.  Neither endpoint needs to wait for the peer's transport
   parameters before sending its own, as transport parameters are a
   unilateral declaration of an endpoint's capabilities (Section 7.4 of
   [QUIC]).

   Except when sending 0-RTT data using remembered transport parameters
   as described in Section 7.4.1 of [QUIC], endpoints MUST NOT send
   frames whose use depends on peer transport parameters until the

Oku, et al.              Expires 4 October 2026                 [Page 8]
Internet-Draft                    QMux                        April 2026

   peer's QX_TRANSPORT_PARAMETERS frame has been received and processed.
   This can delay use of peer-advertised flow control credit and can
   therefore block sending stream data before peer transport parameters
   arrive.  When QMux runs over TLS 1.3, this does not necessarily add a
   full round trip for clients on a full handshake.  Servers can send
   the QX_TRANSPORT_PARAMETERS frame immediately after the server's
   Finished message, and clients can receive and process the transport
   parameters as soon as they obtain the keys needed to process
   application data.

   The QX_TRANSPORT_PARAMETERS frame MUST only be sent as the first
   frame.  If the first frame being received by an endpoint is not a
   QX_TRANSPORT_PARAMETERS frame, or if a QX_TRANSPORT_PARAMETERS frame
   is received other than as the first frame, the endpoint MUST close
   the connection with an error of type TRANSPORT_PARAMETER_ERROR.

   The frame type (0x3f5153300d0a0d0a; "\xffQMX\r\n\r\n" on wire) has
   been chosen so that it can be used to disambiguate QMux from HTTP/1.1
   [HTTP1] and HTTP/2.

4.3.  QX_PING Frames

   In QMux, QX_PING frames allow endpoints to test peer reachability
   above the underlying transport.

   QX_PING frames are formatted as shown in Figure 3.

   QX_PING Frame {
     Type (i) = 0x348c67529ef8c7bd..0x348c67529ef8c7be,
     Sequence Number (i),
   }

                       Figure 3: QX_PING Frame Format

   Type 0x348c67529ef8c7bd is used for sending a ping (i.e., request the
   peer to respond).  Type 0x348c67529ef8c7be is used in response.

   QX_PING frames contain the following fields:

   Sequence Number:  A variable-length integer used to identify the
      ping.

   When sending QX_PING frames of type 0x348c67529ef8c7bd, endpoints
   MUST send monotonically increasing values in the Sequence Number
   field, since that allows the endpoints to identify to which ping the
   peer has responded.

Oku, et al.              Expires 4 October 2026                 [Page 9]
Internet-Draft                    QMux                        April 2026

   When sending QX_PING frames of type 0x348c67529ef8c7be in response,
   endpoints MUST echo the Sequence Number that they received.

   When receiving multiple QX_PING frames of type 0x348c67529ef8c7bd
   before having the chance to respond, an endpoint MAY only respond
   with one QX_PING frame of type 0x348c67529ef8c7be carrying the
   largest Sequence Number that the endpoint has received.

5.  Transport Parameters

   QMux uses a subset of transport parameters defined in QUIC version 1.
   Also, one new transport parameter specific to QMux is defined.

5.1.  Permitted and Forbidden Transport Parameters

   In QMux, use of the following transport parameters is allowed.

   *  max_idle_timeout

   *  initial_max_data

   *  initial_max_stream_data_bidi_local

   *  initial_max_stream_data_bidi_remote

   *  initial_max_stream_data_uni

   *  initial_max_streams_bidi

   *  initial_max_streams_uni

   The definition of these transport parameters are unchanged.

   Use of other transport parameters defined in QUIC version 1 is
   prohibited.  When an endpoint receives one of the prohibited
   transport parameters, the endpoint MUST close the connection with an
   error of type TRANSPORT_PARAMETER_ERROR.

   Endpoints MUST NOT send transport parameters that extend QUIC version
   1, unless they are specified to be compatible with QMux.

   When receiving transport parameters not defined in QUIC version 1,
   receivers MUST ignore them unless they are specified to be usable on
   QMux.

Oku, et al.              Expires 4 October 2026                [Page 10]
Internet-Draft                    QMux                        April 2026

5.2.  max_record_size Transport Parameter

   The max_record_size transport parameter (0x0571c59429cd0845) is a
   variable-length integer specifying the maximum value of the Size
   field of a QMux Record that the peer can send, in the unit of bytes.

   The initial value of the max_record_size transport parameter is
   16382.  This value allows a sender to construct a 16KB QMux Record by
   using a 2-byte Size field and a 16382-byte Frames field, aligning
   with the default capacity of a full-sized TLS record.

   By sending the transport parameter, the maximum record size can only
   be increased.  When receiving a value below the initial value,
   receivers MUST close the connection with an error of type
   TRANSPORT_PARAMETER_ERROR.

   Endpoints MUST NOT send QMux Records with a Frames field that exceeds
   the maximum declared by the peer.

   When receiving a QMux Record with a Frames field that exceeds the
   declared maximum, receivers MUST close the connection with an error
   of type FRAME_ENCODING_ERROR.

6.  Forward Progress and Flow Control

   To avoid deadlock due to flow control in the underlying transport,
   endpoints MUST continue reading from the underlying transport even
   when delivery of STREAM data to the application is temporarily
   blocked.

   Endpoints MUST NOT couple reads from the underlying transport to
   application reads on any single QUIC stream, as doing so can prevent
   processing of frames required for connection progress.

   Continuing to read does not imply unbounded buffering of STREAM data,
   as the amount of stream data a peer can send is limited by flow
   control (Section 4 of [QUIC]).  For DATAGRAM frames, endpoints MAY
   drop received datagrams when they cannot be promptly delivered to the
   application.

7.  Closing the Connection

   As is with QUIC version 1, a connection can be closed either by a
   CONNECTION_CLOSE frame or by an idle timeout.

Oku, et al.              Expires 4 October 2026                [Page 11]
Internet-Draft                    QMux                        April 2026

   Unlike QUIC version 1, idle timeout handling does not rely on ACK
   frames.  Endpoints reset the idle timer when sending or receiving
   QMux frames.  When no other traffic is available, QX_PING frames can
   be used to elicit a peer response and keep the connection active.

   Unlike QUIC version 1, there is no draining period; once an endpoint
   sends or receives the CONNECTION_CLOSE frame or reaches the idle
   timeout, all the resources allocated for the Service are freed and
   the underlying transport is closed immediately.

8.  Using TLS

   When QMux is used over TLS, TLS provides capabilities in addition to
   confidentiality and integrity protection.

8.1.  Protocol Negotiation

   As in QUIC Section 8.1 of [QUIC-TLS], when running an application
   protocol over QMux over TLS, endpoints MUST use ALPN [ALPN] to agree
   on an application protocol, unless another mechanism is used for
   agreeing on an application protocol.

   ALPN protocol identifiers identify the application protocol in use.
   Application protocols that use QMux over TLS MUST designate their
   ALPN identifier and specify that they use QMux version 1.  The
   identifier for a mapping to QMux MUST be different from the mapping
   of the same protocol to QUIC, to retain compatibility with Service
   Binding and Parameter Specification via the DNS [SVCB].

   When using ALPN, endpoints MUST abort the TLS handshake with a
   no_application_protocol TLS alert (Section 3.2 of [ALPN]) if an
   application protocol is not negotiated.  While ALPN only requires
   that servers use this alert, QMux clients MUST also abort the
   handshake when ALPN negotiation fails.

   QMux is not itself an application protocol and does not have an ALPN
   identifier.

   TO BE REMOVED BEFORE PUBLICATION: During the development of QMux, its
   wire format might change.  Therefore, when testing interoperability
   of application protocols using a draft version of QMux, applications
   should specify, for each ALPN identifier they define, which draft
   version of QMux is used.  As an example, an ALPN identifier "myapp-
   12qx" could identify version 12 of "myapp" over TCP and QMux,
   identifying the use of a specific QMux draft version in its
   specification. the use of QMux draft-05.

Oku, et al.              Expires 4 October 2026                [Page 12]
Internet-Draft                    QMux                        April 2026

8.2.  Using 0-RTT

   TLS 1.3 introduced the concept of early data (also known as 0-RTT
   data).

   When using QMux over TLS that supports early data, clients MAY use
   early data when resuming a connection, by reusing certain transport
   parameters as defined in Section 7.4.1 of [QUIC].

   Similarly, when accepting early data, servers MUST send transport
   parameters that comply with the restrictions in Section 7.4.1 of
   [QUIC].  This preserves QUIC's 0-RTT compatibility model and avoids
   requiring an additional round trip to learn peer transport parameters
   on resumed connections.

9.  Extensions

   Not all the extensions of QUIC version 1 can be used.  Each extension
   have to define its mapping for QMux, or explicitly allow the use; see
   Section 5.1.

   As is the case with QUIC version 1, use of extension frames have to
   be negotiated before use; see Section 19.21 of [QUIC].

   This specification defines the mapping of the Unreliable Datagram
   Extension.

9.1.  Unreliable Datagram Extension

   The use of the Unreliable Datagram Extension [QUIC_DATAGRAM] is
   permitted.  The encoding and semantics of the Unreliable Datagram
   Extension remain unchanged, and the use of the extension is
   negotiated via transport parameters.

   As discussed in Section 5 of [QUIC_DATAGRAM], senders can drop
   DATAGRAM frames if the transport is blocked by flow or congestion
   control.

10.  Version Agility

   As new versions of QUIC are specified, there may be a desire to
   define their reliable-byte-stream counterparts as different versions
   of QMux, and to provide ways of negotiating the version to be used.

Oku, et al.              Expires 4 October 2026                [Page 13]
Internet-Draft                    QMux                        April 2026

   QUIC establishes connections using packets carrying an explicit
   version number.  Using that field, Version-Independent Properties of
   QUIC [QUIC-INVARIANTS] defines a version negotiation mechanism that
   involves a retry.  Compatible Version Negotiation for QUIC [QUIC-CVN]
   defines another negotiation mechanism for switching between
   compatible versions during connection establishment without retrying.

   By contrast, QMux does not establish connections by itself; the
   connections are set up by the underlying substrate, and QMux
   exchanges only the transport parameters after they are established.

   Due to these differences, the negotiation mechanisms used by QUIC and
   QMux will differ.

   This section explores some options that future versions of QMux might
   employ for version negotiation and upgrade.

10.1.  Negotiation Using ALPN

   When a new QUIC version that provides a different interface to
   applications is specified, application protocols developed for that
   version might be assigned a new identifier for the TLS Application-
   Layer Protocol Negotiation (ALPN) extension [ALPN].

   Similarly, when TLS is the underlying transport, application
   protocols built on top of the QMux counterparts of such QUIC versions
   can rely on ALPN to negotiate both the application protocol and the
   underlying QMux version (Section 8.1).

   When TLS is not the underlying transport, endpoints can use the first
   8 bytes exchanged on the transport (i.e., the type field of the
   QX_TRANSPORT_PARAMETERS frame in the encoded form) to identify
   whether QMux is in use.

   [TODO: discuss how endpoints should behave when the first 8 bytes
   received are not QX_TRANSPORT_PARAMETERS.]

10.2.  In-band Upgrade

   A new version of QMux might first start communication using QMux
   version 1 and then switch versions in-band during the session.  The
   advantage of this approach is that, even when TLS is not in use, no
   additional round-trip is incurred for version negotiation.

   While QMux version 1 does not specify a concrete method, new versions
   might use the version_information transport parameter (Section 3 of
   [QUIC-CVN]) to discover supported versions and coordinate the switch.

Oku, et al.              Expires 4 October 2026                [Page 14]
Internet-Draft                    QMux                        April 2026

11.  Implementation Considerations

   Similar to HTTP/3 with Extensible Priorities [HTTP_PRIORITY],
   application protocols using QUIC may employ stream multiplexing along
   with a system to tune the delivery sequence of QUIC streams.

   To alternate between QUIC streams of varying priorities in a timely
   manner, it is advisable for QMux implementations to avoid creating
   deep buffers holding QUIC frames.  Instead, endpoints should wait for
   the transport layer to be ready for writing.  Upon becoming writable,
   they should write QUIC frames according to the latest prioritization
   signals.

   Additionally, implementations may consider monitoring or adjusting
   the flow and congestion control parameters of the underlying
   transport.  This approach aims to minimize data buffering within the
   transport layer before transmission.  However, improper adjustment of
   these parameters could potentially lead to lower throughput.

12.  Security Considerations

   Failure to follow the forward-progress requirements in Section 6 can
   lead to deadlock and can be exploited for resource-exhaustion
   attacks.

13.  IANA Considerations

   This document defines new frame types and a transport parameter for
   use with QUIC.  IANA is requested to register the following values in
   the registries under https://www.iana.org/assignments/quic
   (https://www.iana.org/assignments/quic).

   The codepoints listed below, unless otherwise stated, were selected
   using the deterministic method described at
   https://martinthomson.github.io/quic-pick/
   (https://martinthomson.github.io/quic-pick/), with seeds of the form
   draft-ietf-quic-qmux-NN_<fieldtype>.  Upon publication as an RFC,
   IANA is requested to replace provisional codepoints with permanent
   assignments from the standards-action range.

13.1.  QUIC Frame Types

   The following entries should be added to the "QUIC Frame Types"
   registry.

Oku, et al.              Expires 4 October 2026                [Page 15]
Internet-Draft                    QMux                        April 2026

   +==================+=======================+===========+=============+
   |Value             |Frame Type Name        |Status     |Specification|
   +==================+=======================+===========+=============+
   |0x3f5153300d0a0d0a|QX_TRANSPORT_PARAMETERS|provisional|Figure 2     |
   +------------------+-----------------------+-----------+-------------+
   |0x348c67529ef8c7bd|QX_PING                |provisional|Figure 3     |
   |-                 |                       |           |             |
   |0x348c67529ef8c7be|                       |           |             |
   +------------------+-----------------------+-----------+-------------+

                                  Table 1

   The value 0x3f5153300d0a0d0a for QX_TRANSPORT_PARAMETERS was chosen
   deliberately to function as a protocol magic number see (Figure 2).

13.2.  QUIC Transport Parameters

   The following entry should be added to the "QUIC Transport
   Parameters" registry.

   +====================+=================+===========+===============+
   | Value              | Parameter Name  |Status     | Specification |
   +====================+=================+===========+===============+
   | 0x0571c59429cd0845 | max_record_size |provisional| Section 5.2   |
   +--------------------+-----------------+-----------+---------------+

                                 Table 2

14.  References

14.1.  Normative References

   [ALPN]     Friedl, S., Popov, A., Langley, A., and E. Stephan,
              "Transport Layer Security (TLS) Application-Layer Protocol
              Negotiation Extension", RFC 7301, DOI 10.17487/RFC7301,
              July 2014, <https://www.rfc-editor.org/rfc/rfc7301>.

   [QUIC]     Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
              Multiplexed and Secure Transport", RFC 9000,
              DOI 10.17487/RFC9000, May 2021,
              <https://www.rfc-editor.org/rfc/rfc9000>.

   [QUIC_DATAGRAM]
              Pauly, T., Kinnear, E., and D. Schinazi, "An Unreliable
              Datagram Extension to QUIC", RFC 9221,
              DOI 10.17487/RFC9221, March 2022,
              <https://www.rfc-editor.org/rfc/rfc9221>.

Oku, et al.              Expires 4 October 2026                [Page 16]
Internet-Draft                    QMux                        April 2026

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/rfc/rfc2119>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.

   [TLS13]    Rescorla, E., "The Transport Layer Security (TLS) Protocol
              Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018,
              <https://www.rfc-editor.org/rfc/rfc8446>.

14.2.  Informative References

   [h2-stream-limits]
              Thomson, M. and L. Pardue, "Using HTTP/3 Stream Limits in
              HTTP/2", Work in Progress, Internet-Draft, draft-thomson-
              httpbis-h2-stream-limits-00, 6 November 2023,
              <https://datatracker.ietf.org/doc/html/draft-thomson-
              httpbis-h2-stream-limits-00>.

   [HTTP1]    Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke,
              Ed., "HTTP/1.1", STD 99, RFC 9112, DOI 10.17487/RFC9112,
              June 2022, <https://www.rfc-editor.org/rfc/rfc9112>.

   [HTTP2]    Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113,
              DOI 10.17487/RFC9113, June 2022,
              <https://www.rfc-editor.org/rfc/rfc9113>.

   [HTTP3]    Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114,
              June 2022, <https://www.rfc-editor.org/rfc/rfc9114>.

   [HTTP_PRIORITY]
              Oku, K. and L. Pardue, "Extensible Prioritization Scheme
              for HTTP", RFC 9218, DOI 10.17487/RFC9218, June 2022,
              <https://www.rfc-editor.org/rfc/rfc9218>.

   [QUIC-CVN] Schinazi, D. and E. Rescorla, "Compatible Version
              Negotiation for QUIC", RFC 9368, DOI 10.17487/RFC9368, May
              2023, <https://www.rfc-editor.org/rfc/rfc9368>.

   [QUIC-INVARIANTS]
              Thomson, M., "Version-Independent Properties of QUIC",
              RFC 8999, DOI 10.17487/RFC8999, May 2021,
              <https://www.rfc-editor.org/rfc/rfc8999>.

Oku, et al.              Expires 4 October 2026                [Page 17]
Internet-Draft                    QMux                        April 2026

   [QUIC-TLS] Thomson, M., Ed. and S. Turner, Ed., "Using TLS to Secure
              QUIC", RFC 9001, DOI 10.17487/RFC9001, May 2021,
              <https://www.rfc-editor.org/rfc/rfc9001>.

   [SVCB]     Schwartz, B., Bishop, M., and E. Nygren, "Service Binding
              and Parameter Specification via the DNS (SVCB and HTTPS
              Resource Records)", RFC 9460, DOI 10.17487/RFC9460,
              November 2023, <https://www.rfc-editor.org/rfc/rfc9460>.

   [TCP]      Eddy, W., Ed., "Transmission Control Protocol (TCP)",
              STD 7, RFC 9293, DOI 10.17487/RFC9293, August 2022,
              <https://www.rfc-editor.org/rfc/rfc9293>.

   [UDP]      Postel, J., "User Datagram Protocol", STD 6, RFC 768,
              DOI 10.17487/RFC0768, August 1980,
              <https://www.rfc-editor.org/rfc/rfc768>.

   [webtrans-h2]
              Frindell, A., Kinnear, E., Pauly, T., Thomson, M.,
              Vasiliev, V., and W. Xie, "WebTransport over HTTP/2", Work
              in Progress, Internet-Draft, draft-ietf-webtrans-http2-14,
              2 March 2026, <https://datatracker.ietf.org/doc/html/
              draft-ietf-webtrans-http2-14>.

   [webtrans-h3]
              Frindell, A., Kinnear, E., and V. Vasiliev, "WebTransport
              over HTTP/3", Work in Progress, Internet-Draft, draft-
              ietf-webtrans-http3-15, 2 March 2026,
              <https://datatracker.ietf.org/doc/html/draft-ietf-
              webtrans-http3-15>.

Acknowledgments

   TODO acknowledge.

Authors' Addresses

   Kazuho Oku
   Fastly
   Email: kazuhooku@gmail.com

   Lucas Pardue
   Cloudflare
   Email: lucas@lucaspardue.com

Oku, et al.              Expires 4 October 2026                [Page 18]
Internet-Draft                    QMux                        April 2026

   Jana Iyengar
   Netflix
   Email: jri.ietf@gmail.com

   Eric Kinnear
   Apple
   Email: ekinnear@apple.com

Oku, et al.              Expires 4 October 2026                [Page 19]