Re: HTTP/3 server push: handling of lost PUSH_PROMISE
Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> Thu, 29 July 2021 01:47 UTC
Return-Path: <tatsuhiro.t@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 EB9D83A0AA1 for <quic@ietfa.amsl.com>; Wed, 28 Jul 2021 18:47:33 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.097
X-Spam-Level:
X-Spam-Status: No, score=-2.097 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, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=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 lQAszKqxXCpy for <quic@ietfa.amsl.com>; Wed, 28 Jul 2021 18:47:29 -0700 (PDT)
Received: from mail-oo1-xc34.google.com (mail-oo1-xc34.google.com [IPv6:2607:f8b0:4864:20::c34]) (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 515413A0A9F for <quic@ietf.org>; Wed, 28 Jul 2021 18:47:29 -0700 (PDT)
Received: by mail-oo1-xc34.google.com with SMTP id y11-20020a4ade0b0000b029024b4146e2f5so1158069oot.1 for <quic@ietf.org>; Wed, 28 Jul 2021 18:47:29 -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; bh=t9q/ubLj3s671WWU7VyLpJn1PUfCKhdTeyzWiWHbZoc=; b=DNu5ajAw6TIoVEB0dS0WF2+C28ExY5GLsy1V9JkZYwJv9al7qjZ5grP5F1U8zK4yX1 OxjN1FG8dsAXPd2DeWd8Ap5Y5vtbMy4f5f0y97saSY0ihWrd+2Mjf23lqAtS8arA7UJF gK7z0yhilENOBK5FbzrubwR1kLKUbKMyJalp1J/1TcCSMes2s5Ff2czPsmPdNydN2gAa yeG8PPiYzUIpA+RxfXgD0ruXbm5DG5gvoIAeYa9QMWgB/l+t+DBfCedQ3Qpsgl6JW3Hm buj2vgatH+FBgTFtpQZ41KrCJOXOxU+9mJCJazyzEPu1P/yam6sgrR85Gcmw0Ux1HK7B etew==
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; bh=t9q/ubLj3s671WWU7VyLpJn1PUfCKhdTeyzWiWHbZoc=; b=YQRBS0We6MhY2PmQdh7PonbkVSXvIA8AoLTj/iiAQ5S8Tx/bgaBIJlgOCP6VJFRTE7 eWXCg8WamNKZmBTNPrYUAQ7C3UeP+wva6sDJ52+kPdiGes2/uu+ElAfV4pchmQsiBPar vulKwRLWGs/3BlEJ3dmJPQitDK92PkhoV/VVAiGDDkj67c2HEgHAfkR2++dLnSjS9mTY i37pjvWCpBERGZhGvksebQzO47zazCebD/Kw/N5WQSKhsd+SbhAx7XgfwIwV4d0pyex6 BIHoCiPqJXKYqlUfOBb4pbbqExX0Y+z1JtfJ5e3yYA4q7bq94NbUvAI2TPasLGN/cZFm tF9w==
X-Gm-Message-State: AOAM533+Sm1cAT8f3v7+NNOrb+npCChnp69hA1uJB+fAM+T2b3Mry514 ce9zHRq7O8GeIE0egtYaaOp7orjnE4Q0cgdTpm+ucq+49ks=
X-Google-Smtp-Source: ABdhPJyoUB2pXhNprNBiiPnMTlN+bYm9+BD3b19mh5kHGTwrQOT0KJUySbGKaohK7aNDgNXTPkudHm771vZ9QiwwomA=
X-Received: by 2002:a4a:e9e8:: with SMTP id w8mr1425664ooc.5.1627523246034; Wed, 28 Jul 2021 18:47:26 -0700 (PDT)
MIME-Version: 1.0
References: <CAPyZ6=+tCHNGYq0Za38-pju23_d_2wwXbWMgCbJK_Ou8mH3aKQ@mail.gmail.com> <72de8a9e-9f93-4bdc-8c2a-3f359beb94ac@www.fastmail.com> <CAPyZ6=+he3A0y_PtdDmUcG0vSgczPMqOwKLLY37ZUACpAz46kw@mail.gmail.com> <CANatvzxG+Y+Zm5W3-d=_xUdUQMNX2No2CjMNNXBzrGkq245jxA@mail.gmail.com> <CAPyZ6=J5ZthTBH6TxGxgmMQnhQVLQJbtp_HNrRfxjbd5DJmG=A@mail.gmail.com> <CANatvzxCV1OCx=boOqYiRCJQyGP-b4bQYHUUv0oOJyz3KeU--g@mail.gmail.com>
In-Reply-To: <CANatvzxCV1OCx=boOqYiRCJQyGP-b4bQYHUUv0oOJyz3KeU--g@mail.gmail.com>
From: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Date: Thu, 29 Jul 2021 10:47:15 +0900
Message-ID: <CAPyZ6=JnWbRr2s_QzBQwbUBLzeiEK6uOAcBk8yUDg=LbscfGpg@mail.gmail.com>
Subject: Re: HTTP/3 server push: handling of lost PUSH_PROMISE
To: IETF QUIC WG <quic@ietf.org>
Content-Type: multipart/alternative; boundary="000000000000f1927105c839486b"
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/z5IPEVLcqrb4fa-PVdBykwaOVM8>
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: Thu, 29 Jul 2021 01:47:34 -0000
Hi, On Thu, Jul 29, 2021 at 8:49 AM Kazuho Oku <kazuhooku@gmail.com> wrote: > > > 2021年7月28日(水) 11:53 Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>: > >> Hi, >> >> On Wed, Jul 28, 2021 at 9:21 AM Kazuho Oku <kazuhooku@gmail.com> wrote: >> >>> Tatsuhiro, thank you for raising the issue. >>> >>> I actually wonder if the example being provided is a tip of an iceberg - >>> is the problem related to FIN at all? >>> >>> Let's consider the following pattern: >>> >>> * client sends a request >>> * server starts sending response, alongside a PUSH_PROMISE >>> * in addition, server initiates a push stream and starts sending data >>> * server-sent packets carrying the PUSH_PROMISE frame are lost >>> * client decides to cancel the request and sends RESET_STREAM & >>> STOP_SENDING >>> * server continues sending the contents of the push stream >>> >>> I could well be missing some aspects of push, but to me, the problem >>> looks like the lack of delivery guarantee of PUSH_PROMISE frames. >>> >>> >> My initial example is intentionally nallowed down to the specific case so >> that client does not send STOP_SENDING, but yes, essentially, you are >> correct that the inherent problem is that server push design relays on the >> PUSH_PROMISE which can be lost. >> > > Thank you for checking. > > I've opened https://github.com/quicwg/base-drafts/issues/4930. > > As stated on the issue, I think that lack of delivery guarantee is not > only a problem for PUSH_PROMISE, but also for Push Stream Header. > > Thank you Kazuho for opening the issue. Best regards, Tatsuhiro Tsujikawa > >> Best regards, >> Tatsuhiro Tsujikawa >> >> >> >> >>> >>> 2021年7月27日(火) 17:56 Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>: >>> >>>> Hi, >>>> >>>> On Tue, Jul 27, 2021 at 3:31 PM Martin Thomson <mt@lowentropy.net> >>>> wrote: >>>> >>>>> This is a case where QUIC processing something doesn't imply HTTP/3 >>>>> processing something. QUIC read the data and "processed" it. HTTP/3 >>>>> decided not to handle it deliberately, and the PUSH_PROMISE fell between >>>>> the cracks. >>>>> >>>>> One "solution" is to insist that endpoints attempt to process streams >>>>> for this stuff if they decide to discard responses. This is like how in >>>>> HTTP/2 you still have to update the HPACK table after resetting a stream. >>>>> It's awkward, but I think that it would work if data is available. I don't >>>>> think that there is any case in which data is unavailable to the client but >>>>> the server doesn't receive STOP_SENDING. >>>>> >>>>> >>>> It is indeed awkward that QUIC stack has to pass stream data all the >>>> way to the end of the stream (or sees RESET_STREAM or closed) to HTTP/3 >>>> client even after it requested stopping reading. And the HTTP/3 client has >>>> to process it just for PUSH_PROMISE. Does any implementation do this? >>>> >>>> Sending STOP_SENDING alone is not enough. As I wrote in the previous >>>> post, by the time STOP_SENDING is received by the HTTP/3 server, it has >>>> finished processing the pushed stream and forgets it. I imagine that if >>>> QUIC stack provides BSD socket-like interface and HTTP/3 server writes all >>>> data and can clear the memory without waiting for an acknowledgement. >>>> >>>> Best regards, >>>> Tatsuhiro Tsujikawa >>>> >>>> >>>>> On Tue, Jul 27, 2021, at 13:01, Tatsuhiro Tsujikawa wrote: >>>>> > Hi, >>>>> > >>>>> > It looks like in certain conditions, client is unable to process >>>>> pushed >>>>> > stream and leaves it in unprocessable state indefinitely. >>>>> > >>>>> > Consider that client opens bidi stream and server sends PUSH_PROMISE >>>>> > and completes the response body which is very short (just a single >>>>> packet >>>>> > or two). For some reason, client has decided to stop reading >>>>> > response, but FIN is seen (data recvd state), and does not send >>>>> > STOP_SENDING because it is not required (RFC mentions that it has a >>>>> > little value to send STOP_SENDING in data recvd state and >>>>> > unnecessary). Client discards all stream data without handing it >>>>> over >>>>> > to application, so PUSH_PROMISE is not processed. Client does not >>>>> > know the push ID. Because STOP_SENDING is not sent, server has no >>>>> signal >>>>> > which indicates PUSH_PROMISE is not processed, and opens a pushed >>>>> > stream. Client receives pushed stream, but unable to find the >>>>> > corresponding PUSH_PROMISE. It holds pushed stream until it sees >>>>> > PUSH_PROMISE, but it never come. This causes the pushed stream to >>>>> be held by >>>>> > client indefinitely. >>>>> > >>>>> > Even if client sends STOP_SENDING to the bidi stream, it might not >>>>> > work if server finishes sending stream data and a pushed stream and >>>>> > forgets them before receiving STOP_SENDING. >>>>> > >>>>> > Best regards, >>>>> > Tatsuhiro Tsujikawa >>>>> >>>>> >>> >>> -- >>> Kazuho Oku >>> >> > > -- > Kazuho Oku >
- HTTP/3 server push: handling of lost PUSH_PROMISE Tatsuhiro Tsujikawa
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Martin Thomson
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Tatsuhiro Tsujikawa
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Mikkel Fahnøe Jørgensen
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Kazuho Oku
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Tatsuhiro Tsujikawa
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Kazuho Oku
- Re: HTTP/3 server push: handling of lost PUSH_PRO… Tatsuhiro Tsujikawa