Re: [quicwg/base-drafts] Use "Insert Count" rather than "Largest Reference" (#2111)

afrind <notifications@github.com> Tue, 18 December 2018 21:41 UTC

Return-Path: <bounces+848413-a050-quic-issues=ietf.org@sgmail.github.com>
X-Original-To: quic-issues@ietfa.amsl.com
Delivered-To: quic-issues@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id F01B3130F1D for <quic-issues@ietfa.amsl.com>; Tue, 18 Dec 2018 13:41:12 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -3.065
X-Spam-Level:
X-Spam-Status: No, score=-3.065 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.065, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=github.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 f3zMBWJRW8Rt for <quic-issues@ietfa.amsl.com>; Tue, 18 Dec 2018 13:41:10 -0800 (PST)
Received: from o9.sgmail.github.com (o9.sgmail.github.com [167.89.101.2]) (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 0E0F8130F19 for <quic-issues@ietf.org>; Tue, 18 Dec 2018 13:41:09 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=github.com; h=from:reply-to:to:cc:in-reply-to:references:subject:mime-version:content-type:content-transfer-encoding:list-id:list-archive:list-post:list-unsubscribe; s=s20150108; bh=1kP4P+2OQCdBVwR3/75MJtOtgqs=; b=hfNlVdgM8HARdUsu zR0Co3MhugWIVXQciLgCoSh50bFpImBH3+QlnTqhUcwFjMRVkoE2UnNW6FH5TO49 b7A8HOA4dfW3vRCvjUlRxrB/iqC8JlEtUAG5Ku7uo/9V/0fQKEA+vE6zJxMyceIU 3Lpy3XCVW3D65nRygWl4s1xM5vM=
Received: by filter1867p1mdw1.sendgrid.net with SMTP id filter1867p1mdw1-20413-5C196972-34 2018-12-18 21:41:06.73401845 +0000 UTC m=+437072.956737889
Received: from github-lowworker-dcc078e.cp1-iad.github.net (unknown [192.30.252.44]) by ismtpd0040p1iad2.sendgrid.net (SG) with ESMTP id mMDN2voBQcyhawYb3rstpQ for <quic-issues@ietf.org>; Tue, 18 Dec 2018 21:41:06.697 +0000 (UTC)
Received: from github.com (localhost [127.0.0.1]) by github-lowworker-dcc078e.cp1-iad.github.net (Postfix) with ESMTP id 8C2CC2C003E for <quic-issues@ietf.org>; Tue, 18 Dec 2018 13:41:06 -0800 (PST)
Date: Tue, 18 Dec 2018 21:41:06 +0000
From: afrind <notifications@github.com>
Reply-To: quicwg/base-drafts <reply+0166e4ab5dc3f4fdc704094175e1d86aa0321110d7bde8be92cf0000000118312b7292a169ce17392ee3@reply.github.com>
To: quicwg/base-drafts <base-drafts@noreply.github.com>
Cc: Subscribed <subscribed@noreply.github.com>
Message-ID: <quicwg/base-drafts/pull/2111/review/186287017@github.com>
In-Reply-To: <quicwg/base-drafts/pull/2111@github.com>
References: <quicwg/base-drafts/pull/2111@github.com>
Subject: Re: [quicwg/base-drafts] Use "Insert Count" rather than "Largest Reference" (#2111)
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="--==_mimepart_5c1969728a7f5_170d3fe80d4d45c4117850"; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: afrind
X-GitHub-Recipient: quic-issues
X-GitHub-Reason: subscribed
X-Auto-Response-Suppress: All
X-GitHub-Recipient-Address: quic-issues@ietf.org
X-SG-EID: l64QuQ2uJCcEyUykJbxN122A6QRmEpucztpreh3Pak1N6ktBXB+SNW5DcNhJQ0lTOqYZsXIOBp8u2g Ugpu3cr+cF3tiqFGUII1UMYCta5uOzMM/FpekfpYtHlxEaREn23wOYPspW6wvcK3rfFlhkIw37P/70 kUcOonZh5ubB1YU8aC+hvV6PdYa9FQNJzLKrtxkfvMq/WKd5AIEPpXP8MQ==
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic-issues/_R1xC8FXsqFzOJuFIpYtDTnRIrI>
X-BeenThere: quic-issues@ietf.org
X-Mailman-Version: 2.1.29
List-Id: Notification list for GitHub issues related to the QUIC WG <quic-issues.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic-issues>, <mailto:quic-issues-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic-issues/>
List-Post: <mailto:quic-issues@ietf.org>
List-Help: <mailto:quic-issues-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic-issues>, <mailto:quic-issues-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 18 Dec 2018 21:41:13 -0000

afrind commented on this pull request.

I'm not really sure that Largest Reference was so unclear or that this provides substantially more clarity.  Interested to hear what other think as well.

> @@ -249,18 +250,19 @@ Because QUIC does not guarantee order between data on different streams, a
 header block might reference an entry in the dynamic table that has not yet been
 received.
 
-Each header block contains a Largest Reference ({{header-prefix}}) which
-identifies the table state necessary for decoding. If the greatest absolute
-index in the dynamic table is less than the value of the Largest Reference, the
-stream is considered "blocked."  While blocked, header field data SHOULD remain
-in the blocked stream's flow control window.  When the Largest Reference is
-zero, the frame contains no references to the dynamic table and can always be
-processed immediately. A stream becomes unblocked when the greatest absolute
-index in the dynamic table becomes greater than or equal to the Largest
-Reference for all header blocks the decoder has started reading from the stream.
-If the decoder encounters a header block where the actual largest reference is
-not equal to the Largest Reference declared in the prefix, it MAY treat this as
-a stream error of type HTTP_QPACK_DECOMPRESSION_FAILED.
+Each header block contains the total number of entries added to the dynamic
+table - the Insert Count - which identifies the table state necessary for
+decoding (see {{header-prefix}}). If the Insert Count is greater than the number

I think this will be somewhat confusing, because the state of the table at the encoder at the time of encoding (insert count) can be different than the table state (insert count) required to decode a particular block.  Maybe if you called it 'Required Insert Count' in the header prefix that would make it clear that an encoder shouldn't just blindly use the actual Insert Count?

>  
 n = count of entries inserted
 d = count of entries dropped
 ~~~~~
 {: title="Example Dynamic Table Indexing - Control Stream"}
 
 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the Base
-Index at the beginning of the header block (see {{header-prefix}}). The Base
-Index is an absolute index. When interpreting the rest of the frame, the entry
-identified by Base Index has a relative index of zero.  The relative indices of
-entries do not change while interpreting headers on a request or push stream.
+instructions on the encoder stream, relative indices are relative to the Base at
+the beginning of the header block (see {{header-prefix}}). The Base is encoded
+as a value relative to the Insert Count, so it can be expressed as the number of
+entries inserted. The dynamic table entries up to the Base can be referenced.

What about post-base?

>  
 n = count of entries inserted
 d = count of entries dropped
 ~~~~~
 {: title="Example Dynamic Table Indexing - Control Stream"}
 
 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the Base
-Index at the beginning of the header block (see {{header-prefix}}). The Base
-Index is an absolute index. When interpreting the rest of the frame, the entry
-identified by Base Index has a relative index of zero.  The relative indices of
-entries do not change while interpreting headers on a request or push stream.
+instructions on the encoder stream, relative indices are relative to the Base at
+the beginning of the header block (see {{header-prefix}}). The Base is encoded
+as a value relative to the Insert Count, so it can be expressed as the number of
+entries inserted. The dynamic table entries up to the Base can be referenced.

> The Base is encoded as a value relative to the Insert Count, so it can be expressed as the number entries inserted

I'm having a hard time understanding why you are trying to say here.  That Base in the number of entries inserted?  Or the encoding of Base is the number of entries inserted?

>  
 n = count of entries inserted
 d = count of entries dropped
 ~~~~~
 {: title="Example Dynamic Table Indexing - Control Stream"}
 
 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the Base
-Index at the beginning of the header block (see {{header-prefix}}). The Base
-Index is an absolute index. When interpreting the rest of the frame, the entry
-identified by Base Index has a relative index of zero.  The relative indices of
-entries do not change while interpreting headers on a request or push stream.
+instructions on the encoder stream, relative indices are relative to the Base at
+the beginning of the header block (see {{header-prefix}}). The Base is encoded
+as a value relative to the Insert Count, so it can be expressed as the number of
+entries inserted. The dynamic table entries up to the Base can be referenced.
+The most recently inserted entry within the limit set by the Base has a relative
+index of 0.
+
+Though new entries could be added while processing a header block, the relative
+indices of entries do not change.

How are new entries added while processing a header block?  Do you mean on the encoder side?  Maybe encoding would be better than processing then?

>  
 In order to identify which dynamic table entries can be safely used
 without a stream becoming blocked, the encoder tracks the absolute index of the
-decoder's Largest Known Received entry.
+decoder's Known Received Count entry.

What is the decoder's Known Received Count entry?  That doesn't really make sense to me, maybe just this sentence needs rewording.

What the encoder is tracking is the state of the decoder.  The state of either the encoder or the decoder can be uniquely identified by the number of inserts that it has performed on its dynamic table.  

Would it be helpful to call the a table's 'State' or 'Version'?  Or maybe change it from "Known Received Count" to "Decoder's Known Insert Count"?

>  
 n = count of entries inserted
 d = count of entries dropped
 ~~~~~
 {: title="Example Dynamic Table Indexing - Control Stream"}
 
 Because frames from request streams can be delivered out of order with
-instructions on the encoder stream, relative indices are relative to the Base
-Index at the beginning of the header block (see {{header-prefix}}). The Base
-Index is an absolute index. When interpreting the rest of the frame, the entry
-identified by Base Index has a relative index of zero.  The relative indices of
-entries do not change while interpreting headers on a request or push stream.
+instructions on the encoder stream, relative indices are relative to the Base at
+the beginning of the header block (see {{header-prefix}}). The Base is encoded
+as a value relative to the Insert Count, so it can be expressed as the number of
+entries inserted. The dynamic table entries up to the Base can be referenced.
+The most recently inserted entry within the limit set by the Base has a relative

> The most recently inserted entry with the limit set by the Base

I think this is where calling it Base rather than Base Index becomes awkward.  Base Index tells you which entry in the table is relative index 0.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2111#pullrequestreview-186287017