[tcpm] CUBIC WGLC Issue 6 (WAS: [NTAP/rfc8312bis] restrict use of cwnddirectly on a congestion event (PR #148) )

Markku Kojo <kojo@cs.helsinki.fi> Sun, 24 July 2022 11:46 UTC

Return-Path: <kojo@cs.helsinki.fi>
X-Original-To: tcpm@ietfa.amsl.com
Delivered-To: tcpm@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 9BE07C14F74E for <tcpm@ietfa.amsl.com>; Sun, 24 Jul 2022 04:46:28 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.01
X-Spam-Level:
X-Spam-Status: No, score=-2.01 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=cs.helsinki.fi
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PEY9u8XSKM8d for <tcpm@ietfa.amsl.com>; Sun, 24 Jul 2022 04:46:24 -0700 (PDT)
Received: from script.cs.helsinki.fi (script.cs.helsinki.fi [128.214.11.1]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 51F3BC14F743 for <tcpm@ietf.org>; Sun, 24 Jul 2022 04:46:23 -0700 (PDT)
X-DKIM: Courier DKIM Filter v0.50+pk-2017-10-25 mail.cs.helsinki.fi Sun, 24 Jul 2022 14:46:09 +0300
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cs.helsinki.fi; h=date:from:to:cc:subject:in-reply-to:message-id:references :mime-version:content-type:content-id; s=dkim20130528; bh=GzYlMx UJuTxSSYpyTFBQgP2iyqw9nCzKXNogfqQRs0k=; b=Y/2xitgwEaNZoko4GQa1F1 x9J9EOMFlhk8b1Dgzt8QlZMNzBx71/6sFKVk76BGo1ujt0NBEn5dqppVA2LKMBAE hJ27r0SlsL9z7lpupZXjoK6ZuIlGya5r8NeVWOZo3HvU4TKFuD4z/WBXO7fSf1iT wKmlfUZO4N4V3M5Pa0jTQ=
Received: from hp8x-60 (85-76-46-16-nat.elisa-mobile.fi [85.76.46.16]) (AUTH: PLAIN kojo, TLS: TLSv1/SSLv3,256bits,AES256-GCM-SHA384) by mail.cs.helsinki.fi with ESMTPSA; Sun, 24 Jul 2022 14:46:09 +0300 id 00000000005A014E.0000000062DD3101.0000104B
Date: Sun, 24 Jul 2022 14:46:08 +0300
From: Markku Kojo <kojo@cs.helsinki.fi>
To: tcpm@ietf.org
cc: NTAP/rfc8312bis <reply+AVOPHIBOVNQY5M5LJW4AXTGA4V4ADEVBNHHE33AGGM@reply.github.com>, NTAP/rfc8312bis <rfc8312bis@noreply.github.com>, Review requested <review_requested@noreply.github.com>
In-Reply-To: <NTAP/rfc8312bis/pull/148/c1190598643@github.com>
Message-ID: <alpine.DEB.2.21.2207232134320.7292@hp8x-60.cs.helsinki.fi>
References: <NTAP/rfc8312bis/pull/148@github.com> <NTAP/rfc8312bis/pull/148/c1190598643@github.com>
User-Agent: Alpine 2.21 (DEB 202 2017-01-01)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=_script-4195-1658663169-0001-2"
Content-ID: <alpine.DEB.2.21.2207241445050.7292@hp8x-60.cs.helsinki.fi>
Archived-At: <https://mailarchive.ietf.org/arch/msg/tcpm/9k9K9pXYmEO1liV4sShaES_lEt4>
Subject: [tcpm] CUBIC WGLC Issue 6 (WAS: [NTAP/rfc8312bis] restrict use of cwnddirectly on a congestion event (PR #148) )
X-BeenThere: tcpm@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: TCP Maintenance and Minor Extensions Working Group <tcpm.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/tcpm>, <mailto:tcpm-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tcpm/>
List-Post: <mailto:tcpm@ietf.org>
List-Help: <mailto:tcpm-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tcpm>, <mailto:tcpm-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sun, 24 Jul 2022 11:46:28 -0000

Hi Matt, all,

I'm replying to this on the tcpm wg mailing list (and changing the 
subject line) to keep the important discussions where they belong to. See 
inline below.

On Wed, 20 Jul 2022, Matt Olson wrote:

> 
>
>             I'm happy with a simple "on ACK, if inflight < cwnd/2, then don't grow cwnd". I just
>             want to confirm that is what the spec is supposed to be recommending, because the
>             wording makes it unclear whether the recommendation is explicitly to do the more
>             complicated RFC 7661 logic.
>
>       I can fix this in the proposed text.
> 
> Thanks! Happy to hear we will be recommending this simple approach.
>
>             And I still want to know why this requirement is only being applied to implementations
>             that use cwnd rather than inflight for setting ssthresh. It's like "it grows more in
>             those implementations, so try to offset that by capping cwnd based on inflight", but
>             when there is no loss and a low send rate, even implementations that use inflight for
>             setting ssthresh will see unbound cwnd growth, so why isn't this recommendation being
>             made across the board?
>
>       The point is to set cwnd based on actual inflight data or data acknowledged as that determines the
>       true bytes that are flowing in an end-to-end path. If flight_size and cwnd were always similar,
>       then we don't need to add any new text - you can use either. Its just because cwnd can grow higher
>       than actual flight_size for app-limited use cases (for example), we want to set the new cwnd based
>       on actual bytes being transmitted.
> 
> But like I said, even for implementations that set ssthresh = inflight*0.7 on congestion events, the cwnd can
> grow significantly beyond inflight. So I am asking why we are not recommending this cap for those
> implementations too.

If I understood it correctly, Matt has an important point here but that 
is different from what the restriction in my proposed text and the text 
in the stds track RFCs are addressing. We have two separate problem 
scenarious to solve.

1. A congestion event occurs when a sender is rate limited, i.e., inflight 
is less than cwnd.

If a TCP sender that uses cwnd to set a new value for ssthresh on 
congestion events is allowed to increase cwnd beyond inflight, it may not 
respond to congestion effectively at all. E.g., if inflight = 50, cwnd 
has been inceased to 100 for an app-limited sender and loss is detected, a 
Reno sender using ssthresh = cwnd/2 = 50 will effectively not react to 
congestion event at all but will continue sending at the same rate. This 
is in conflict with the basic congestion control principle that the 
sender must react to congestion. A CUBIC sender would be almost fully 
unresponsive for two congestion events: first, ssthresh = 100*0.7=70, 
second, ssthresh=70*0.7=49. A sender employing stds track (RFC 5681) or 
RFC 7661 response do not incur the same incorrect behaviour because the 
sender calculates a new ssthresh value using FlightSize (or pipeACK).

This is the case my proposed text was addressing. The current modified 
text is incorrect as it allows cwnd <= 2*inflight, that is, it would 
allow CUBIC to not react to all congestion events (in full).

2. A sender is rate limited, i.e., inflight is less than cwnd, and there 
is no congestion event but the sender stops being rate limited and may end 
up sending a (large) burst of data unless limeted somehow.

I believe Matt is concerned with the case 2 where the TCP sender is 
application data limited or rwnd limited but is allowed to increase its 
cwnd without any limits. If the cwnd has increased to a high value and the 
TCP sender stops being app data and/or rwnd limited, this may result in 
a very large burst of data to send which is undesireable. RFC 7661 limits 
this burst by not allowing the cwnd to increase if pipeACK < 1/2*cwnd and 
advices avoiding bursting at line rate by applying pacing or other 
ways to control the sending rate in such a case.
On the other hand, if we allow the same with a simple approach currently 
proposed ("on ACK, if inflight < cwnd/2, then don't grow cwnd") for a 
sender that uses cwnd to set the new value for ssthresh we leave the 
problem scenario 1 above unaddressed and end up incorrect sender 
behaviour. That's one major reason why using FlightSize in setting the 
new value of ssthresh should be the recommended way to address the both 
problem cases; I tried to explain this already earlier but obviously 
failed in articulating it.

So, the case 2 is a valid concern that the current standards track RFCs 
(e.g., RFC 5681 and RFC 9002) do not address but RFC 7661 (Experimental) 
does. If we (wg) decides to advance RFC 7661 to stds track, we already 
have a way to address it properly for stds track CC. I don't find it 
reasonable to solve it in the RFC series separately for a sender using 
cwnd to set a new value for ssthresh (as it is tricky to get correct).

Thanks,

/Markku

> —
> Reply to this email directly, view it on GitHub, or unsubscribe.
> You are receiving this because your review was requested.[png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjY
> AAAAAIAAeIhvDMAAAAASUVORK5CYII=] Message ID: <NTAP/rfc8312bis/pull/148/c1190598643@github.com>
>