Re: flow control and DATAGRAM

Jana Iyengar <jri.ietf@gmail.com> Tue, 30 October 2018 02:24 UTC

Return-Path: <jri.ietf@gmail.com>
X-Original-To: quic@ietfa.amsl.com
Delivered-To: quic@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id B937C1288BD for <quic@ietfa.amsl.com>; Mon, 29 Oct 2018 19:24:15 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.999
X-Spam-Level:
X-Spam-Status: No, score=-1.999 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.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 gjlmt7FX-7L4 for <quic@ietfa.amsl.com>; Mon, 29 Oct 2018 19:24:13 -0700 (PDT)
Received: from mail-lf1-x12a.google.com (mail-lf1-x12a.google.com [IPv6:2a00:1450:4864:20::12a]) (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 93DC812008A for <quic@ietf.org>; Mon, 29 Oct 2018 19:24:12 -0700 (PDT)
Received: by mail-lf1-x12a.google.com with SMTP id h192so7669264lfg.3 for <quic@ietf.org>; Mon, 29 Oct 2018 19:24:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=P7I5gr2z5y5yS/MLzDnmDstmcwwneD6mE6s56skPHUE=; b=uwmhEoTTRfEXePcruZjdyg2dOseSSFGJ2lIwYTE7bWW2rKCMQFmDk91N5NVG5lIqGD wMMSe8i0m16x3MWEzbOGVbPbQueef2xIveNZki0M+uCA1IvXMEUI7ukZmEpTX8dYtZTb Dd71ebq1FrS7XEhl5Uxi/2Bg+13QdFn7fnbmQwsuZFOJPDbDJRxtDoTDDSS4e9Wqp/SE RVxRX1OBmPqC/5VDqu56zVNQyW2UmHvoDjw2iLE0+drdW79l4B1y9j9AVO9dUIUjuKDE b6DQbwVC6qdyuwolXrS5ul3/Yzt0vZxl2kL6WLymTt4FpFKFSKpjsqBHEBHdBMJKGE6t q/jg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=P7I5gr2z5y5yS/MLzDnmDstmcwwneD6mE6s56skPHUE=; b=nFWrE7wFGCdOoJAAEAGqxO08BZAbUivk0G/ZLBcWXHsqpREN+hCgvyZB3OQOfLG33E kN6aZXui/5uO3Z/AzMOX23TsLAJDKfytM+0jjjT84UaBqmbNWnEtFcUKaQV5UjBjqEG+ Kv+B+L97oYyaE7qwBD3G3urFX6cMtsGPPNZwaa3BmjL93W+VWEheGg0A8+DQZ24eBykR DlohPFtOJP7SS1X28w8Gw54LYwhgv1zdX6rWXdU7BpaxO9QxxTroj3Ji3xZAgC0FMqNz KmgfAneXW6uL42RKqzD3P8qkfcVaPFm2CMsS9ngKYkWxSBy3WxomjftrkbB2bvgI9vhd Q9pw==
X-Gm-Message-State: AGRZ1gLz2DKDp9zazZaN4BZXQt596wEgcaJ5jU9uXPnK6yakBYlHKVml IxjDFwVn6IXguxF6DWhQuS1KBubintIYdys4THI=
X-Google-Smtp-Source: AJdET5cM6NoH8OENcgVWALzytfkmO03g3bfw2WnRP7kuuV+CA+oqu8EUOnkGFfSIOdaRYPuBxNLT3JZ9KunqFz81QGw=
X-Received: by 2002:a19:25c2:: with SMTP id l185-v6mr623800lfl.122.1540866250645; Mon, 29 Oct 2018 19:24:10 -0700 (PDT)
MIME-Version: 1.0
References: <CABkgnnU26aYD=TybuD0FZGYtfEa6np-Sk3Jo6t7LRp0wzKh3Lg@mail.gmail.com> <CAKcm_gMDOyJC0AwOo2knN6AMxVbySjGsrLvjcC9A8UA9xcvcWw@mail.gmail.com> <19D3595B-8845-45B6-A60D-9E934DD49FAC@apple.com> <CACpbDcfk+GXb3aL5LG0wQM87thRGO5Y4Q+9cbXf5YuW1=jWCig@mail.gmail.com> <B7BE2454-2A4D-4323-B0A5-0D73BD4B819F@apple.com>
In-Reply-To: <B7BE2454-2A4D-4323-B0A5-0D73BD4B819F@apple.com>
From: Jana Iyengar <jri.ietf@gmail.com>
Date: Mon, 29 Oct 2018 19:23:59 -0700
Message-ID: <CACpbDcd5YWcxyEH3TS1FssgAT13oqeBBQg92+J0uJqhxPz2qkA@mail.gmail.com>
Subject: Re: flow control and DATAGRAM
To: tpauly@apple.com
Cc: Ian Swett <ianswett@google.com>, QUIC WG <quic@ietf.org>, Martin Thomson <martin.thomson@gmail.com>
Content-Type: multipart/alternative; boundary="0000000000008425a4057968e112"
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/A-WWIRF5zZeH8_8bLRh4Rw7tPWU>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic>, <mailto:quic-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic/>
List-Post: <mailto:quic@ietf.org>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic>, <mailto:quic-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 30 Oct 2018 02:24:16 -0000

Hey Tommy,


> I'm not suggesting any changes to when the packet gets
> ack'ed—specifically, I was responding to Martin's hypothetical of having an
> ACK to a DATAGRAM frame meaning that the application had processed the
> frame. My impression is that the ACK to a packet containing a DATAGRAM
> frame means:
> - The packet made it across the network to the QUIC endpoint on the other
> side
>

... and was processed by the QUIC receiver (not necessarily by the
application). This is the same semantic as the ack of a regular frame.


> - The QUIC implementation will deliver the DATAGRAM frame to application
> (it won't drop it locally)
>

In which case you will need flow control. If you agree, then we're on the
same page so far.


> Having a separate outstanding data limit for the DATAGRAM "stream" is an
> interesting solution to the space. It would then have the nice property of
> not looking like traditional flow control. It could even be measured in
> number of frames, rather than bytes (depending on what the limiting factors
> are).
>

In terms of flow control, I don't think DATAGRAM flow control is any
different than sending stream data on any stream and then canceling it --
there are no retransmissions, but the sender still accounts for it in flow
control. My thought here was basically to have exactly the same flow
control as stream-level flow control, and allow for DATAGRAM bytes to fall
within connection-level flow control as normal.

The simplest scheme would be to reserve a stream ID for DATAGRAM data --
this could be 0 or 2^62-1 -- and then MAX_STREAM_DATA uses this stream ID
for flow control of DATAGRAM octets. Alternatively, define a new frame
called MAX_DATAGRAM_DATA that is carries the largest allowed offset that
can be sent as a DATAGRAM, and introduce an offset field in the DATAGRAM
frame.

- jana


> Thanks,
> Tommy
>
> On Oct 29, 2018, at 12:37 PM, Jana Iyengar <jri.ietf@gmail.com> wrote:
>
> Tommy,
>
> Changing the semantics of an acknowledgment to include delivery up to the
> application is a fundamental change to the QUIC machinery, and it doesn't
> work. First, an ACK frame acknowledges packets, and you can't have
> different semantics of an acknowledgment for different frames that are
> carried in the same packet. Second, it interferes with RTT measurement, and
> it conflates flow control with congestion control, which gets messy. (This
> conflation is an interesting problem to consider theoretically, but not one
> for us at this time IMO.)
>
> I am wondering if applying a stream-level flow control for DATAGRAMs makes
> sense instead. Meaning that you treat DATAGRAMs as a separate stream for
> flow control purposes. You might benefit from having an offset in the
> DATAGRAM frame for this purpose.
>
> - jana
>
> On Mon, Oct 29, 2018 at 8:21 AM Tommy Pauly <tpauly@apple.com> wrote:
>
>> Hi Martin, Ian,
>>
>> Yes, very good points!
>>
>> My tendency would be to prefer what Ian's implementation does of passing
>> these DATAGRAM frames up immediately to the application. I don't think that
>> the acknowledgment needs to indicate that the frame was processed by the
>> application, but merely that it has been delivered to the application (that
>> is, the application doesn't get to do anything with the frame that can
>> influence the acknowledgment).
>>
>> The current draft indicates that the content of the DATAGRAM frames
>> contributes to the limit used for MAX_DATA, and that if that amount is
>> reached, the frames are blocked along with STREAM data. I think this works
>> fine for the sender, while the receiver gets into the discussion you
>> present. On the sender side, reaching MAX_DATA could mean dropping the
>> DATAGRAM frames when unable to send more (and sending BLOCKED instead).
>> Since the frames are unreliable, they can be dropped in this situation
>> without violating the API contract.
>>
>> On the receiver side, I agree that queuing the DATAGRAM frames to let the
>> application drive flow control in the way it does for STREAM frames adds
>> complexity and diminishes the utility of the frame and ACKs.. However, I
>> can imagine taking a fairly simplistic approach in which the data limit is
>> automatically increased upon reception of the frame (and the frame is
>> immediately passed to the application). This allows the initial_max_data to
>> put a cap on the amount of data in a given flight of DATAGRAMS, and allow
>> the size of a flight of DATAGRAM frames to be limited by the amount of room
>> left over from STREAM data that may be consuming the connection-wide flow
>> control.
>>
>> Perhaps this approach needs a clearer name other than "flow control",
>> since it has a somewhat different meaning in effect.
>>
>> As for ACKs, if we never discard on the receiver side, the ACK is pretty
>> useful for detecting if there was network-based packet loss.
>>
>> Thanks,
>> Tommy
>>
>> On Oct 29, 2018, at 5:32 AM, Ian Swett <ianswett@google.com> wrote:
>>
>> Good catch Martin, I missed that in the draft as well, and I also think
>> it's impossibly with the proposed design.
>>
>> And yes, I think Martin's proposed solution is likely the only practical
>> one.  In my implementation, the frame is passed up to the application
>> immediately, so technically QUIC processed it, and it's the application's
>> job to decide what to do with it.
>>
>> On Mon, Oct 29, 2018 at 1:16 AM Martin Thomson <martin.thomson@gmail.com>
>> wrote:
>>
>>> Hi Tommy,
>>>
>>> Your slides - <
>>> https://github.com/quicwg/wg-materials/blob/master/ietf103/IETF103-QUIC-Datagram.pdf
>>> >
>>> - say that DATAGRAM frames respect connection-level flow control.  I
>>> missed that in the draft, and I don't know how they can do that in the
>>> face of packet loss, especially when you don't necessarily retransmit
>>> lost DATAGRAM frames.
>>>
>>> For that to work, you would need a bunch more machinery to make the
>>> connection-level flow control sync between endpoints in the case that
>>> packets are lost.  A disagreement about how much flow control is used
>>> causes things to break down badly.  Ian and I discussed this point at
>>> the last meeting and quickly agreed that while it might be nice to
>>> have flow control for this stuff, the increase in complexity is
>>> considerable and (at the time) we thought it wouldn't be worth it.
>>>
>>> The problem that introduces is that you could end up having too many
>>> DATAGRAM frames arrive.  The receiver has to drop something at the
>>> point that it can't handle them.  And we say that when you acknowledge
>>> something, you processed it.  That's tricky.
>>>
>>> It might be easier to say that a QUIC acknowledgment for a DATAGRAM
>>> frame doesn't mean that it was received and processed by an
>>> application.  An endpoint might discard these frames before passing
>>> them on to applications if it doesn't have space.  In other words,
>>> acknowledgment of DATAGRAM means that QUIC got it, not that the
>>> application got it.  Sadly, that means that the QUIC acknowledgment
>>> machinery doesn't help the application that uses DATAGRAM all that
>>> much.  Also, the lower bound on reliability is 0, which isn't the best
>>> thing ever.
>>>
>>> Hard choices, I know.  I don't have a good design for maintaining
>>> connection-level flow control (or any back pressure mechanism with
>>> equivalent properties) that doesn't add both complexity and overhead.
>>>
>>> Cheers,
>>> Martin
>>>
>>>
>>
>