Re: [tcpm] alpha_cubic

Neal Cardwell <ncardwell@google.com> Thu, 23 September 2021 21:46 UTC

Return-Path: <ncardwell@google.com>
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 C6ABC3A1FCC for <tcpm@ietfa.amsl.com>; Thu, 23 Sep 2021 14:46:38 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -13.004
X-Spam-Level:
X-Spam-Status: No, score=-13.004 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_MED=-0.499, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, GB_SUMOF=5, HTML_MESSAGE=0.001, HTML_OBFUSCATE_10_20=0.093, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5] autolearn=no autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=google.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7MW4hg3IfpyH for <tcpm@ietfa.amsl.com>; Thu, 23 Sep 2021 14:46:33 -0700 (PDT)
Received: from mail-qv1-xf29.google.com (mail-qv1-xf29.google.com [IPv6:2607:f8b0:4864:20::f29]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 0246E3A1FD0 for <tcpm@ietf.org>; Thu, 23 Sep 2021 14:46:32 -0700 (PDT)
Received: by mail-qv1-xf29.google.com with SMTP id a9so5160856qvf.0 for <tcpm@ietf.org>; Thu, 23 Sep 2021 14:46:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=VIuOD2jlU6t+OlZfyCckB3SncXIsNTNa+S6EkrWnj+8=; b=dvIF0V19qhLxRIaXhEcU7g3FbafGTzoMb7V61yt3hLZ5+5jDSCO5iEFavBdQnvXBrz GktmqdnZMXDEJBie8CN7Fs4jpJAs07ReTm7uoia0y46Q4hl3F5c9Ux12BIIeW136j6WX VN110cw3TXDFzGFW+0HdGhVLayPzqOb8OdpW7F8MvgA1jL0IabmV6JGbZ792hpXeFqlA Q6lt3Rhq77aWwzuidhhRALZRxqqcOsjCC3y7Z12OE1Jb41c3mahEmTfG/M4FntLFF3rT G8LCeeOki29fU1rQsSRitEbQwTz8CXdyPnn3bF0aS5ZXG9qDQq3AYvtHQsYDwXdL3OXP J3Ug==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=VIuOD2jlU6t+OlZfyCckB3SncXIsNTNa+S6EkrWnj+8=; b=LhmK22RHGjPLMCWqDcHUgDa9uvf+3l8FEbja1aQRxirj1udrsmUZ5cqasHi16GUjiO 51sNCimfzF2iKJVHtM32jv9BkUMK0z5TXYabdjdMAaDcrmdzSSjUud4HII+qwHkeFTam +ZZXY0M88Z/YrYDzalH91gaXecMwcw8aDQhkWXEva3y9MKl6uDbHWQ3JTmXveVLfW3PK zZQyYJOY1za+2TM/4M3EVNykRiiJ/rrVl8XAjkyDsnoamGfTPfw+M/z6ojqo8qmSUpFB 9rD/9hvh7cW+pLWr+HfA4yMlR6rCH2uiecMlVmU/Zc/YkzqeT9mQFzbwHb2rCD1jy4/s 02Xw==
X-Gm-Message-State: AOAM530Ok7K53zjkMCYhSDdlbTTEKgTj3LL8iJX0xX0fcRfNmfoovA3K U5vyk2qOr7h6NIxJesTbBpcttFmdv4etsW6Wz5tIFA==
X-Google-Smtp-Source: ABdhPJxZLZXfaCz7b54GZgmJ5I/HEIdHcyvA+h501EShRQojDL1sGaJAiyQ8++lDSXzi9EPZFQhDzCyWOKC8kXWkPqE=
X-Received: by 2002:ad4:5521:: with SMTP id ba1mr6981540qvb.23.1632433591492; Thu, 23 Sep 2021 14:46:31 -0700 (PDT)
MIME-Version: 1.0
References: <CAAK044SjMmBnO8xdn2ogWMZTcecXoET1dmZqd6Dt3WzOUi359A@mail.gmail.com> <alpine.DEB.2.21.2108300740560.5845@hp8x-60.cs.helsinki.fi> <ccfc4dc2-0570-1ba2-66a5-b5e199f11359@bobbriscoe.net> <CAAK044T-ZtZUuq4xBSuB1E9aqHOn96orXe=8ZMJHao_j4xpK3Q@mail.gmail.com> <2a3f7032-6548-061f-c6b1-a39442699228@bobbriscoe.net> <CAAK044Rcw2iryxQ7g-1nFGjnwxNkTX8NhnuGaOeDD=sQFH0sKw@mail.gmail.com> <8b67d4a4-798d-474d-aa9c-edb500f53b27@bobbriscoe.net>
In-Reply-To: <8b67d4a4-798d-474d-aa9c-edb500f53b27@bobbriscoe.net>
From: Neal Cardwell <ncardwell@google.com>
Date: Thu, 23 Sep 2021 17:46:14 -0400
Message-ID: <CADVnQynHa6vLNdKCZ95gM6Rz+-+bz7A-D+W4VxrZ0EuAVAZG8w@mail.gmail.com>
To: Bob Briscoe <ietf@bobbriscoe.net>
Cc: Yoshifumi Nishida <nsd.ietf@gmail.com>, "tcpm@ietf.org Extensions" <tcpm@ietf.org>, Markku Kojo <kojo=40cs.helsinki.fi@dmarc.ietf.org>
Content-Type: multipart/alternative; boundary="000000000000578dce05ccb09038"
Archived-At: <https://mailarchive.ietf.org/arch/msg/tcpm/IpWwqSrjG-SMv3EST0_wugdmr38>
Subject: Re: [tcpm] alpha_cubic
X-BeenThere: tcpm@ietf.org
X-Mailman-Version: 2.1.29
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: Thu, 23 Sep 2021 21:46:40 -0000

On Thu, Sep 23, 2021 at 1:16 PM Bob Briscoe <ietf@bobbriscoe.net> wrote:

> Yoshi,
>
> To summarize the main concern I already wrote in my first email (but
> perhaps didn't summarize well): the formula assumes deterministic marking
> (i.e. some but not all AQMs, and definitely not drop-tail). I believe a
> large majority of the bottleneck buffers on the Internet are still drop
> tail, despite the efforts of many to recommend AQM deployment. So it's not
> particularly applicable to the real Internet.
>
> It also assumes the sawteeth of flows with different RTTs all centre on an
> operating point around the middle of the sawteeth, which is perhaps true of
> RED, but not most other AQMs.
>
> I will still try to develop a better formula - I've thought how to do it
> in principle, but haven't developed the maths for it - it's hard. But pls
> don't wait for me. The Cubic RFC's good enough, and the precise value of
> the Reno-Friendly alpha parameter is fairly irrelevant given the most
> prevalent deployment (Linux) ignores the RFC and sets it much more
> aggressively to 1 instead of 0.53 anyway.
>

Hi Bob,

Can you please elaborate on the characterization of Linux TCP CUBIC as
using an alpha of 1 instead of 0.53?

My experience in reading the Linux TCP CUBIC code and testing it and
examining its packet-by-packet behavior in congestion avoidance is that it
uses the 0.53 value.

This is implemented in the code here:
  https://elixir.bootlin.com/linux/v5.14/source/net/ipv4/tcp_cubic.c#L297

Note that we have:
  beta_scale = 15
So the computation of:
  delta = (cwnd * scale) >> 3;
means:
  delta = (cwnd * 15) >> 3;
That means basically delta is:
    cwnd * 15/8

That means, for example, for a cwnd of 100, the number of packets that need
to be ACKed before increasing cwnd is:
  100 * 15/8 = 187.5

Since 187.5 is 1.875x the cwnd, the rate of cwnd increase is  1 packet /
1.875 rounds, or  .533 packets per 1 round .

So AFAICT this is implementing the correct 0.53 value you mention.

Where Linux TCP CUBIC Reno-emulation additive increase is not ideal is that
once cwnd reaches W_max, it does not return the additive increase to 1, in
order to match Reno for long-term cwnd growth. I have a patch series with
that and a few related fixes that I am trying to find time to polish up and
send upstream.

Apologies if I'm missing something or off in the weeds. :-)

best regards,
neal



>
>
> Bob
>
> On 17/09/2021 10:06, Yoshifumi Nishida wrote:
>
> Hi Bob,
>
> Thanks for the comments.
> I at least think we both can agree that the draft uses [FHP00] as the
> basis of their AIMD or NewReno model.
> If you have any suggestions to update the texts to address your concerns,
> please share. (but, in this case, using github might be straightforward.)
>
> Unfortunately, I'm not sure about the empirical evidence to support the
> formula.
> But, given that cubic has been widely deployed for long time and we don't
> see strong voices to point out problems for it, I am guessing the issues
> might not be too obvious at least.
> If you have any specific concerns in the formula, could you share?
>
> Thanks,
> --
> Yoshi
>
>
> On Mon, Sep 13, 2021 at 4:17 PM Bob Briscoe <ietf@bobbriscoe.net> wrote:
>
>> Yoshi,
>>
>> On 11/09/2021 22:02, Yoshifumi Nishida wrote:
>>
>> Hi Bob,
>>
>> Thanks for the very detailed explanation.
>> I agree with some of your points. But, I have two comments on this.
>>
>> The first point is about RTT variation.
>> I think you have a point there, but I personally think the paper presumes
>> very shallow queue so that the model can be very simple.
>> In this case, we don't have to think about min or max of RTT as they will
>> be mostly the same.
>>
>>
>> [BB] The paper gets the same answer as I got under assumption #3 (all
>> sawtooth vary around a set point half-way between max and min).
>> I didn't assume shallow queues, so it can't be assuming shallow queues.
>>
>> I think we can probably argue the accuracy of the model, but I think it
>> is too broad as a scope of this document. It looks a very deep research
>> topic to me.
>> I think the model is basically derived from Equation-based Congestion
>> Control paper in sigcomm 2000. If we want to update or renew it, we might
>> need another RFC5348.
>>
>>
>> [BB] I didn't use Equation-based CC at all and, at least under one of my
>> three assumptions, I got the same result as the [FHP00] paper (with one
>> further assumptions about how many drops there are at the top of different
>> sawteeth).
>>
>> I just wanted to check the outcome wouldn't be different if I used a
>> model of varying RTT, 'cos I'd already recently done this maths for another
>> reason - to derive the recovery time after a loss. This proved that, given
>> [FHP00] got the same result as one of my cases just using basic AIMD
>> sawtooth geometry, at least in this one case, the varying RTT doesn't make
>> any difference.
>>
>> Nonetheless, I think you're right that deriving the correct formula would
>> involve deeper research. I don't think publication of the RFC should block
>> on that research.
>>
>> So, I think it would be better for this doc to use the model as it is and
>> leave its enhancements for future discussions.
>>
>>
>> [BB] That's up to the WG. But I would not refer to that paper, at least
>> not alone. And I don't think the draft should claim that the formula for
>> Reno-friendly Cubic that it uses from that paper is correct, when it
>> clearly doesn't produce the desired result, even in the paper that proposed
>> it.
>>
>>
>> The second point is α in the draft might be too big.
>>
>>
>> [BB] How so? The paper's own simulations (exploring a very limited space)
>> conclude that α from the model is more than 2x too small.
>>
>> During my WGLC review, I read [FHP00] once and I had similar thoughts.
>> But, after I re-read the paper several times, I start having a different
>> interpretation.
>>
>> First off, it is very clear that β=0.7 is more aggressive than β =0.5
>> when there's no other traffic.
>> As cwnd growth is linear, if there's enough long time for the data
>> transfer, the average cwnd for β =0.5 will be (1.0 + 0.5)/2 = 0.75 Wmax and
>> it will be (1.0 + 0.7)/2 = 0.85 Wmax for β=0.7.
>>
>>
>> [BB] Correct
>>
>> So, it is obvious that this model does not aim for the cases where
>> there's no other traffic.
>>
>>
>> [BB] It is certainly obvious that comparing flow rates is not about
>> single flows.
>>
>> But, by the same token, does it mean anything to say a flow is 'more
>> aggressive when there's no other traffic'?
>> You can have different cwnd for the same throughput, if the avg queue
>> delay is higher and therefore RTT is higher.  But I don't think that says
>> anything about aggression. If anything, aggression is about shorter
>> recovery time.
>>
>> Yes, the analysis I used was for each flow on its own. When they are not
>> on their own, but competing in the same queue, (obviously) there cannot be
>> two different average queue delays. But you can think of them as each
>> progressing in parallel, each taking losses and each contributing to the
>> queue. I'm not saying my analysis is the final word by any stretch of the
>> imagination. However, if on their own they have different recovery times,
>> then when together A will be pulling B away from its natural recovery time
>> and towards A's recovery time, and vice versa.
>>
>>
>> I believe the choice of (α,  β) in [FHP00] is designed to be more or less
>> fair only when it competes with (α=1.0,  β =0.5)
>> Hence, I think we should not apply the loss rate for no-other-traffic
>> situation to the formula, which can lead to α3 = 0.20
>> Instead, I am thinking we can think in this way..
>>
>> (α=1.0,  β =0.5) model oscillates between 0.5 W1 and 1.0 W1 in a
>> congestion epoch.
>> (α=X,  β =0.7) model oscillates between 0.7 W2 and 1.0 W2 in the same
>> congestion epoch.
>>   where W1 is max window for (α=1.0,  β =0.5), W2 is max window for
>> (α=X,  β =0.7)
>> When these two models have the same loss ratio, it should satisfy (1.0 +
>> 0.5) W1 = (1.0 + 0.7) W2
>>
>> Also, in one congestion epoch, (α=1.0,  β =0.5) increases 0.5 W1 while
>> (α=X,  β =0.7) increases 0.3 W2
>> Now, if we define the congestion epoch as e RTTs, e = 0.5 W1 / 1.0  and
>> also e = 0.3 W2 / X
>> This means, X should satisfy
>>   0.5 W1 /1.0  = 0.3 * 1.5/1.7 W1/ X
>> then we get X = 0.529.
>>
>>
>> [BB] This is the same equation as in [FHP00], but with numbers not
>> variables. it's also the same as the formula in the current Cubic RFC. And
>> it gives the same answer you've got when you plug in the numbers. Because
>> you've used the same technique to compare the geometry of the sawteeth.
>>
>> But is there empirical evidence to support this formula, given the
>> simulations in the paper itself don't support it? That's the question.
>>
>> Also, I'd like to hear Markku's response to your original question to
>> him. I was only trying to second-guess what he was trying to say.
>>
>>
>> Bob
>>
>>
>>
>> This will mean if we launch (α=1.0,  β =0.5) and (α=0.529,  β =0.7) at
>> the same time and reduce them when the sum of their windows becomes Wmax,
>> the throughput of them will mostly be the same.
>> --
>> Yoshi
>>
>> On Tue, Sep 7, 2021 at 5:17 AM Bob Briscoe <ietf@bobbriscoe.net> wrote:
>>
>>> Yoshi,
>>>
>>> You recently asked Markku for an explanation of his point #4.
>>>
>>> Coincidentally, a few weeks ago, I was checking the formula in RFC8312
>>> for Cubic in TCP-Friendly mode (called "C-Reno" in this email for brevity),
>>> and I also checked back on that preliminary paper that Markku refers to. I
>>> think Markku has a different way of explaining the flaw in the equation,
>>> but below I'll try to explain what I think the problems are. See [BB]
>>> inline...
>>>
>>> If you don't read HTML email, I'm afraid the maths is probably going to
>>> look like gobbledygook.
>>>
>>> On 30/08/2021 17:33, Markku Kojo wrote:
>>>
>>> Hi Yoshi, all,
>>>
>>> On Wed, 18 Aug 2021, Yoshifumi Nishida wrote:
>>>
>>> 4. Fairness to AIMD congestion control
>>>
>>>    The equation on page 12 to derive increase factor α_cubic that
>>>    intends to achieve the same average window as AIMD TCP seems to
>>>    have its origins in a preliminary paper that states that the
>>>    authors do not have an explanation to the discrepancy between
>>>    their AIMD model and experimental results, which clearly deviate.
>>>    It seems to have gone unnoticed that the equation assumes equal
>>>    drop probability for the different values of the increase factor
>>>    and multiplicative decrease factor but the drop probability
>>>    changes when these factors change.
>>>
>>>
>>> [BB] The source of eqn (4) in RFC8312 is eqn (4) in [FHP00]. This paper
>>> has been cited 250 times but it is not peer reviewed.
>>>
>>> Equations (2) & (3) of [FHP00] that lead up to (4) use an RTT (R) as if
>>> it doesn't vary. But it does, because the sawteeth vary the queue. But the
>>> real problem is that the model (silently) assumes that R is an average RTT
>>> sitting part-way up the sawteeth, whatever the link rate or base RTT. This
>>> overlooks the fact that, if the tips of the sawteeth are always at the same
>>> queue depth (as in a tail-drop buffer) the average R will be higher if the
>>> sawteeth have smaller amplitude. This sounds picky, but the assumption on
>>> whether sawteeth vary about their bottom, top or middle greatly alters the
>>> outcome:
>>>
>>> I've taken three possible alternative assumptions, with their resulting
>>> additive increase factors for theoretical equality with Reno (I've given
>>> all the derivations at the end of this email):
>>> #1) All sawteeth have the same Rmin: α ~= (1/β2 - 1) / 3;
>>> Example: β = 0.7; α ~= 0.35
>>> #2) All sawteeth have the same Rmax: α ~= 4(1-β2) / 3;
>>> Example: β = 0.7; α ~= 0.68
>>> #3) All sawteeth have the same Ravg: α ~= 3(1-β) / (1+β);
>>> Example: β = 0.7; α ~= 0.53    <== used in [FHP00] and therefore in RFC8312
>>>
>>>
>>> Which assumption is most applicable?
>>> #2 models a tail-drop queue.
>>> #3 (or somewhere between #3 and #2) models a probabilistic AQM, such as
>>> PIE or RED.
>>> #1 is not applicable to the current Internet, but it would be if a magic
>>> AQM was invented that minimized the standing queue.
>>> I don't think any of the assumptions are good models of C-Reno's
>>> interaction with CoDel.
>>>
>>> So which one should draft-ietf-tcpm-rfc8312bis recommend?
>>> You might think #2, given one suspects the vast majority of queues are
>>> still tail drop...
>>> However, it may be 'none of the above', 'cos the paper also says it
>>> assumes deterministic marking; i.e. that that each flow experiences just
>>> one drop or mark at the top of each sawtooth. If that applies at all, it
>>> only applies to AQMs, not to tail-drop buffers that tend to drop more than
>>> one packet at a time. Nonetheless, for the purpose of rate comparison, all
>>> the flows will share the same bottleneck. So if flow rates are equal under
>>> a certain AQM, they might be equal under tail-drop too (see {Note 1} at the
>>> very end).
>>>
>>> I would still like to say 'none of the above' because Linux C-Reno has
>>> been widely used with α=1, β=0.7 for many years now without the sky
>>> falling. So it's questionable whether friendliness should be defined
>>> relative to Reno. Otherwise, from day 1, RFC8312bis will be stating the
>>> forlorn hope that Linux C-Reno should regress to become less aggressive
>>> than its former self, just to be friendly to Reno, which apparently barely
>>> exists any more (according to the Great TCP Congestion Control Census of
>>> 2019 [MSJ+19]).
>>>
>>> Nonetheless, we need to bear in mind that BSD variants of Cubic (e.g.
>>> Apple's) are also widely used and I believe they comply with the α for
>>> C-Reno defined in RFC8312.
>>>
>>> (FAQ: Why does C-Reno add <1 segment per RTT to be friendly to Reno,
>>> which adds 1 segment per RTT?
>>> C-Reno in the RFC multiplicatively decreases cwnd to 0.7*cwnd on a loss
>>> (multiplicative decrease factor β=0.7), whereas Reno uses β=0.5. So,
>>> because C-Reno reduces less, it's also meant to increase less per round so
>>> that the sawteeth don't reach the max window again more quickly than Reno
>>> would. That is, it's meant to use a smaller AI factor (α) than 1 segment.
>>> Using α<1 doesn't necessarily slow down Cubic's acceleration into unused
>>> capacity, because it can switch to a convex (hockey stick) Cubic curve once
>>> its slow linear increase has made the queue large enough to come out of its
>>> 'TCP-Friendly' mode.)
>>>
>>> Whatever, rfc8312bis certainly shouldn't refer solely to [FHP00] without
>>> caveats.
>>>
>>> Then we have the problem that none of the above formulae are verified
>>> against reality.
>>> Even in the [FHP00] paper, which uses assumption #3, the simulations are
>>> out by about 2x. The paper used β=7/8. So, from the theory, for each of the
>>> above three assumptions, the additive increase factor would have had to be:
>>> α1 = 0.10
>>> α2 = 0.31
>>> α3 = 0.20
>>> They used a RED AQM (which should be somewhere between assumption #2 &
>>> #3).
>>> But they had to configure C-Reno with α=0.4 to get close to equal flow
>>> rates with Reno
>>> Using my 'finger in the air' modification to the formulae in {Note 1}, α
>>> 3 = sqrt(0.20) = 0.44, which would have been about right (perhaps only
>>> coincidentally).
>>>
>>> The question over what α to put in the RFC could run and run. So here's
>>> a suggested path through this quagmire:
>>> These alternatives throw doubt on the wisdom of using assumption#3. So
>>> we could at least pick a new assumption for a theoretical α. Assumption#2
>>> is probably the 'most correct', and also happens to give the highest value
>>> of α for the 'TCP-Friendly' region (α=0.68 when β=0.7).
>>> (By my unsubstantiated formula in {Note 1}, α2 = sqrt(0.68) = 0.82.)
>>>
>>> If we look for an empirical value of α that gives reasonably equal flow
>>> rates against Reno, I suspect we will get all sorts of different answers
>>> depending on the conditions, e.g. AQM or not; high or low multiplexing;
>>> high or low RTT (shared by all flows); pacing, burstiness, etc,etc. If you
>>> want to take this path, feel free, but if you're still on it in a year's
>>> time, don't say I didn't warn you.
>>>
>>>
>>> Derivations of the above three formulae follow at the end.
>>>
>>> The equations for the drop
>>>    probability / the # of packets in one congestion epoch
>>>    are available in the original paper and one can easily verify
>>>    this. Therefore, the equations used in CUBIC are not correct
>>>    and seem to underestimate _W_est_ for AIMD TCP, resulting in
>>>    moving away from AIMD-Friendly region too early. This gives
>>>    CUBIC unjustified advantage over AIMD TCP particularly in
>>>    environments with low level of statistical multiplexing. With
>>>    high level of multiplexing, drop probability goes higher and
>>>    differences in the drop probablilities tend to get small. On the
>>>    other hand, with such high level of competition, the theoretical
>>>    equations may not be that valid anymore.
>>>
>>> /Markku
>>>
>>>
>>> [BB] Derivations of the formulae for α under the three different
>>> assumptions follow. It's possible/likely that this is all already in a
>>> paper somewhere, but I haven't been able to find one.
>>> 0) Preparatory material
>>> Terminology:
>>> The subscript for C-Reno is omitted given it would be on every term.
>>> The recovery time of an AIMD congestion control is the average time for
>>> additive increase to recover the window reduction after a multiplicative
>>> decrease.
>>>
>>> The overall approach is:
>>> A) Find a formula in terms of the AI and MD factors (α & β), for the
>>> recovery time of C-Reno.
>>> B) Equate this to the recovery time of Reno, which will produce a
>>> formula for the additive increase factor, α.
>>>
>>> The recovery time formula for C-Reno is derived by:
>>> 1) summing up all the round trips in additive increase, which become
>>> increasingly large as the queue grows. This sum is stated in terms of the
>>> number of rounds per cycle, J.
>>> 2) Then J is found by writing two formulae;
>>>   2a) one for the average sawtooth decrease
>>>   2b) and the other for the increase.
>>> Then by assuming a steady state the two can be equated.
>>> Here goes...
>>>
>>> The following formula gives the recovery time, Tr, from one max window
>>> to the next, in C-Reno with:
>>> * additive increase (AI) factor α [segment / RTT]
>>> * and packet-rate r [packet / s]
>>> assuming that the minimum window of each sawtooth still fully utilizes
>>> the link.
>>>     Tr = ΣJ-1j=0    (Rmin + jα/r)
>>> where j is the index of each round, and J is the number of round trips
>>> of additive increase per sawtooth. The rationale for the second term is
>>> that the queue grows by α fractional packets in each round, and the queue
>>> delay per packet is 1/r (seconds per packet is reciprocal of packets per
>>> second). The sum of all the second terms forms an arithmetic progression,
>>> the sum of which is given by the well-known formula, as follows:
>>>          = J.Rmin + J(J-1)α/2r
>>>        ~= J.Rmin + J2α/2r.                                (1)
>>> The approximation holds as long as J>>1. In some implementations (e.g.
>>> Linux), cwnd increases continuously, so strictly the limits should be j=1/2
>>> to J-1/2 (the average half way through the first and last rounds), but
>>> details like this are insignificant compared to the approximation.
>>>
>>> The difference in RTT due to the additional queue delay between the top
>>> and bottom of the sawtooth can be stated in two ways.
>>> Either as the sum of all the queue delays of each additive increase:
>>>     (Rmax - Rmin) = Jα/r,                                (2a)
>>> Or by the multiplicative relationship between the max and min RTTs, by
>>> the definition of β: Rmin = β.Rmax.
>>>     (Rmax - Rmin) = (Rmin / β) - Rmin
>>>                                = Rmin(1-β)/β                 (2b)
>>> Equating (2a) and (2b):
>>>     J = r.Rmin(1-β) / (αβ)                                  (2)
>>>
>>> Substituting for J from (2) in (1):
>>>     Tr = r.Rmin2 (1-β) / (βα) + r.Rmin2 (1-β)2/(2β2α)
>>>          = r.Rmin2 (1-β) / (βα) * (1 + (1-β)/2β )
>>>          = r.Rmin2 (1-β)(1+β) / (2β2α)
>>>          = r.Rmin2 (1-β2) / (2β2α)
>>> (3)
>>> And, because Rmin = β.Rmax.
>>>     Tr = r.Rmax2 (1-β2) / (2α)
>>> (4)
>>>
>>> The well-known steady-state Reno formula from [FF99] is:
>>>     rReno ~= (1/Ravg) sqrt(3 / 2p)
>>>                 (5)
>>> assuming deterministic marking (which is also assumed for the above
>>> model of C-Reno).
>>>
>>> Assuming a Reno sawtooth is approximately linear, the average RTT of a
>>> Reno flow,
>>>     Ravg ~= (Rmax + Rmin)/2
>>> and
>>>     Rmin = Rmax/2
>>> Therefore
>>>     rReno ~= (1/Rmin) sqrt(2 / 3p)
>>>                 (6)
>>>     rReno ~= (1/Rmax) sqrt(8 / 3p)
>>>                 (7)
>>>
>>> With the preparatory material done, next we take each of the three
>>> assumptions, one at a time.
>>> #1) All sawteeth have the same Rmin
>>> From Eqn (3):
>>>     Tr = r.Rmin2 (1-β2) / (2β2α)
>>> Total packets sent over period Tr is r.Tr during which time assume 1
>>> packet is lost (or marked) at the sawtooth peak {Note 1}. So loss
>>> probability:
>>>     p = 1 / r.Tr
>>> Substituting for Tr and rearranging :
>>>     r2 = 2β2α / Rmin2 (1-β2)p
>>>     r = (β/Rmin) sqrt(2α / (1-β2)p)
>>> Equating the Reno packet rate, rReno, from eqn (6) to the C-Reno packet
>>> rate, r, for all α and β:
>>>     r = rReno
>>>        = (1/Rmin) sqrt(2 / 3p).
>>> Therefore,
>>>     (1/Rmin) sqrt(2 / 3p) ~= (β/Rmin) sqrt(2α / (1-β2)p)
>>> Rearranging
>>>     2/3 ~= 2αβ2 / (1-β2)
>>>     α ~= (1-β2)/3β2
>>>        ~= (1/β2 - 1) / 3
>>>                                 (8)
>>> #2) All sawteeth have the same Rmax = Rmin / β
>>> From Eqn (4):
>>>     Tr = r.Rmax2 (1-β2) / (2α)
>>> As before, after substituting for Tr and rearranging:
>>>     p = 1 / r.Tr
>>>     r = (1/Rmax) sqrt(2α / (1-β2)p)
>>> Equating to rReno from eqn (7) for all α and β,
>>>       ~= (1/Rmax) sqrt(8 / 3p).
>>> Rearranging
>>>     8/3 ~= 2α / (1-β2)
>>>     α ~= 4(1-β2) / 3
>>>                             (9)
>>>
>>> #3) All sawteeth have the same Ravg Ravg = (Rmax + βRmax )/2
>>>          = Rmax (1+β)/2
>>> From Eqn (4):
>>>     Tr = r.Rmax2 (1-β2) / (2α)
>>>          = 2r.Ravg2 (1-β) / α(1+β)
>>> As before, after substituting for Tr and rearranging:
>>>     p = 1 / r.Tr
>>>     r = (1/Ravg) sqrt(α (1+β) / 2(1-β)p)
>>> Equating to rReno from eqn (5) for all α and β,
>>>       ~= (1/Ravg) sqrt(3 / 2p).
>>> Rearranging
>>>     3/2 ~= α(1+β) / 2(1-β)
>>>     α ~= 3(1-β) / (1+β)
>>>                         (10)
>>>
>>> This last formula is same as the equation used for C-Reno in RFC8312
>>> and in the RFC8312bis draft.
>>>
>>>
>>> {Note 1}: The assumption in [FHP00] of deterministic marking is suspect
>>> for the Internet (meaning that the spacing between drops or marks is
>>> even and there is always 1 packet dropped or marked at the top of each
>>> sawtooth). The actual average dropped (or marked) per sawtooth will
>>> depend on whether the buffer uses tail-drop or an AQM, and if so which AQM.
>>> It is perhaps better not to assume the actual average number dropped (or
>>> marked) is known, but instead assume the ratio of the average drops or
>>> marks between C-Reno and Reno will be roughly proportional to their AI
>>> factors. This would modify the formula for C-Reno's drop probability to:
>>>     p = αReno / αC-Reno.r.Tr
>>> Substituting αReno = 1:
>>>     p = 1 / αC-Reno.r.Tr
>>> This would modify all the results to:
>>>
>>> #1) All sawteeth have the same Rmin: α ~= sqrt( (1/β2 - 1) / 3 );
>>>     Example: β = 0.7; α ~= 0.59
>>> #2) All sawteeth have the same Rmax: α ~= sqrt( 4(1-β2) / 3 );
>>>     Example: β = 0.7; α ~= 0.82
>>> #3) All sawteeth have the same Ravg: α ~= sqrt( 3(1-β) / (1+β)
>>> );        Example: β = 0.7; α ~= 0.73
>>>
>>> However, these would then be wrong where there really is deterministic
>>> marking.
>>>
>>> References
>>> =========
>>> [FHP00]    Floyd, S., Handley, M., and J. Padhye, "A Comparison of
>>> Equation-Based and AIMD Congestion Control", May 2000,  <
>>> https://www.icir.org/tfrc/aimd.pdf>
>>>
>>> [MSJ+19] Ayush Mishra, Xiangpeng Sun, Atishya Jain, Sameer Pande, Raj
>>> Joshi, and Ben Leong. The Great Internet TCP Congestion Control Census. Proc.
>>> ACM on Measurement and Analysis of Computing Systems, 3(3), December
>>> 2019
>>>
>>> [FF99] Sally Floyd and Kevin Fall, "Promoting the Use of End-to-End
>>> Congestion Control in the Internet", IEEE/ACM ToN (1999)
>>>
>>>
>>> Bob
>>>
>>> --
>>> ________________________________________________________________
>>> Bob Briscoe                               http://bobbriscoe.net/
>>>
>>>
>> --
>> ________________________________________________________________
>> Bob Briscoe                               http://bobbriscoe.net/
>>
>>
> --
> ________________________________________________________________
> Bob Briscoe                               http://bobbriscoe.net/
>
> _______________________________________________
> tcpm mailing list
> tcpm@ietf.org
> https://www.ietf.org/mailman/listinfo/tcpm
>