[CCWG] CWND increase in CUBIC and ACK policy
Kazuho Oku <kazuhooku@gmail.com> Mon, 17 August 2026 01:14 UTC
Return-Path: <kazuhooku@gmail.com>
X-Original-To: ccwg@mail2.ietf.org
Delivered-To: ccwg@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id D1E3212ABC8C8 for <ccwg@mail2.ietf.org>; Sun, 16 Aug 2026 18:14:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1786929282; bh=0y43RP/Dg/rnLcEpCD9TeZ8LnY6FDsu4yXcJhuDgMSU=; h=From:Date:Subject:To; b=KfmLrrknfsQt77SRhn0ORT+RvdJjQFJgYQdkmOBD4L3OkaOpSw8hSIp08UB9cMPeq qM2OsgySoBOaqkk5tjl7tdrQEDqwGe6TCH+5OoqrO1BWg8gML0bG7bBPFjYq6TfEtA Uo587qa4ch4pFk898P+2MSB0melD93jDmwKp5L1A=
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=unavailable 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 99R0GTMjsZuc for <ccwg@mail2.ietf.org>; Sun, 16 Aug 2026 18:14:41 -0700 (PDT)
Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) (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 8FA3612ABC8B7 for <ccwg@ietf.org>; Sun, 16 Aug 2026 18:14:41 -0700 (PDT)
Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-c9ef3e1337fso2220696a12.2 for <ccwg@ietf.org>; Sun, 16 Aug 2026 18:14:41 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1786929275; cv=none; d=google.com; s=arc-20260327; b=bX2VLCXwumfHdls+V96iWYuQwAXsNzmzBJdRCp86P06/b0IFGJ3tWftEuhxy+53xAO 4m2XHooOYYV7iZdK2oFj3z6B2ob7sO/NdDOmD2Nmb4+VkBiHTjYolHlCaSy13IJ37eyF EfIj3NYBG8T4Z7ZtowgF234G/OqKMvBJjLwNOeSR8LcYxWMGCqLzgy26npfHGiHCAl5E vAzLiA6j0l3eYaO3VoDjR4vTz2pnQYYVlHXl1Gg2kdCYsqhWTrSVsK/l4OjrjGdpn7ga Dkx/FwMbSXv0kTK7SGqIiIS5zHUojwuUjQG2lPq5+GHhSqbdCD7mGQj0HU3HmJd7LTlF fzsA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=0BpEaL1LTut9QVEZ2DwQko8yNyegbY61St8/InWd3Dk=; fh=X1o1w0gtkg7gLmQBeoVnot66HR5PeEdT7W++zz5LlA0=; b=AmGjRWpUVcN61ug5f9eblTGVC/qiY91FYSNqQjZ5S27sMPXbUiK0399YiRBVgYFUqK UyYpVlpw1Zs2XdzD0TpXI94KXKgLvA5OPVYbCp5gwrTj7ct29e2jW+0t/mxQVxqVU9ZL X8T6mzz+QmtirgSJcaBfFWPAsn+BaHFSuRXNVb/lbPftYyGFXJkGav+cnCmlQRLb4oUO 5+hNNhrJ7ixngchKOxB5ZhSVlhBIKKkf2UjJ+a2E9whcOJLYdmEJSP/cuB+Ihp160j2i f/5eujMMOHcJSUo+tUhPhaq1oNjI7IaZ+zVvwuCklTW/8xM/Jnd/IYowYraRVJtComD+ BgHw==; 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=1786929275; x=1787534075; darn=ietf.org; h=content-type:to:subject:message-id:date:from:mime-version:from:to :cc:subject:date:message-id:reply-to:content-type; bh=0BpEaL1LTut9QVEZ2DwQko8yNyegbY61St8/InWd3Dk=; b=Y5lp5Pqz5vcpVQ7JDmkL0ODG+HvJvhvwoMw3JxzHBKGcmEy6jCjgt/CakjdSAOsWsp oJ7/7Kom6FOWtGGNOyxy1+V3cM4pqIY/BTgUXq4ilkyDGfP1n8LdqE7oRdo0z4H7H4FV q/2POb84GZtubZM36TqyzICXPOrLbqhFo0lSwPh6Eu/ZvBAIsv2y/aIH8M1/zpnIau17 p9S1vKX8b6OJksPmOZ3PZLoIjlC3yvztSgeCizPyYheeZziNIddMfdsgaFqnIKgidY/T z87AOZJfyrYSpPQcfgMQa8/ecObmksSqyC8p9akNk14jwjGp8sAuR0LuUMDj4klpD9aH QQsA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786929275; x=1787534075; h=content-type:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=0BpEaL1LTut9QVEZ2DwQko8yNyegbY61St8/InWd3Dk=; b=KOfwaROBd7Lvf20c5E1Y1rMCE1JXJYxBh94tL3xns5p1oVPhsLUj5MeLMibAg8U1O9 OFik+345/a4DucMX9cRjES1Y92US7ld7KrMtZ+4BUJAR+T0JXjPutm0aYp/o0wLm8lWR XdfIESEqsJMesVq/A1f8HpVNzOFCIPoe0CryYYRT7h2wdPCkelY92W7UhkTIzq0km/oo gvfFaczPb+MYtwDiX0XMP5l9RxeQ32g9uGp8ooGgNynfipjeRkWp+xWnolRkoON6a70E KKJ5g2v6is2AX1ng+/wkLT2ULvRukU5iCgKA6kjnn5pjl5d3M0BUkI3WM7m+nRkbcXnB iY5Q==
X-Gm-Message-State: AOJu0YxuoAMZ2ROr0s7Raqz0GbRrOc8OkoWapLQbLKfiyLU4djMhfyOp wpCNIA1e00QHkVxGunFTJgkGUpkty1wzCxH9c3+lbdYiSNNirSSy4zgfDxXhzeDe1Wz0e2gPgF8 HPvftK/luSzJZDQ9QwcPBWVa2lVa32m90YKC8
X-Gm-Gg: AR+sD13IPItjtTxaDNvvdPlPrKeOM744m/GSAno5eK0IuoMKkooFdIpUqPq0LQ22Buq 8uFRNnFXm1gW94RxWKz2MzPRmA85qH6eRXOakWCHrtyielxs9zUXLg5cxEwako7dmmIk2oR0Q9G FA5fZHEiq1dcQFcW6oOxApq2c9e75B1sJv082WdQD4TZyjbVHRtU+Erdp9Y4pILaUXffENG0xJU BAVQ8P5geP013JVzEnbY4ivhj/boBfeIZlWnLNLcTFrtSmJIZ0fmUllCZLqRnVz8xFPh+QCfHXL mNUAJDsvs7hSVbuefWVBDHqfXgYDtH7laP/z4Je8CAnlLqKJegL6g8xC5u00RqEGAOYxYND2M36 3TCE=
X-Received: by 2002:a05:6a20:1455:b0:3cb:9bae:9262 with SMTP id adf61e73a8af0-3cc71e7f58cmr23766005637.37.1786929275168; Sun, 16 Aug 2026 18:14:35 -0700 (PDT)
MIME-Version: 1.0
From: Kazuho Oku <kazuhooku@gmail.com>
Date: Mon, 17 Aug 2026 10:14:22 +0900
X-Gm-Features: AcwNN1V2HM7QzGHSoRcaIuTtXPHAzLJ7jCVNr-BpDXYPJ07nVhAQxFSKrQdK04E
Message-ID: <CANatvzyZJxOLcwsrb52oyVm3T8ZhqbzPpOWDSvMvSo-b1hW+Ng@mail.gmail.com>
To: ccwg@ietf.org, IETF QUIC WG <quic@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000af6aed065933e422"
Message-ID-Hash: HPFIOISVXTAQ3UC5Y6UULEETHL346HYT
X-Message-ID-Hash: HPFIOISVXTAQ3UC5Y6UULEETHL346HYT
X-MailFrom: kazuhooku@gmail.com
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [CCWG] CWND increase in CUBIC and ACK policy
List-Id: Congestion Control Working Group <ccwg.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/ccwg/ZTYECT1NQijwwxq2sDLE0scbQAg>
List-Archive: <https://mailarchive.ietf.org/arch/browse/ccwg>
List-Help: <mailto:ccwg-request@ietf.org?subject=help>
List-Owner: <mailto:ccwg-owner@ietf.org>
List-Post: <mailto:ccwg@ietf.org>
List-Subscribe: <mailto:ccwg-join@ietf.org>
List-Unsubscribe: <mailto:ccwg-leave@ietf.org>
Dear CCWG and QUICWG folks, TL;DR: Sections 4.4 and 4.5 of RFC 9438 do not account for segments_acked when increasing CWND outside the Reno-friendly region. As a result, a literal implementation makes CUBIC's growth rate depend on the receiver's ACK ratio, and causes measurable unfairness. It gets increasingly worse as ACKs become less frequent. While testing a vibe-coded CUBIC implementation, I think I've found a peculiarity in RFC 9438. Section 4.1 defines a "new ACK" as > a "new > ACK" is received, i.e., an ACK that cumulatively acknowledges the > delivery of previously unacknowledged data. Then, figure 4 in section 4.3 uses segments_acked to determine the amount being acked, which is perfectly fine: > West = West + αcubic * segments_acked / cwnd It even notes that accounting for segments_acked is needed "for connections with enabled or disabled delayed ACKs". But in sections 4.4 and 4.5, the CWND increase is specified as: > (target - cwnd) / cwnd where the target is Wcubic(t + RTT). It does not take segments_acked into account. This update rule approximates the intended increase toward `target` over one RTT only when there are roughly `cwnd` ACK events per RTT, i.e., approximately one ACK per segment. Consequently, as ACKs become less frequent, the actual CWND increasingly trails the CUBIC window function. On a simulated 100 Mbps bottleneck with a full RTT of 80 ms, when competing against an otherwise identical CUBIC flow using ACK1 (i.e., ack-every-packet), the bandwidth that a CUBIC flow doing ACKn (i.e., ack every n packet) obtains is: ACK1: 50.0% ACK2: 45.29% <-- 👀 ACK10: 10.07% ACK2 is particularly interesting because acknowledging at least every second packet is the conventional delayed-ACK behavior recommended by both TCP and QUIC v1. Changing the increase to: > (target - cwnd) / cwnd * segments_acked fixes the issue. Perhaps unsurprisingly, this issue does not exist in the Linux TCP stack or Google Quiche. Both account for the amount of newly acknowledged segments. I see some QUIC stacks also doing the correct thing, especially those that seem to have used CUBIC inside linux or Google Quiche as a reference. But there also seems to be multiple QUIC stacks that contain this bug. To paraphrase, under stable conditions and the receiver using the default ACK2 policy, a literal implementation of RFC 9438 gets about 17% less throughput than a stack that does not have this bug. Attempts to reduce ACKs (e.g., draft-ietf-quic-ack-frequency) are going to make the downside more prominent. Am I missing something? Please let me know what you think. -- Kazuho Oku
- [CCWG] CWND increase in CUBIC and ACK policy Kazuho Oku
- [CCWG] Re: CWND increase in CUBIC and ACK policy Neal Cardwell
- [CCWG] Re: CWND increase in CUBIC and ACK policy Yoshifumi Nishida
- [CCWG] Re: CWND increase in CUBIC and ACK policy Kazuho Oku