Re: Core drafts -02 out

"Charles 'Buck' Krasic" <ckrasic@google.com> Fri, 24 March 2017 00:18 UTC

Return-Path: <ckrasic@google.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 E09D2129851 for <quic@ietfa.amsl.com>; Thu, 23 Mar 2017 17:18:36 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.7
X-Spam-Level:
X-Spam-Status: No, score=-2.7 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_LOW=-0.7, RP_MATCHES_RCVD=-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=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 tsqPZNT-5sZq for <quic@ietfa.amsl.com>; Thu, 23 Mar 2017 17:18:32 -0700 (PDT)
Received: from mail-it0-x229.google.com (mail-it0-x229.google.com [IPv6:2607:f8b0:4001:c0b::229]) (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 663D2128BE1 for <quic@ietf.org>; Thu, 23 Mar 2017 17:18:32 -0700 (PDT)
Received: by mail-it0-x229.google.com with SMTP id y18so3526424itc.1 for <quic@ietf.org>; Thu, 23 Mar 2017 17:18:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=QnW+nf+GHtARk5UpVJv5zr6oykagX3t+0EmDfl9OfPg=; b=FDcWtbTwiV49+evUp+DT6zqpUCxNM63JSBAaQV49Bz4WDPZnqeMfXCTx1uvu5EGf6a RW1R36gqOWyHZ2EviFsCJqn+MdXz4LDOW37B1KsPb3/67RS19G6TwsiYau3U4Kw5yWCG rZbZDrwSyp+ecAk6u+VY+9pPwYVr9XVm71lJq9H/yR+y9JgURyYFabGi6YFOKxmhltVd STq+zsTJ688k9fzMHFEYrWN9CfzDBcEQO4xOL2mR/PbM6Nu7qC1YBzdY62P0DI53JjVv rCw9rlfJ/84g53IpqOpF9q45eVxxTPN+qXZ9NavVCyKojFZNFbWqrFR8A3HSQ2INQMGs v0Bg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=QnW+nf+GHtARk5UpVJv5zr6oykagX3t+0EmDfl9OfPg=; b=LZoirLs0BHaZfU/XPUYxuAUm7cMFBPi8u0fX7N8M/w3qw8jmEOphltIm+8kzCvWr4R z4N9L9KfKL9BtguDzi95+j2ycmt14FtnWFK2aU6RLD0BS5NFP9TbSOo0j1fLs7NC3DbL hKZPtQMCznH9qImc/xg7t3PKhAqtr5r+qqLKQxO9R8AoKENpTxBQnPT4UoDzEKhFz8vO NutbDjxzHZN2NVNY7YUajUn2kNMi4EsqwCmsuJNXH3VQU4qBjgFQ8dCgIzbiaOiooXMS xfGe+C+YUmHIJu1fwWkoRViZ9R+LaTanraErqg/+ol/y5Ok8/0nfFYjPYp4EiFjxkTS6 dLUg==
X-Gm-Message-State: AFeK/H3tzDxe+vWtVX9F15hiCYzbSvaaCs44H9nTCNbsRrW/TefytiUvl8NW3O9tpaLdri2xVh5AvqkCCpKTX3qu
X-Received: by 10.36.13.70 with SMTP id 67mr508905itx.65.1490314711289; Thu, 23 Mar 2017 17:18:31 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.36.200.4 with HTTP; Thu, 23 Mar 2017 17:18:10 -0700 (PDT)
In-Reply-To: <BN6PR03MB27084E9ADE721FFF85980DEF873F0@BN6PR03MB2708.namprd03.prod.outlook.com>
References: <CABkgnnUdnfwAUyCKieSgYAaTSKSMu16F+HCCBSd+WWhh+U0iyQ@mail.gmail.com> <75F554C8-74A5-40A3-816B-979272F8A147@greenbytes.de> <BN6PR03MB270881C57219DC6046BBC40787270@BN6PR03MB2708.namprd03.prod.outlook.com> <CAD-iZUYcKCLtv-mW5LPAwx18DHR_U2_xT_NToPLmxxtm5Z8Aqg@mail.gmail.com> <BN6PR03MB2708B2829B54BFF5DE1DA82C873F0@BN6PR03MB2708.namprd03.prod.outlook.com> <CAD-iZUY4w9H2p66MN8V_95DPE0bNDQ8qzumFCoVUVxKS5TM88A@mail.gmail.com> <BN6PR03MB27084E9ADE721FFF85980DEF873F0@BN6PR03MB2708.namprd03.prod.outlook.com>
From: Charles 'Buck' Krasic <ckrasic@google.com>
Date: Thu, 23 Mar 2017 17:18:10 -0700
Message-ID: <CAD-iZUZjMvnqqiM5ODxDUXbxhYUupfximPoNo2hVO0CKcKcvjg@mail.gmail.com>
Subject: Re: Core drafts -02 out
To: Mike Bishop <Michael.Bishop@microsoft.com>
Cc: Stefan Eissing <stefan.eissing@greenbytes.de>, Martin Thomson <martin.thomson@gmail.com>, IETF QUIC WG <quic@ietf.org>
Content-Type: multipart/alternative; boundary="001a1143db5cf89c5e054b6eee6b"
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/Go0Y9jcBxuyI1qivR_2Komt1Kco>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.22
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: Fri, 24 Mar 2017 00:18:37 -0000

On Thu, Mar 23, 2017 at 4:12 PM, Mike Bishop <Michael.Bishop@microsoft.com>
wrote:

> With regard to header block versus frame, though, you explicitly said in
> your reply before that the encoder can switch modes between frames in a
> single block.  So I think you mean what you wrote; it’s just that switching
> whether things can be interpreted out of order mid-block feels weird.
>

You're right.  After re-reading Header Compression and Decompression
<https://tools.ietf.org/html/rfc7540#section-4.3> just now, I see that
 I've been messing up the terminology, I was confusing header blocks with
header block fragments.  I will take a pass to correct that, and I think I
need to call out that what I'm proposing diverges from the HTTP/2
description---my thinking is that a header block should be serialized
packet/fragment-wise, as opposed to rfc5740 which says serialize the whole
header block and then divide it into header block fragments.

I agree that switching mid-block would feel weird, but it wouldn't be
common at all.  It should only be necessary if the table becomes full.  I
think experience will bear out that avoiding that


>
> And POSIX or not, I don't think you can unilaterally define a semantic
> about delivery to the remote app layer.  Though you could come close – if
> the call completed when the written data and all preceding data on the
> stream had been ACK’d, you know at least that the data is available to the
> remote app layer – whether it reads promptly is its own problem.
>

I think you can go further than that and reason correctly about ordering in
a coherent implementation.

If HA has been fully acked before HB is encoded, then I think an
implementation can quite reasonably guarantee that HA will be decoded
before HB.   I am confident this is true of ours.

If it helps clarify at all, I'd remind that our implementation is
single-threaded user level code.   I can imagine how it might be more
difficult (but not impossible) to reason about in an implementation that is
multi-threaded and/or divided across a kernel-user boundary.


>
> Sent from my Windows 10 phone
>
>
>
> *From: *Charles 'Buck' Krasic <ckrasic@google.com>
> *Sent: *Thursday, March 23, 2017 2:58 PM
> *To: *Mike Bishop <Michael.Bishop@microsoft.com>
> *Cc: *Stefan Eissing <stefan.eissing@greenbytes.de>; Martin Thomson
> <martin.thomson@gmail.com>; IETF QUIC WG <quic@ietf.org>
>
> *Subject: *Re: Core drafts -02 out
>
>
>
>
> On Thu, Mar 23, 2017 at 10:52 AM, Mike Bishop <
> Michael.Bishop@microsoft.com> wrote:
>
>> All I see in the links are http:// and the draft name, no host.  I’m
>> guessing you meant https://github.com/krasic/draf
>> t-krasic-quic-hpack/blob/master/draft-krasic-quic-hpack-00.html?  Once
>> the tracker reopens (sometime Sunday, I think) you should probably upload
>> those at datatracker.ietf.org to make it an official submission.  You’ll
>> need to make the draft name in the file match the file name before it will
>> successfully upload.
>>
>>
>>
> Thanks for the prompt feedback!
>
> Apologies, as I mentioned it is my first attempt at an IETF draft, and it
> my first time using the tools as described in SETUP.md
> <https://github.com/martinthomson/i-d-template/blob/master/doc/SETUP.md>.
>
> Until I the tracker reopens and I submit properly, I would suggest
> https://krasic.github.io/draft-krasic-quic-hpack/dra
> ft-krasic-quic-qpack-latest.html
>
>
>> Also, for ease of discussion, you might pick a different name than QPACK,
>> since there’s already a draft with that name.  (Or we both change names,
>> and call the eventually-adopted one QPACK; that’d be fine, too.)
>>
>
> I'm fine with whatever.  If  draft-krasic vs draft-bishop isn't enough to
> differentiate,  how about QPACK-ALT, or maybe QPACK-LITE?
>
>>
>>
>> As to actual feedback:  I see what you’re getting at here because you’ve
>> explained it – the decoder acknowledges the sequence number it’s up to,
>> then the encoder tracks that and uses it on the encode side.  I think I’d
>> have a really hard time parsing the document without that.  I think the
>> strongest advantage of this proposal is that an encoder for this scheme
>> could be used over HTTP/2, enabling shared code; you should bring that out
>> more.
>>
>
> I'll try to rework the text to emphise those points more and clarify.
>
> Nits:  the decoder per-se doesn't ack, but the encoder tracks using
> existing transport level ack mechanisms (more on this below).   Also, I
> think of this scheme as something a shared implementation could offer as an
> option, but I hadn't imagined the option would be ever be enabled in
> HTTP/2.  It might be interesting to consider though.
>
>>
>>
>> The way you’ve described the encoder requires tight integration between
>> the packetization logic and the header compressor in two ways:
>>
>>    - It needs to know the “packet epoch” (encode epoch of the first
>>    frame in the current packet) while compressing, but until you know the size
>>    of the compressed output, you can’t know whether it will fit in the current
>>    packet.  That in turn means you’ll need to roll back any state and
>>    re-encode with a different packet epoch if it turns out not to fit.
>>
>> I don't think roll back is esssential.
>
> The space available in the current packet could be known when invoking the
> hpack encoder, so it would stop emitting representations if the packet
> reaches the space limit, and in that case return a header block that for a
> prefix of the provided header field list, and in later packets it would
> generate a continuation header block(s) for remaining header fields.
>
>
>>    -
>>    - The “commit epoch” is determined, not by data at the compressor
>>    level, but by reaching into the transport and checking which packets
>>    containing the STREAM frames containing the HPACK data in question have
>>    been acknowledged.  Also note that ACK doesn’t signify delivery to the
>>    application layer (HTTP), just presence in the appropriate queue.
>>
>>
>>
> My understanding is that APIs are out of scope of most of the docs.
> However, in our implementation, the stream write interfaces uniformly
> provide a means of to confirm acknowledgement,  so it is possible to do it
> without reaching down.
>
> I agree that ACK doesn't signify delivery to what is above HTTP, but one
> of advantages of not having legacy APIs (POSIX sockets) between QUIC and
> HTTP is that the implemenation can certainly ensure that ACK signifies
> delivery to HTTP.
>
>> In 2.2.1.1, the encoder is informed whether “QPACK is enabled,” but since
>> that can be toggled on/off on a per-header-frame basis (and I hope you
>> really meant per-header-block), it seems like the decoder is just following
>> the encoder’s lead on this.  Who’s actually making that decision?  You say
>> it gets turned off if a drop results, but the encoder is the one who
>> knows/determines that.
>>
> Yes, all decisions are made by the encoder, and as in HPACK the decoder
> strictly follows the encoder's lead.
>
> The "informed" language was simply alluding to the encoder side of the
> HPACK API being extended with QPACK related params.
>
> And yes, I meant "header block".  Will fix that.
>
> This has the same problem as the current HPACK state that RST on a control
>> stream loses critical data and there’s no way to recover.  I’m personally
>> hoping we can make our way out of that requirement.
>>
> My position is that REFUSED should be the only kind of RST needed or
> allowed for control streams, and dealing with that is tractible.
>
>
>>
>> *From:* Charles 'Buck' Krasic [mailto:ckrasic@google.com]
>> *Sent:* Tuesday, March 21, 2017 6:04 PM
>> *To:* Mike Bishop <Michael.Bishop@microsoft.com>
>> *Cc:* Stefan Eissing <stefan.eissing@greenbytes.de>; Martin Thomson <
>> martin.thomson@gmail.com>; IETF QUIC WG <quic@ietf.org>
>>
>> *Subject:* Re: Core drafts -02 out
>>
>>
>>
>> Hi Folks.
>>
>>
>>
>> I've put together a first attempt at my QPACK proposal:
>>
>>
>>
>> draft-krasic-quic-hpack-00.html
>>
>> draft-krasic-quic-hpack-00.txt
>> <https://krasic.github.io/draft-krasic-quic-hpack/draft-krasic-quic-hpack-00.txt>
>>
>>
>>
>> Apologies in advance, this is my first attempt at an IETF draft.
>>
>>
>>
>>
>>
>> On Wed, Mar 15, 2017 at 10:37 AM, Mike Bishop <
>> Michael.Bishop@microsoft.com> wrote:
>>
>> Thanks for the feedback!
>>
>> Yes, you've run straight into the big quandary with HPACK.  I don't think
>> anyone expects that we will ship this way; I have a proposal in
>> https://tools.ietf.org/html/draft-bishop-quic-http-and-qpack for an
>> HPACK-replacement that would solve many of these.  Buck Krasic has a
>> proposal which he has sketched in e-mail but not submitted as a draft.  The
>> main point of the sequence number was to get us off the "everything on
>> stream 3" model and let us sort out the problems of HPACK later.  #228
>> tracks fixing HPACK, in whatever form that takes.
>>
>> We could solve it in the same way that we did PRIORITY, by adding an
>> "affected stream number" field and moving the HEADERS/PUSH_PROMISE frames
>> to Stream 3 as well.  However, that is just as blocking as the current
>> approach, so not really an improvement.  Worse, the reason we can tolerate
>> large header frames is because they occur on their own streams and don't
>> block arrival of data from other streams.  If all headers occur on a single
>> stream, that's not true -- you *are* blocking muxing of other streams again.
>>
>> I like the comparison to concurrent edits.  We've discussed having
>> rolling deltas in various mechanisms; the problem is that it requires
>> reaching into the transport for ACK state to figure out when you can
>> discard old deltas for good on the receiver side.  Buck's proposal is
>> similar, essentially requiring the receiver to echo back the point up to
>> which it has received all frames, and the sender shouldn't reference state
>> that the receiver hasn't fully assimilated yet.  It feels like adding
>> application-level ACKs to me, which I'd like to avoid.
>>
>> HPACK is also one of the reasons for the two-stream-per-request
>> approach.  There are two reasons for this -- one is that HPACK frames (in
>> the current design) can't be lost when a stream is RST, so the draft
>> forbids resetting control streams.  Since we still need to be able to RST
>> requests, we add the semantic that killing the data stream implies the same
>> thing about the control stream.  It's messy, and hopefully we can remove
>> that once HPACK is fixed.  The second, as you guessed, is not dealing with
>> DATA frames.  #245 notes that, if we fix HPACK, we could go back to a
>> single stream per request; proponents of both "keep framing out of the way"
>> and "fewer streams is easier to manage" have weighed in there.  Please add
>> your voice.
>>
>> As to buffering, it's actually easy enough -- just don't read from data
>> streams until you've seen the headers.  Sure, the sender will fill up their
>> flow control window on that stream -- and then they'll stop and send you
>> QUIC BLOCKED frames, until you start reading the body and generating
>> WINDOW_UPDATE frames.  One of the biggest arguments for two streams in my
>> mind is making sure that a request blocked in this way doesn't impede the
>> flow of control frames on that stream -- for example, should we
>> successfully get certificate auth frames added, a certificate request.
>> I've had two customers this week telling me it's a bug in our server code
>> that their TLS reneg gets stuck in TCP buffers behind a giant request body,
>> because the server won't read an unauthenticated body and the client won't
>> hold off sending the body until authentication succeeds.  I'd like to see
>> blocks like that become less possible in QUIC, at least.
>>
>> Yes, making SETTINGS immutable reduces the flexibility.  The opinion at
>> the interim was that we could live without it, as we know of exactly one
>> implementation of one extension that does mid-stream setting changes, and I
>> own it.  😊  If there's a compelling use case for changing settings
>> mid-stream we weren't aware of, that's new information that could justify
>> the complexity.  (But note that with 0-RTT connection setup, it would be
>> nearly as cheap to open a new connection with the new setting and
>> transition your traffic to it.)
>>
>> Negotiation still works, since each side would simply advertise that they
>> support an extension or not, and consider the extension to be active once
>> you've seen the other side's SETTINGS frame.  See
>> https://tools.ietf.org/html/draft-ietf-quic-http-01#section-5.2.5.3 for
>> the complexity this allowed us to remove.  An extension could add to the
>> list easily -- if you support extension X, you should also remember the
>> value for setting X_VAL.  Clients that don't use the extension don't care.
>> An extension that needed some more complex negotiation would have to use an
>> extension-specific frame, it's true, but we haven't so far seen an
>> extension do that.
>>
>> -----Original Message-----
>> From: QUIC [mailto:quic-bounces@ietf.org] On Behalf Of Stefan Eissing
>> Sent: Wednesday, March 15, 2017 6:22 AM
>> To: Martin Thomson <martin.thomson@gmail.com>; IETF QUIC WG <
>> quic@ietf.org>
>> Subject: Re: Core drafts -02 out
>>
>>
>> > Am 14.03.2017 um 00:57 schrieb Martin Thomson <martin.thomson@gmail.com
>> >:
>> >
>> > The editors have submitted -02 versions of the base set of QUIC drafts.
>> [...]
>> > https://tools.ietf.org/html/draft-ietf-quic-http-02
>>
>> Thanks, Martin! I assume that was announced to get feedback from the
>> lurkers here. ;-)
>>
>> I'll give this a try. All mistakes and misunderstandings are mine alone.
>>
>> ------------------------------------------------------------
>> -----------------------------
>>
>> Very well written spec. Easy to understand for someone having read rfc
>> 7540 a bit.
>>
>> I have some comments to the proposed HTTP mapping approach. Where the wg
>> has already discussed and exhausted alternatives, please excuse my
>> ignorance and ignore my comments. I had not the time to follow all
>> discussions ongoing on this topic. Feel free to cherry-pick what seems
>> helpful.
>>
>>
>> > 4.  Stream Mapping and Usage
>>
>> +1 to directly using quic stream ids instead of virtual h2 stream
>> +identifier
>>
>>
>> However, using 2 quic streams for a single request/response does not sit
>> well with me. I assume that stems from the wish to get rid of DATA frames.
>> Which sounds nice, but is it worth it? By doubling the # of streams for a
>> client, how much overhead does that introduce (I speak of a server holding
>> >10k quic "connections")?
>>
>> Also, the server needs to buffer data on quic streams 7, 11, 15, etc.
>> because HEADERs might arrive some time in the future on streams 5, 9, 13,
>> etc. or not. There is no way to route this data somewhere, because the meta
>> information is still missing.
>>
>> And there is still Holb on:
>>
>> > 4.2.1.  Header Compression
>> > ...
>> > DISCUSS:  Keep HPACK with HOLB?  Redesign HPACK to be order-
>> >       invariant?  How much do we need to retain compatibility with
>> >       HTTP/2's HPACK?
>>
>> Using a counter in HEADERS is a crutch:
>> - it is a highly specific solution to a common problem in http/quic:
>> synchronicity in connection level state changes. SETTINGS (see below) has
>> the same problem, as does have PRIORITY in HEADERS. It seems that
>> performance wise, all HEADERS could as well be sent on stream 3.
>>
>> Now, solving Hol blocking for HEADERS would be a fine achievement.
>>
>> > 5.  HTTP Framing Layer
>> > Frames are used only on the connection (stream 3) and message
>> >    (streams 5, 9, etc.) control streams.
>>
>> And streams 4, 8, 12, etc. I assume.
>>
>> > 5.2.3.  SETTINGS
>> > ...
>> > SETTINGS frames always apply to a connection, never a single stream.
>> >  A SETTINGS frame MUST be sent as the first frame of the connection
>> > control stream (see Section 4) by each peer, and MUST NOT be sent
>> > subsequently or on any other stream.  If an endpoint receives an
>> > SETTINGS frame on a different stream, the endpoint MUST respond with
>> > a connection error of type HTTP_SETTINGS_ON_WRONG_STREAM.  If an
>> > endpoint receives a second SETTINGS frame, the endpoint MUST respond
>> > with a connection error of type HTTP_MULTIPLE_SETTINGS.
>>
>> What about HPACK state? The connection state change problem again visible.
>>
>> This is a severe restriction on extensions mechanisms that want to affect
>> a connection. Because if the http/quic does not solve this problem, how are
>> they expected to do it? They either announce themselves on the first
>> SETTINGS or remain silent forever, it seems. How would an extension
>> handshake work then? Own stream 3 handshake frames?
>>
>> > 5.2.3.3.  Usage in 0-RTT
>>
>> What about HPACK state? Does it need to be kept or is it reset?
>>
>> > HTTP_PUSH_ALREADY_IN_CACHE (0x03):  The server has attempted to push
>> >      content which the client has cached.
>> > ...
>> > HTTP_REQUEST_CANCELLED (0x04):  The client no longer needs the
>> >     requested data.
>>
>> Nitpick: seems redundant. The first could be replaced by the second.
>> Stream number will suffice.
>>
>> ----------------------------------------------------------
>>
>> Taking two steps back:
>>
>> I think the main difficulty comes from the lack of a "hq connection
>> state" concept and how changes to that state can be managed. Evidence:
>> - The 0-RTT mentions certain SETTINGS that need to be remembered by a
>> client. How would an extension add to this? Will every extension have to
>> come up with its own solution?
>> - The HEADERs sequence number is a highly specific fix for the missing
>> state change
>> - The SETTINGS-ONCE restriction simply avoids the problem by killing a h2
>> mechanism
>>
>> If hq defines stream 3 as the place where connection state changes happen
>> *AND* synchronizes OPEN/CLOSE/RST of other streams on it, client and server
>> can have shareable concept of the connection state.
>>
>>
>> I am no HPACK expert. The basic problem looks like concurrent editing
>> against a repository.
>> Both client and server start with connection state zero (CS-0) and the
>> predefined HPACK dictionary (HP-0). After SETTINGS exchange, client is in
>> CS-1 and server is in CS-2 for its side. Let's call the  CS-1 HPACK state
>> HP-1.
>>
>> Client sends new HEADERS on 5 and keeps the HPACK delta around (HP-1.5).
>> The HEADERS carries the connection state number it is based on (CS-1).
>> Client sends new HEADERS on stream 9, also based on CS-1. Client keeps that
>> delta around (HP-1.9).
>>
>> Client then decides to announce a new connection state (CS-3) by sending
>> how it applied the deltas HP-1.5 and HP-1.9 to come up with HP-3. The
>> description allows the server to update its HP-1 to HP-3 as well.
>>
>> Response HEADERS are also based on a server connection state, explicitly,
>> so the client knows which HP-X to use when decoding them. At some time, the
>> server sends an announcment of CS-4 with HPACK data on stream 3 back to the
>> client.
>>
>> For a 0-RTT, client and server could exchange the connection state id in
>> the initial SETTINGS, to make sure they have at least the same name
>> remembered as the other side. Client: "I was in CS-19 and you were in
>> CS-8." Server: "Yep."
>>
>> By implicitly adding all SETTINGS changes to connection states, the
>> problem is also solved for extensions.
>>
>> If one side receives HEADERS with an unknown connection state:
>> - if the state id is greater than any known one: set a stream timeout and
>> wait for changes on stream 3 to arrive
>> - state id less than max(known conn state): STREAM_RST_UNKNOWN_CONN_STATE
>>
>> New SETTINGS value: MAX_CONN_STATE number of maximum connection state the
>> client/server is willing to keep, exchanged initially. Announcing a new
>> connection state allows the other side to drop the lowest one, if
>> MAX_CONN_STATE are used.
>>
>> To get optimal HPACK size compression, every HEADERs would also announce
>> a new connections state. To have less potential HOLB, connection states do
>> not change during request bursts.
>>
>> Something like that.
>>
>> -Stefan
>>
>>
>>
>>
>>
>> --
>>
>> Charles 'Buck' Krasic | Software Engineer | ckrasic@google.com | +1 (408)
>> 412-1141
>>
>
>
>
> --
> Charles 'Buck' Krasic | Software Engineer | ckrasic@google.com | +1 (408)
> 412-1141 <(408)%20412-1141>
>
>


-- 
Charles 'Buck' Krasic | Software Engineer | ckrasic@google.com | +1 (408)
412-1141