Re: QMux outcomes from IETF 125

Kazuho Oku <kazuhooku@gmail.com> Tue, 24 March 2026 10:07 UTC

Return-Path: <kazuhooku@gmail.com>
X-Original-To: quic@mail2.ietf.org
Delivered-To: quic@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id C71F3D09096A for <quic@mail2.ietf.org>; Tue, 24 Mar 2026 03:07:12 -0700 (PDT)
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -2.098
X-Spam-Level:
X-Spam-Status: No, score=-2.098 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Laom-jyH3y5k for <quic@mail2.ietf.org>; Tue, 24 Mar 2026 03:07:11 -0700 (PDT)
Received: from mail-dy1-x132c.google.com (mail-dy1-x132c.google.com [IPv6:2607:f8b0:4864:20::132c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id CAC20D09095E for <quic@ietf.org>; Tue, 24 Mar 2026 03:07:11 -0700 (PDT)
Received: by mail-dy1-x132c.google.com with SMTP id 5a478bee46e88-2c10a2e2cd1so4629634eec.0 for <quic@ietf.org>; Tue, 24 Mar 2026 03:07:11 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1774346831; cv=none; d=google.com; s=arc-20240605; b=HAnVgsBY49u4wdIXXdo0YYmCBa+k4h0M5YweeMuk1sjBKv8DKwHZhmIqZnwHU2G58r kqOcZIhVl6EL12iMZRbtAlxXaAXCgM0XsOcGeJnom1XM0/ddoGF4EpvLBAg2BVxvVB/e W0J8PY51AN9S7XRIwjNhYBFTB54er7LW9jY4jxJiNBFxx3ikre8a6VBrklPBaaJ6gZMN UI/p+2Z3fgdFkA0i5Z+SxA2bNknxHks0QXzmt5b3dpFqHQYkZAu0fJ4X/9BH9K0Gb+0t 6SNDFJLBDv3dK7VRYTV75dBq+oBww9pAgcTdPKhNqieGflTOEIOjEx/9pdnKIqNlcCUm f1bg==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=x1B1rhfGRZbmByBnuFmoq8izkjRJKkL4Rtrw+vQaFi8=; fh=h2z8uZS9LdDPLiWWRFiSCz2bp3s+A3aWLw222UNob6c=; b=fhFVsNvd1IwMVgmpUiPO/0g2Rs5XBIfTwHp7KHsjYM/ncWSE3LZemGZmqwuAbTuaSl MsIsCsLrz6viaSoY06yiqIHvYM78clFGfMdk9HLIogpZz9Qvxj83joMSy3OcqHEfDf/p Xivacq0aLDQuC8L2D6ZbbZmAUXdklGQ5Aivqwt+QtQBP1SDiVjYA9jMg8Rod6HuWT/1E eG1eg7F9SFWxtXSfPpCLzNqhx3j7Eg7wutDxwqqb3S2UYuiuP8xBJyuAy1c/yEH70WwJ tGSlJdIyw0lbm1OJEY1tSipp9WPPiKn2Lp3ftBaNbo5orLbpkWB7Qn0U7fnBb9il2lEA Sl5w==; darn=ietf.org
ARC-Authentication-Results: i=1; mx.google.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774346831; x=1774951631; darn=ietf.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=x1B1rhfGRZbmByBnuFmoq8izkjRJKkL4Rtrw+vQaFi8=; b=Yc2QOA20H/Xbkc9hkqkZZJmFQIheNuk8mbVpc87virVjNVru5SNL0Jz3Ky8lIgM4AP 0zQjbJFI7M/Vv3w0F968WdRJ6Q7ofdmllkr9XCh7rsrRw0VV+Lukf6tk/z9OXaWTcUWg gN1VZhPFd3mEYNLvvkuYN2uoFjOlgayy/wMtpka/Rpm3N3Ebg0PCN6A9Wf8b8BFDW4eH LFWayJvTAJl12JfhrjBL6Llb7V4QdPN+QtaBJAWOukBrk1h/MrntKpN3rP/5uF1VExEP N66Ev1R2cspIK6BiAtNvDzZNgXfqGMINla62Wn2Yno4emLzmKldeOAjL1ChBsqrpUG+G 4wXA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774346831; x=1774951631; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=x1B1rhfGRZbmByBnuFmoq8izkjRJKkL4Rtrw+vQaFi8=; b=UBZ0pi9NeS3tZGxe98MMXASKEDilAQA3clOESEhLb3H5cqBjCCk+Cpm9oZ1ipsA87O MTxkon32M8/eesqH7PTveicFFgsM0vEaTiuP5fQl7Zq+Ww3QsQksaEBNtPJage3r03Nu 619Nuxpw0qvJBobWPOY0OrwKMiEC8KwT04P68eCIg73Fx34eSFvQMVIZ2GvnuUdZcUs3 DjU9amxTws7pnEnUm8Twg/sN3cbaxIF0mdvO9DKNAS7HQjDOfu83aTWVhSiYaV+xSO0Q jHnvoSeS0ze9hwXXTiDpgvZ/nC8U2GE/fR1GI9ky0nyfBKbzUP6Dj4e1CdOiIbBw8Hjo Befg==
X-Forwarded-Encrypted: i=1; AJvYcCVEOQz+vC4/YNCVE7XhJVa8F9qgjSmwtLoBYbS4D7Ty3sl+aNeH/+DpV+N7yD2ERbl21u8L@ietf.org
X-Gm-Message-State: AOJu0Yx9p5p6VvqFe/EuBL7K8JtLnDV/s5eKRyQ3kjBkbMRL8h0GNRzx YjGt7cdN/OOtgAQ5b2F3wnwE5178SSGYbz6OChaUHFz5tncjLnncR/q9GOSTrQIhDMniGvDL1as mlo4WKBA6iazC8cVlx5aw6zNhdNKJjytKcVxY
X-Gm-Gg: ATEYQzzgIPJjrR9a9CAycIiUXJ74jnc07p8vObsfwvttZtzZk+QJVeeuFIDI2kR6DW4 kmnWgAjHH6Gxp06RRWToPyrHLK+Zlu7cfvw2MVr0we1vi8zkGsKVo+e+dsqU+Tw8E0zm4mdzcK6 bo1yDoSZQAwwplSWWFfk60e6KI0wt/ZQSZhdL9e4GC/E2CxuT0Nv8B/M1+I623NsKpwg2lx9eE0 4bMAQBBTqJWR/hJydUuNDzTclnqE84tAZjkiIP4wT+Q/SqHi2ME1FTCNnggLli4eij9Z7U6rjHC htsmh0a1ZJ7PYBz8ErHWUaou4qvGdF/qaD4/wROzmhqOFFZEusiK9eTiOKPBTrHBqyN3Vg==
X-Received: by 2002:a05:7022:68c:b0:128:d5f1:d594 with SMTP id a92af1059eb24-12a7265ef91mr7830964c88.10.1774346830494; Tue, 24 Mar 2026 03:07:10 -0700 (PDT)
MIME-Version: 1.0
References: <8f5c2ce6-e02e-4b72-8846-de822f3c1929@app.fastmail.com> <CAKcm_gN3zR_XxN6RF6eVv+86L5gXhZ31z2=tW4H=pZQa0-sX1w@mail.gmail.com> <df9cb59d-7af0-4d58-8eaf-8c6b2797d224@betaapp.fastmail.com>
In-Reply-To: <df9cb59d-7af0-4d58-8eaf-8c6b2797d224@betaapp.fastmail.com>
From: Kazuho Oku <kazuhooku@gmail.com>
Date: Tue, 24 Mar 2026 19:06:57 +0900
X-Gm-Features: AaiRm517jlA1RB_1DbADufJA_-91ahyQES-hjneIx8Ax2VivPCksPophsWjTgfs
Message-ID: <CANatvzzX9sRorbH_NNZ+4Ywqf+y6S+o5=OvvJV=XB2BGN4ifYg@mail.gmail.com>
Subject: Re: QMux outcomes from IETF 125
To: Martin Thomson <mt@lowentropy.net>
Content-Type: multipart/alternative; boundary="0000000000008a43b0064dc25068"
Message-ID-Hash: LOHG5UAMGTGKAGHPBCRFVDLMATPKDTKJ
X-Message-ID-Hash: LOHG5UAMGTGKAGHPBCRFVDLMATPKDTKJ
X-MailFrom: kazuhooku@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-quic.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
CC: Ian Swett <ianswett=40google.com@dmarc.ietf.org>, Lucas Pardue <lucas@lucaspardue.com>, quic@ietf.org
X-Mailman-Version: 3.3.9rc6
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/gJWswHNwitnA2VXq7MId8Z3--D8>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Owner: <mailto:quic-owner@ietf.org>
List-Post: <mailto:quic@ietf.org>
List-Subscribe: <mailto:quic-join@ietf.org>
List-Unsubscribe: <mailto:quic-leave@ietf.org>

Ian, MT, thank you for sharing your thoughts.

I have implemented QMux-00, and based on that experience I agree that
implementing QMux without records is not hard.

That said, I still think that using records is the better direction.

The main reasons are:

* it avoids requiring the decoder of every frame type to support trial or
incremental decoding to handle truncated input;
* the overhead is identical when sending large data; and
* it naturally reduces the risk of blocking caused by frames crossing TLS
record boundaries.

On the first point, with direct QUIC-v1 framing over a byte stream, the
decoder of every frame type needs to handle receipt of incomplete frames
gracefully, either by implementing trial decoding, or by implementing
incremental decoding. In the case of trial decoding, the receive core needs
to retain the partial frame image and re-invoke the decoder as more bytes
arrive. In the implementation strategy I presented at IETF 124, this meant
making frame decoders return `PARTIAL` on truncated input, and repeatedly
invoking them until `PARTIAL` is returned, while retaining the remaining
bytes until more bytes are received [1].

In other words, the complexity is not just in the receive loop. It also
affects the contract of the frame decoders themselves. With records, that
complexity can stay at the record layer, while frame encoding and decoding
remain identical to QUIC v1.

On the second point, for large data, the two approaches are equally
wire-efficient. Martin's preferred design prohibits STREAM frames without a
length field, so in that case both approaches carry a length anyway. The
difference is just where the length is carried. As already noted in the
comment of issue #21 [2], for large transfers the alternative is no more
space-efficient.

On the third point, at first glance, one might think that using QMux
records increases buffering, because a receiver would wait until a complete
QMux record is received before processing it. I do not think that is the
right comparison, however. Because TLS would be used as the underlying
transport, and because the default maximum size of a QMux record (16382
bytes plus the length prefix) naturally matches that of a TLS record (16384
bytes), senders can naturally align QMux and TLS record boundaries in many
cases. That in turn means that receivers are more likely to observe
complete QMux records at natural processing boundaries, making such
buffering a rarer case in the frame-decoding path and reducing the risk
that a partially available STREAM frame remains blocked until the next TLS
record becomes fully available, even if the receiver does not implement
incremental processing.

By contrast, without records, frames are more likely to cross TLS record
boundaries. That means receivers either need to implement incremental
decoding of STREAM frames, **and also add plumbing to pass the partially
received payload of the STREAM frame to the application**, or accept
additional latency while waiting for the trailing TLS record to become
fully available.

Put differently, I think QMux records provide a structure that is easier to
implement efficiently across QMux stacks.

[1]
https://datatracker.ietf.org/meeting/124/materials/slides-124-quic-qmux-00
p.16
[2] https://github.com/quicwg/qmux/issues/21#issuecomment-4107952458


2026年3月23日(月) 8:52 Martin Thomson <mt@lowentropy.net>:

> I also looked.  Like Ian, there were a few issues that came out of the
> review I did.
>
> The question of the two-layer framing is one that I've thought about.
> I've concluded that I strongly prefer the design where STREAM frames are
> always length-delimited.  It's a miniscule amount more efficient.  Either
> version includes a length, but the version with the length on one more
> STREAM frame will have a smaller value.  And any time that there is no
> unterminated STREAM frame, the length is pure waste.
>
> It is true that the engineering cost of managing stream reads is
> significant.  I can attest to that.  Variable-length integers are pretty
> bad for this sort of processing, but many stacks already need the code for
> their HTTP/3 implementation, which has exactly this problem already.
>
> It would have been nice to put the code to handle undelivered-but-promised
> data in a single place, but that is only possible if you impose a
> performance penalty. A stack could use another framing layer to shield
> frame processing from having to block/pause when data is not yet
> available.  But that leads to delays in processing.  Any framing layer that
> bundles multiple frames would not be processed, even if the data for
> leading frames is present.
>
> That increases the costs of a reliable QMux implementation, which
> undercuts some of the promise that was made, but my view is that frame
> processing is such a small part of any implementation that it doesn't
> matter much.
>
> ~Martin
>
> On Sat, Mar 21, 2026, at 21:25, Ian Swett wrote:
> > Thanks for the progress and I apologize for missing the session.  I
> > tried to provide helpful reviews where possible.
> >
> > The two-layer encoding Issue is the only one where I felt we were going
> > in the wrong direction, but I recognize I might not fully understand
> > the issues.
> >
> > Thanks, Ian
> >
> > On Fri, Mar 20, 2026 at 4:21 AM Lucas Pardue <lucas@lucaspardue.com>
> wrote:
> >> __
> >> Hi folks,
> >>
> >> At the 125 session, Kazuho presented several QMux open issues with
> associated PRs. This email serves to summarize the outcome of the
> discussion and confirm the feeling in the room on the list.
> >>
> >> Since there has seemed to be strong emerging consensus on GitHub and in
> the room, the authors would like to promptly follow up on the outcomes. If
> you disagree with them, please let that be known ASAP and before
> 2026-03-26, ideally on the issue or PR itself.
> >>
> >> As noted in the session, we'd like to schedule a virtual interim for
> QMux before IETF 126, targetting an EMEA friendly timeslot. Look out for a
> follow up email on that topic, in the meantime you can express your
> interest directly to the chairs.
> >>
> >>  • Two-layer encoding
> >>    • Issues: https://github.com/quicwg/qmux/issues/21 and
> https://github.com/quicwg/qmux/issues/24
> >>    • PR: https://github.com/quicwg/qmux/pull/26
> >>    • Outcome: merge the PR to close the issues
> >>  • Deadlock and flow control
> >>    • Issue: https://github.com/quicwg/qmux/issues/9
> >>    • PR: https://github.com/quicwg/qmux/pull/27
> >>    • Outcome: merge the PR to close the issue
> >>  • TLS Profile - negotiating application protocol when using TLS
> >>    • Issues: https://github.com/quicwg/qmux/issues/12 and
> https://github.com/quicwg/qmux/issues/25
> >>    • PR: https://github.com/quicwg/qmux/pull/33
> >>    • Outcome: merge the PR to close the issue
> >>  • TLS Profile - QMux transport params (TPs) in TLS handshake
> >>    • Issue: https://github.com/quicwg/qmux/issues/18
> >>    • PR: https://github.com/quicwg/qmux/pull/28
> >>    • Outcome: merge the PR and close the issue (the PR adds improved
> text but we will keep TPs in QMux frames
> >>  • Implicit acks & ping
> >>    • Issue: https://github.com/quicwg/qmux/issues/22
> >>    • PR: https://github.com/quicwg/qmux/pull/23
> >>    • Outcome: merge the PR to close the issue
> >>  • Multipath TCP
> >>    • Issue: https://github.com/quicwg/qmux/issues/5
> >>    • PR: https://github.com/quicwg/qmux/pull/29
> >>    • Outcome: do not merge the PR, close with no action
> >> Cheers,
> >> Lucas & Matt
> >> QUIC WG Chairs
>


-- 
Kazuho Oku