Re: [quicwg/base-drafts] Move Generating Acknowledgements to Transport (#2916)

Martin Thomson <> Wed, 11 September 2019 02:42 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 0292F120086 for <>; Tue, 10 Sep 2019 19:42:16 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -8
X-Spam-Status: No, score=-8 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_HI=-5, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (1024-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id cBwCrAHWgi4z for <>; Tue, 10 Sep 2019 19:42:13 -0700 (PDT)
Received: from ( []) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 6B30A1200E6 for <>; Tue, 10 Sep 2019 19:42:13 -0700 (PDT)
Date: Tue, 10 Sep 2019 19:42:12 -0700
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=pf2014; t=1568169732; bh=EtHvokqj+aiQLaSs0I4JamVADj9fwq98ygvreOEpURE=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID: List-Archive:List-Post:List-Unsubscribe:From; b=buInakOVuD9XQN9ig5BHiM6GtRzAUvj4Lst1kH91rGqny159TK+tyoPSqj905PoSg CZgavmuwWaJ7+RmWd7985RgvD74gcW+vk+YLhkoVCkhTFITPRAyLt9n1zC6tNbz4zf vJLhJWk3gUgKVTe0kjgET9r8aZtZN5nAshzahSFk=
From: Martin Thomson <>
Reply-To: quicwg/base-drafts <>
To: quicwg/base-drafts <>
Cc: Subscribed <>
Message-ID: <quicwg/base-drafts/pull/2916/review/>
In-Reply-To: <quicwg/base-drafts/pull/>
References: <quicwg/base-drafts/pull/>
Subject: Re: [quicwg/base-drafts] Move Generating Acknowledgements to Transport (#2916)
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="--==_mimepart_5d785f047c9b4_4c5f3f7f0eacd95c1645be"; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: martinthomson
X-GitHub-Recipient: quic-issues
X-GitHub-Reason: subscribed
X-Auto-Response-Suppress: All
Archived-At: <>
X-Mailman-Version: 2.1.29
List-Id: Notification list for GitHub issues related to the QUIC WG <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Wed, 11 Sep 2019 02:42:16 -0000

martinthomson approved this pull request.

>  ### Sending ACK Frames
-An endpoint sends ACK frames to acknowledge packets it has received and
+An ACK frame SHOULD be sent immediately upon receipt of a second ack-eliciting
+packet. Loss detection does not assume that the peer sends an ACK immediately on
+receiving a second ack-eliciting packet.

These are both good and useful statements, but they sort of stand awkwardly next to each other as if they are strangers.

> An endpoint SHOULD immediately send an ACK frame when two ack-eliciting packets have been received without being acknowledged.  Though the algorithms in {{QUIC-RECOVERY}} do not depend on receivers following this guidance, frequent feedback improves loss and congestion response.

I tried to say something about the fact that this also provides some assurances about acknowledgement behaviour that senders could use when innovating with new algorithms, but it ended up being quite hard to do that without distracting too much from the core purpose of the section.  Also, the SHOULD got in the way: there is no real assurance, there we have to rely on the fact that this is a good recommendation that most deployments will likely respect.

> @@ -3020,9 +3059,34 @@ This ensures an acknowledgment is sent at least once per RTT when packets
 needing acknowledgement are received.  The sender can use the receiver's
 `max_ack_delay` value in determining timeouts for timer-based retransmission.
-Strategies and implications of the frequency of generating acknowledgments are
-discussed in more detail in {{QUIC-RECOVERY}}.
+### Managing ACK Ranges
+When an ACK frame is sent, one or more ranges of acknowledged packets are
+included.  Including older packets reduces the chance of spurious retransmits
+caused by losing previously sent ACK frames, at the cost of larger ACK frames.
+ACK frames SHOULD always acknowledge the most recently received packets, and the
+more out-of-order the packets are, the more important it is to send an updated
+ACK frame quickly, to prevent the peer from declaring a packet as lost and
+spuriously retransmitting the frames it contains.
+Below is one recommended approach for determining what packets to include in an

"Below" is a little imprecise.  Is this the next section, or next several sections?

{{ack-tracking}} and {{ack-limiting}} describe an exemplary approach for determining what packets to acknowledge in each

+### Receiver Tracking of ACK Frames

### Receiver Tracking of ACK Frames {#ack-tracking}

+### Receiver Tracking of ACK Frames
+When a packet containing an ACK frame is sent, the largest acknowledged in that
+frame may be saved.  When a packet containing an ACK frame is acknowledged, the
+receiver can stop acknowledging packets less than or equal to the largest
+acknowledged in the sent ACK frame.
+In cases without ACK frame loss, this algorithm allows for a minimum of 1 RTT
+of reordering. In cases with ACK frame loss and reordering, this approach does
+not guarantee that every acknowledgement is seen by the sender before it is no
+longer included in the ACK frame. Packets could be received out of order and
+all subsequent ACK frames containing them could be lost. In this case, the
+loss recovery algorithm could cause spurious retransmits, but the sender will
+continue making forward progress.
 ### Limiting ACK Ranges

### Limiting ACK Ranges {#ack-limiting}

> +### Measuring and Reporting Host Delay {#host-delay}
+An endpoint measures the delays intentionally introduced between when an
+ACK-eliciting packet is received and the corresponding acknowledgment is sent.
+The endpoint encodes this delay for the largest acknowledged packet in the Ack
+Delay field of an ACK frame (see {{frame-ack}}). This allows the receiver of the
+ACK to adjust for any intentional delays, which is important for getting a
+better estimate of the path RTT when acknowledgments are delayed. A packet might
+be held in the OS kernel or elsewhere on the host before being processed.  An
+endpoint MUST NOT include delays that is does not control when populating the
+Ack Delay field in an ACK frame.
+An endpoint MUST NOT excessively delay acknowledgements of ack-eliciting
+packets.  An endpoint commits to a maximum delay using the max_ack_delay
+transport parameter; see {{transport-parameter-definitions}}.  max_ack_delay
+implies an explicit contract: an endpoint promises to never delay

implies explicit is odd:

declares an explicit contract: an endpoint promises to never delay

You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub: