[tcpm] Thoughts on Ack-on-ACK Re: draft-ietf-tcpm-accurate-ecn-24 addressingallWGLCcomments

Yoshifumi Nishida <nsd.ietf@gmail.com> Thu, 28 September 2023 07:25 UTC

Return-Path: <nsd.ietf@gmail.com>
X-Original-To: tcpm@ietfa.amsl.com
Delivered-To: tcpm@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id ECE22C14CEFF for <tcpm@ietfa.amsl.com>; Thu, 28 Sep 2023 00:25:13 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.103
X-Spam-Level:
X-Spam-Status: No, score=-2.103 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, RCVD_IN_DNSWL_BLOCKED=0.001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001, URIBL_DBL_BLOCKED_OPENDNS=0.001, URIBL_ZEN_BLOCKED_OPENDNS=0.001] autolearn=unavailable autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JmNUD36Jmppb for <tcpm@ietfa.amsl.com>; Thu, 28 Sep 2023 00:25:09 -0700 (PDT)
Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 40595C151525 for <tcpm@ietf.org>; Thu, 28 Sep 2023 00:25:09 -0700 (PDT)
Received: by mail-wm1-x330.google.com with SMTP id 5b1f17b1804b1-4053c6f0e50so122178775e9.1 for <tcpm@ietf.org>; Thu, 28 Sep 2023 00:25:09 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695885907; x=1696490707; darn=ietf.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=Z5Hx0LOh30Kr360o9y9n19EzM+EwzW09hyCGvpYg784=; b=LBf62QB7uC7+4iX5+97CNrc1Ph42vzhIBouSqu71MsxR6nCj79DNL8AgmCc/t/7gZF 7W5s/1jiWC0+3ERUyrdqlJt4nxeRDnAplXWf4LRDSPPXUeNoJW+0vz1J2bWoa0aCxdyu 6+iuwoITaI6+EkuOILyvO+LINRMChbLwDBnjNYB0ECpQoyFEdkkxwVo+PlDYTVZSzcJD uApXdNiQxkrUXWHCYiv8c3uNHqZaX50Kb3zyZmjaMlrPYEdX3X5ZeMo8E6fYBqwexrHg DdtqvYPTLw32BA5h6ycOsQQnTFJuJ742NzEE6VkUeqQFOpEEkkVVjTGSqyWgyjve3J/R LMbg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695885907; x=1696490707; h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=Z5Hx0LOh30Kr360o9y9n19EzM+EwzW09hyCGvpYg784=; b=WwxNnVNkRWx2nVIWrYAR5BUv8PPMJCKI852dNI3hX0oM+P7t0GCI6d0VmKPC0y/HNe KLCzV6EQO4z34s6gSTVZqS57HrE5Uq1WForA5n4gCFPkTQX1JVNdF0a+w6xJ+23WXXMV Zzu9YeZy+LMxH+SHLofLTWW/tPy5h8C8292QNxHN7uPwhPBhv6hFI6Lqe82gb+LnYC86 k7jiwOF1CM667GhZ4wN+IooxCWzujIqs3xAbMQ31js72YdLzvFXZMVcJAgCOXSUAwCNb ffEAziOY3VXIZ8feeiDQ6/s1gceb2jwGOz5wTzJJ+BorJHJC9LOz5fS9AScZHdhFdCd5 G0+A==
X-Gm-Message-State: AOJu0YzAaGy7Iao/5TzFkiXxF+YnOrmbJgXIQV+2fzwnf0e5EfZutUcl 73GVJQZotfs7ZYexL+Fa09Idbx688yYGas9bOoE=
X-Google-Smtp-Source: AGHT+IH5YJZdzPca1ad4TFuAMljF192xOEg+3NuvoUMRzeo2JyDe0rCerPRMuK2hfnzuGFWtMlHOCNq15Nxft5JMQI8=
X-Received: by 2002:a1c:720c:0:b0:402:8896:bb7b with SMTP id n12-20020a1c720c000000b004028896bb7bmr393904wmc.6.1695885906559; Thu, 28 Sep 2023 00:25:06 -0700 (PDT)
MIME-Version: 1.0
From: Yoshifumi Nishida <nsd.ietf@gmail.com>
Date: Thu, 28 Sep 2023 00:24:55 -0700
Message-ID: <CAAK044QecYQRKmmFxUF0qr1SEFYrjgMeEdTEKkNHNYKeS7esPg@mail.gmail.com>
To: Markku Kojo <kojo=40cs.helsinki.fi@dmarc.ietf.org>
Cc: Michael Tuexen <tuexen@fh-muenster.de>, tcpm IETF list <tcpm@ietf.org>, "Bob Briscoe [Apple]" <bob_briscoe@apple.com>
Content-Type: multipart/alternative; boundary="0000000000000a48ca06066635c4"
Archived-At: <https://mailarchive.ietf.org/arch/msg/tcpm/CyU8IxdbKboX3F3er3cFMvFRRQ4>
X-Mailman-Approved-At: Thu, 28 Sep 2023 00:25:50 -0700
Subject: [tcpm] Thoughts on Ack-on-ACK Re: draft-ietf-tcpm-accurate-ecn-24 addressingallWGLCcomments
X-BeenThere: tcpm@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: TCP Maintenance and Minor Extensions Working Group <tcpm.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/tcpm>, <mailto:tcpm-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/tcpm/>
List-Post: <mailto:tcpm@ietf.org>
List-Help: <mailto:tcpm-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/tcpm>, <mailto:tcpm-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 28 Sep 2023 07:25:14 -0000

Hi,
I just would like to check my understanding on ACK-on-ACK.
Here's a list of my thoughts. Please correct me if I am wrong...

* If an endpoint wants to receive ACK-on-ACK feedback through ECN++, it
should set ECT on their ACKs.
* This means If it doesn't want to receive ACK-on-ACK feedback, they can
disable it by not putting ECT on ACKs. So, if the peer doesn't support
SACK, it can control the peer to not send ACK-on-ACK feedback.
* It seems to me that dupacks caused by ACK-on-ACK feedback won't happen
so easily (although I don't say zero). Because in my understanding, 3
dupacks will be generated when all conditions below are met.
    1: an endpoint (say A) needs to receive at least 9 ACKs to generate 3
dupacks (because n=3). This means A needs to send 18 or greater packets in
the previous RTT.
    2: A doesn't have data to be sent in the current RTT otherwise A can
send ECN feedback with new data packets.
    3: During this RTT, the peer (say B) should have outstanding packets.
    4: These outstanding packets from B should not arrive A in this RTT
otherwise A can send ECN feedback with the ACKs for newly arrived data.

Based on this, I am thinking that the risk for ack-on-ack won't be high. An
important point is the endpoints which don't want to take a risk can always
disable features (also, accecn draft already clarifies ACK-on-ACK is an
experimental)

Thanks!
--
Yoshi


On Mon, Sep 25, 2023 at 2:02 AM Yoshifumi Nishida <nsd.ietf@gmail.com>
wrote:

> Hi folks,
>
> I think that ECN++ draft explicitly mentions that ECN on pure ACK is
> prohibited without SACK negotiations. (Section 3.2.3.2)
> BTW, I am wondering if we could update the following sentence in the ECN++
> draft
>     "If there is no SACK option on the incoming pure ACK despite SACK
> having been negotiated, it is not a duplicate"¶
> <https://datatracker.ietf.org/doc/html/draft-ietf-tcpm-generalized-ecn-12#section-3.3.3.1-2.1>
> by something like
>   "If there is no SACK option on the incoming pure ACK despite SACK having
> been negotiated, it is not a duplicated and MUST not be used for any packet
> loss or packet duplication detection algorithms."
> Wouldn't it solve the ambiguity on ack on ack at least to some extents?
>
> Thanks,
> --
> Yoshi
>
> On Fri, Sep 22, 2023 at 6:50 PM Markku Kojo <kojo=
> 40cs.helsinki.fi@dmarc.ietf.org> wrote:
>
>> Hi Michael,
>>
>> Please see answers to your comments/questions inline (tagged [MK5]).
>>
>> Please consider this also as my indication for the 2nd WGLC that my
>> concerns/comments have not been addressed (I think, these remaining
>> concerns for 2nd WGLC are better discussed in this thread where they
>> have already benn discussed for some while).
>>
>> On Sun, 10 Sep 2023, tuexen@fh-muenster.de wrote:
>>
>> > Hi Markku,
>> >
>> > some comments in-line.
>> >
>> > Best regards
>> > Michael (as an individual)
>> >
>> >> On 3. Aug 2023, at 09:04, Markku Kojo <kojo=
>> 40cs.helsinki.fi@dmarc.ietf.org> wrote:
>> >>
>> >> Bob,
>> >>
>> >> TL;DR
>> >>
>> >> 1.  It seems that you missed the point with SACK/DSACK;
>> >>
>> >> 2. Even when SACK is in use there is no reliable way to distinguish
>> real DupAcks from Acks of Acks ('fake' DupAcks). Therefore, existing stds
>> track mechanism like RACK/TLP and F-RTO do no work correctly if one uses
>> the SACK rule in ECN++ draft for trying to distinguish real DupAcks from
>> Acks of Acks.
>> >>
>> >> Please see [MK4] below for details.
>> >>
>> >> On Thu, 27 Jul 2023, Bob Briscoe wrote:
>> >>
>> >>> Markku, pls see [BB4]
>> >>>
>> >>> On 27/07/2023 08:26, Markku Kojo wrote:
>> >>>> Bob,
>> >>>> thank you for resending this with another email address as my
>> regular address bounced (my account erreneously expired last Fri but is now
>> back and working).
>> >>>> Please see below tagged [MK3].
>> >>>> On Wed, 26 Jul 2023, Markku P I Kojo wrote:
>> >>>>>
>> ____________________________________________________________________________________________________________________________
>> From: Bob Briscoe <research@bobbriscoe.net>
>> >>>>> Sent: 23 July 2023 00:01
>> >>>>> To: Kojo, Markku P I <markku.kojo@helsinki.fi>
>> >>>>> Subject: Fwd: draft-ietf-tcpm-accurate-ecn-24 addressing all WGLC
>> comments
>> >>>>> Retrying with an address which appears not to bounce.
>> >>>>> Pls add back mail distribution below in any reply.
>> >>>>> -------- Forwarded Message --------
>> >>>>> Subject:
>> >>>>> Re: draft-ietf-tcpm-accurate-ecn-24 addressing all WGLC comments
>> >>>>> Date:
>> >>>>> Sat, 22 Jul 2023 13:33:51 -0700
>> >>>>> From:
>> >>>>> Bob Briscoe <ietf@bobbriscoe.net>
>> >>>>> To:
>> >>>>> Markku Kojo <kojo@cs.helsinki.fi>
>> >>>>> CC:
>> >>>>> tuexen@fh-muenster.de, Yoshifumi Nishida <nsd.ietf@gmail.com>, Ian
>> Swett <ianswett@google.com>, tcpm@ietf.org, Bob Briscoe
>> >>>>> [Apple] <bob_briscoe@apple.com>
>> >>>>> Markku,
>> >>>>> I'm top-posting 4 responses to all your points, in order to
>> consolidate everything and avoid all the repetition:
>> >>>>> #1) Generic should not be confused with experimental.
>> >>>>> #2) Completeness
>> >>>>> #3) Does not specify the necessary details?
>> >>>>> #4) Not generic enough?
>> >>>>> #1) GENERIC SHOULD NOT BE CONFUSED WITH EXPERIMENTAL.
>> >>>>> The AccECN spec is the IETF's PS spec for how TCP feeds back ECN on
>> any packet. The requirement for AccECN to provide
>> >>>>> forward compatibility by providing generic feedback was agreed by
>> this WG and set down in RFC7560 (nearly 8 years ago).
>> >>>>> Generic mechanistic reflection is a central design principle of
>> AccECN - to reflect the ECN field of SYNs, SYN-ACKs, ACKs,
>> >>>>> data packets, retransmissions, everything (§2.5 of the draft has
>> said this since its inception). AccECN provides accurate
>> >>>>> feedback irrespective of whether or how it is currently used, so
>> that it can be used if needed.
>> >>>>> Mechanistic reflection is generic, not experimental.
>> >>>>>    Analogy: Senders have conducted many CC experiments using
>> feedback from stds-track rcvrs. But that doesn't make the
>> >>>>> rcvrs experimental; rather, it proves the f/b is generic.
>> >>>> [MK3] All these CC experiments that I am aware of have used stds
>> track receiver feedback that had already existed for a long time before the
>> experiment and had been matured for years (decades). This draft intends to
>> introduce new behaviour (acking ACKs randomly in scale) for upcoming
>> experiments at the same time when the experiments are being specified. That
>> is very different because the new feature has not matured. Besides, the
>> Acks of Acks issue appeared only after the wg had decided this document to
>> become stds track.
>> >>>
>> >>> [BB4] I think the WG understands your point. Where we are talking
>> about possible undefined future problems, it is for the WG to decide
>> whether they want to proceed.
>> >>>
>> >>>>> You say an AccECN receiver automatically becomes part of an
>> experiment as soon as the its peer enables ECN-capable ACKs.
>> >>>>> More constructively, one can say that the peer conducts the
>> experiment by building on the generic behaviour of the receiver.
>> >>>>> The latter is more correct because the behaviour of the receiver
>> was already specified (even though it was not exercised);
>> >>>>> so it predated the experiment, and could be analysed and checked
>> prior to any experiments.
>> >>>> [MK3] It can be well phrases both ways. "it was not exercised" is
>> the key concern here. We do not know enough about potential problems; you
>> say it "could be analysed and checked prior to any experiments" but that
>> IMHO is not good enough to introduce such a new stds track behaviour. Even
>> though it was carefully analysed, the TCP Timestamp condition was not found
>> being incorrect, for example. This clearly shows how tricky issue we are
>> handling and I (and I guess anyone else either) cannot come up with all
>> potential problems easily. That's why we should be evry careful here.
>> >>>> Pls see also my reply to Richard where I explained how this feature
>> of Acks of Acks may become a problem much later (maybe after decade or
>> more), when AccECN possibly have been widely deployed as a stds track spec
>> but ECN++ somehow faded away. How is it possible/guaranteed that another
>> experiment that wants to enable pure Acks with non-SACK connections can get
>> rid of the Acks of Acks it does not need and all harm they produce?
>> >>>> They are coded and deployed all over and it would be hard to get rid
>> of them.
>> >>>
>> >>> [BB4] The code for acking ACKs will indeed be in stds track
>> implementations of AccECN, but it will not be exercised unless a peer is
>> running an experiment like ECN++. Any of the problems you mention can only
>> occur during one of those experiments, where they can also be resolved (or
>> the experiment ended).
>> >>
>> >> [MK4] You did not answer the question. You say that any of the
>> problems can also be resolved in the (upcoming) experiments. I disagree.
>> >> Could you please explain how would it be possible to resolve all the
>> problems that arise in an experiment where an endpoint want's to take
>> advantage of ECN-capable pure ACKs over a non-SACK TCP connection (for ACK
>> CC purposes, for example) but the other end implements the stds track
>> behaviour as currently specified in the draft?
>> >>
>> >> If the goal of AccECN is to provide "generic" feedback for any CC
>> purposes, I find it not very good/mature design if it excludes in advance
>> certain CC approaches and makes the protocol unusable without options
>> (e.g., non-SACK connections cannot leverage from ECN-capable pure ACKs).
>> >> IMO, even this is strong enough reason why I don't think that
>> including Acks of Acks in this stds track spec is a reasonable idea.
>> > So is your concern that TCP implementations which
>> > * DO enable ECN on pure ACKs and
>> > * DONT enable SACK
>> > have to deal with ambiguities?
>>
>> MK5] Not that they have to deal with ambiguities but that they cannot
>> operate correctly with the ambiguities generated by a generic reflector
>> that sends Acks of Acks as currently specified in this draft and that it
>> is directly in conflict with RFC 5681. The packet conservation principle
>> is the cornerstone of the current CC algos (particularly fast recovery
>> algoritms but also many other algos like Limited Transmit). These
>> algorithms rely on the packet concervation principle which the current
>> specifications ensure to work as expected. That is, an arriving Ack
>> indicates that a *data* packet (or data packets) have left the network,
>> including the case when the arriving Ack is dupAck. That is why RFC 5681
>> (Sec 2, last para) explicitly prohibits a receiver from generating more
>> than one ACK for every incoming [data] segment. If this rule is not
>> honored, all these current mechanism stop working correctly. That's why
>> it is "MUST NOT" in RFC 5681.
>> In other words, not because the implementations have to deal with
>> ambiguities but because their normal operation would get distorted.
>>
>> > If an implementation wants to use ECN on pure ACKs, it has to deal with
>> the ambiguity.
>>
>> [MK5] In general true but here this draft, which is intended to be stds
>> track, is
>> creating the problematic ambiguity by specifying experimental operation
>> with ECN-capable pure Acks (ECN++). That is, it specifies in Sec
>> 3.2.2.5.1 behaviour that is needed only when the other end is sending
>> ECN-capable pure Acks. The following sentence in the "Increment-Triggered
>> ACKs" rule:
>>
>>   "If there is no newly delivered data to acknowledge, 'n' SHOULD be 3 and
>>    MUST be no less than 3."
>>
>> is not needed with standards track TCP but only for experimentation.
>> Moreover, we have no real evidence that it is a useful feature. Instead,
>> if anyone implements this rule and follows the other stds track
>> specifications, it results in breaking important TCP behaviours like RTTM
>> computation with timestamps (as was already demonstrated during the
>> 1st WGLC discussions by one of the co-authors for RFC 7323).
>> Therefore, the rule that results in Acks of Acks is premature for stds
>> track and should be specified for experimental use only.
>>
>> > If it knows how the peer reacts, it can implement heuristics or enable
>> SACK.
>>
>> [MK5] I am afraid it cannot. The problem is that there seems to be no way
>> to implement any such heuristics. And, more importantly, even enabling
>> SACK does not solve all ambiguities: SACK may help in preventing false
>> fast retransmits from becoming triggered but it does not solve the
>> ambiguity that breaks RACK-TLP logic, F-RTO logic and DSACK-based
>> detection of spurious retransmissions [RFC 3708] (see more for your other
>> comment/question below).
>>
>> > How many stacks are out there not supporting TCP SACK? How many of them
>> will implement
>> > ECN++?
>>
>> [MK5] I think tens if not hundreds, when all various devices like network
>> printers and stacks in various IoT appliances, vehicles, etc are counted.
>> But as already stated, even SACK is not solving the ambiguity created
>> by Acks of Acks. Morover, we cannot know or estimate how many will
>> implement ECN++ and we need not to. TCP and its features as specified on
>> stds track are intended for generic use that any stack may implement. And
>> it is not the question about ECN++ being the only potential enabler for
>> ECN-capable pure ACKs; it has been proposed already before ECN++ and
>> there are quite likely more to come. Any stds track TCP feature should be
>> designed for various possible usages, not just for a single
>> experimentation like one intending to employ ECN++. For example, there
>> are a plenty of environments with asymmetric network capacity where one
>> would like to benefit from ECN-capable pure Acks for Ack CC only, for
>> example. For such use, Acks of Acks are useless, possibly even
>> detrimental.
>>
>> >>>>> This is protocol layering. Feedback is a 'sub-layer' of the
>> transport layer that lies logically beneath the congestion
>> >>>>> control function of the transport layer and is intended to allow
>> future evolution of sender behaviour. The RTCP protocol
>> >>>>> demonstrates this well, because it was specified separately from
>> RTP.
>> >>>>> You express concern that specifying a case where a stds track
>> AccECN implementation has to ack ACKs gives it no control over
>> >>>>> whether it is dragged into an experiment being conducted by its
>> peer.  But that's the deal for every generic capability. It
>> >>>>> gets used. Our task is to make sure that it can be used in this
>> way. That's why we have to correctly specify the SACK
>> >>>>> condition. That's what we do in the IETF.
>> >>>>> #2) COMPLETENESS
>> >>>>> A protocol spec should say what an implementation has to do in
>> response to all possible inputs. This ensures that there is
>> >>>>> just one behaviour to be checked for flaws (including security
>> flaws), rather than implementers inventing their own
>> >>>>> behaviours, each of which might lead to bugs or vulnerabilities if
>> it receives unexpected inputs.
>> >>>> [MK3] The incompleteness is exactly the problem that I have tried to
>> explain. See (*) under item #3 below.
>> >>>>> #3) DOES NOT SPECIFY THE NECESSARY DETAILS?
>> >>>>> You say this spec doesn't define the necessary safety features. We
>> can't work with "it needs a careful review for potential
>> >>>>> problems" then do nothing while we wait in case we might see
>> another email from you. If you think a safety feature is
>> >>>>> missing, the only way the WG works is constructively: participants
>> identify what's missing, and (ideally) define it.
>> >>>> [MK3] (*) My apologies if I have not been clear enough. What I have
>> tried to say is that the present spec does not specify how to ack an Ack
>> when SACK is enabled. I was now able interpret the intended way to ack an
>> Ack (I guessed this myself already earlier and you hinted it as well but I
>> was not sure because there were contradictory comments on this matter
>> earlier) from the most recent ECN++ spec which implies that an ECN++ peer
>> expects that an Ack of Ack does not carry SACK option:
>> >>>> "If there is no SACK option on the incoming pure ACK despite SACK
>> >>>>  having  been negotiated, it is not a duplicate;"
>> >>>> This way of acking, however, has not been specified in this spec.
>> Instead, you claim that this would be the case if the implementer follows
>> SACK (RFC 2018) and DSACK (RFC 2883). I disagee with this. Instead, the
>> implied way from ECN++ spec and the SACK spec (and DSACK) are in conflict.
>> >>>> An implementer who implements this spec following the rules in this
>> spec as well as SACK (RFC 2018) and DSACK (RFC 2883) has a serious dilemma
>> to solve which is contrary to what you claim in item #2 above.
>> >>>> Let's walk through what the implementer has at hand:
>> >>>> 1. When enough pure ACKs with CE have arrived, this spec requires
>> that the receiving end MUST send an ACK.
>> >>>> 2. The implementer reads SACK spec (RFC 2018) that requires that a
>> SACK block is included in the ACK in certain cases:
>> >>>> "SACK options SHOULD be included in all ACKs which do not ACK
>> >>>> the highest sequence number in the data receiver's queue."
>> >>>> 2. a) If there is no hole in the sequence space, everything is fine;
>> >>>>      No SACK block is included as per RFC 2018 and these Acks of
>> >>>>      Acks are not considered being DupAcks.
>> >>>> 2. b) If there is hole in the sequence space, RFC 2018 requires a
>> SACK
>> >>>>      block being included. The implementer includes a SACK block, but
>> >>>>      has a dilemma to solve: which SACK block to indicate. Whichever
>> >>>>      SACK block is included will result these Acks to be considered
>> >>>>      valid DupAcks as per ECN++ which they are not (they do not
>> >>>>      indicate an arrival of an out-of-order data packet but
>> incorrectly
>> >>>>      repeat some old SACK info. This is against the rule in RFC 5681
>> >>>>      that prohibits for a good reason to send more than one ACK per
>> >>>>      arriving data packet and will result in problems (see below).
>> >>>>      That is, this spec misses the rule for acking ACKs without the
>> >>>>      SACK option and indicating this is different from RFC 2018
>> >>>>      specification. And your completeness reuirement in item #2 is
>> >>>>      not fulfilled.
>> >>>
>> >>> [BB4] There is no dilemma. The receiver of the ACKs of ACKs would i)
>> have already entered loss recovery or, ii) if the ACK of the data was lost,
>> it would enter loss recovery on receipt of the ACKs of ACKs.
>> >>
>> >> [MK4] Of course the receiver of the ACKs of ACKs would either have
>> entered loss recovery or would enter loss recovery. Entering loss recovery
>> is not the problem but what happens during the loss recovery (fast
>> recovery). Pls see below.
>> >>
>> >>> RFC2018 allows no ambiguity on this. The state of the sender is
>> either still in loss recovery, when observing an
>> ACK-with-updated-ACE-plus-SACK, or it should enter loss recovery. There is
>> nothing extra needed or possible in the SACK RFCs.
>> >>
>> >> [MK4] Any SACK block included in the Ack of an Ack as the first SACK
>> block will incorrectly indicate arrival of a duplicate /data/ segment even
>> though no such data segment has arrived. This is forbidden both in RFC 5681
>> as well as in RFC 2883 as I have several times indicated. See more below
>> tagged (**).
>> >>
>> >>>
>> >>>> 3. If the implementation also implements DSACK, the implementer has
>> even
>> >>>>   harder dilemma to solve in case there is a hole in the sequence
>> space.
>> >>>>   RFC 2018 requires that a SACK block is included and DSACK specifies
>> >>>>   that the first SACK block reports "sequence of data received by the
>> >>>>   receiver in the most recent packet".
>> >>>>   Because the pure ACK does not include any data, what should the
>> >>>>   implementer do. For sure there will be various different
>> >>>>   interpretations because this has not been specified in this spec
>> >>>>   (and your item #2 is not fulfilled).
>> >>>>  a) An impelmenter may select a "random" block, maybe the most
>> >>>>     recently SACKED which is incorrect because it breaks DSACK idea
>> >>>>     and is in conflict with RFC 2883.
>> >>>>  b) Another implementer may be innovative and includes some "random"
>> >>>>     sequence number and includes a zero length SACK block with the
>> >>>>     same sequence number as the left and right edge. The consequences
>> >>>>     of this are unknown but certainly not correct.
>> >>>>  c) A more clever inplementer that reads the thoughts of authors
>> >>>>     for this spec (or has followed the discusions or even read ECN++)
>> >>>>     may send an ACK without any SACK info but this is in conflict
>> >>>>     RFC 2018.
>> >>>>  d) Maybe some other interpretation ...
>> >>>> You said earlier (below) that a) is the correct way with DSACK:
>> >>>> "[BB2] Surely those ACKs of ACKs from B to A are just further
>> >>>>  valid DupACKs with a SACK block included as defined in
>> >>>>  RFC2018, still cumulatively ack'ing packet 0 delivered
>> >>>>  before the loss."
>> >>>
>> >>> [BB4] The purpose of DSACK is to report the sequence numbers of the
>> packet that triggered the acknowledgement, which in these cases is a pure
>> ACK.
>> >>
>> >> [MK4] That is not quite correct. RFC 2018 specifies that the first
>> SACK block reports the sequence numbers of the packet that triggered the
>> acknowledgement. DSACK extends RFC 2018 by specifying and clarifying how an
>> arrival of a duplicate data segment is reported.
>> >>
>> >>> So, it just doesn't make sense to use DSACK on an ACK of an ACK at
>> all (I'll call this option e).
>> >>>
>> >>> We can say "no DSACK on these ACKs of ACKs" explicitly in the draft,
>> but I don't see how anyone would think  to use DSACK on one of these ACKs
>> of ACKs.
>> >>>
>> >>> BTW, I can't see how my words could have been interpreted as option
>> 'a' ('random').
>> >>
>> >> [MK4] I'm afraid you seem to make the same mistake as Richard did with
>> TCP timestamps; you suggested that "ACKs of ACKs from B to A are just
>> further valid DupACKs with a SACK block included as defined in RFC2018." As
>> I have pointed out earlier, RFC 2018 does not specify how to ack on arrival
>> of a pure ACK (nor does any other TCP spec). The rules in RFC 2018 are
>> correct only when acking data segments. However, you suggest following the
>> rules in RFC 2018 when acking a CE-marked pure ACK.
>> >> That is, if you include a SACK block as defined in RFC 2018, you will
>> include in the ACK of the ACK SACK blocks by repeating the most recently
>> reported SACK blocks. So, you explicitly suggest using DSACK on ACKs of
>> ACKs; the first SACK block would be incorrectly interpreted as DSACK by the
>> receiver of the ACK of the ACK even though no duplicate data segment never
>> arrived. The first SACK block (DSACK) will repeat the most recent SACK
>> block and is therefore a "random" block because one cannot know in advance
>> what is the latest data segment that arrived out-of-order. It depends on
>> recent packet dynamics of the connection that is more or less random. So,
>> if an author of the draft does not know how to ACK an ACK how would a
>> "random" implementer know if the #COMPLETENESS requirement you brought up
>> is not fulfilled?
>> >>
>> >> [MK4] RFC 5681 and RFC 2883 clearly forbid sending an ACK unless a
>> data segment has arrived. In other words, the rule "no DSACK on these ACKs
>> of ACKs" as you suggest is completely vague and unworkable.
>> >>
>> >> [MK4] The ECN++ rule does not work reliably.
>> >> The major remaining problem is the one you ignored in your recent
>> reply. The suggested rule in ECN++ says:  "If there is no SACK option on
>> the incoming pure ACK despite SACK
>> >>  having  been negotiated, it is not a duplicate;"
>> >> This rule does not reliably distinguish an ACK that indicates an
>> arrival of duplicate data segment from arrival of a CE-marked pure ACK.
>> Stds track specifications RACK/TLP (RFC (8985) and F-RTO (RFC 6582) do
>> handle arrival of a duplicate ACK (as per cumulate Ack in the Ack field)
>> without SACK option and with DSACK the same in certain cases to work
>> correctly.
>> >> These specs have been carefully specified to work correctly and they
>> specify their algos for completeness and the suggested ECN++ rule would
>> make these algos work incorrectly. Please see Sec. 7.4.2 for RACK and my
>> earlier ignored text just here below your previous signiture.
>> >> In addition, also the spurious retransmit detection on RFC 3708 seems
>> not to work correctly with the ECN++ rule even though the spec is a bit
>> vague for checking non-SACK DupAcks (Sec. 3, last para).
>> >>
>> >> Hope I was able the describe the problems clear enough this time.
>> > Would it help if the AccECN document would describe how an ACK for an
>> ACK looks like?
>>
>> [MK5] Sure this draft should describe how an Ack of an Ack is constructed
>> if it is sending such Acks. But it does not help because whichever way
>> you
>> construct the Ack of Ack, it will result in incorrect operation for these
>> widely deployed algos.
>>
>> > For example:
>> > Send the same ACK as the last one, except it contains a DSACK block, in
>> which case the DSACK block is removed.
>>
>> [MK5] Unfortunately I am not sure I am quite able follow what you mean by
>> removing DSACK block. The first SACK block is the DSACK block. You cannot
>> remove a DSACK block separately but the only way to remove DSACK is to
>> not include any SACK info. That would make the Ack of Ack to be a regular
>> dupAck (as per Ack field) and that would be interpreted by RACK-TLP,
>> F-RTO and RFC 3708 to indicate that a duplicate *data* segment had
>> arrived at the other end. Hence, all these algos are lead to make an
>> incorrect decision because no data segment had arrived at the other end
>> as I have already earlier explained. That is one reason why RFC 5681
>> prohibits sending a dupAck unless a data segment has arrived and
>> similarly RFC 2883 (Sec 4, item 2) allows only one DSACK per arriving
>> duplicate data segment.
>>
>> > And wouldn't it help, if the sender of the ACK of an ACK would include
>> a AccECN option?
>>
>> [MK5] Do you mean that an ACK of an ACK would always include an AccECN
>> option and genuine dupAck would never include the AccECN option?
>> That might help if there is never reordering. Otherwise, a regular
>> cumulative Ack cannot include the AccECN option either and that is
>> definitely no go.
>>
>> [MK5] But this is quite useless speculation, I think, because using the
>> AccECN option for distinquishing Acks of Acks from other Acks would
>> require that the AccECN option can always be used but the draft makes it
>> quite clear that this is not the case.
>>
>> Best regards,
>>
>> /Markku
>>
>> > Best regards
>> > Michael
>> >>
>> >> Thanks,
>> >>
>> >> /Markku
>> >>
>> >>> Bob
>> >>>
>> >>>> This would result in incorrect behaviour with DSACK and will confuse
>> any algo that depends on correct behavior of DSACK in correctly reporting
>> arrival of duplicate data segments, including RFC 3708 and (TLP of) RACK
>> (RFC 8985) as I have earlier indicated.
>> >>>> The intention of DSACK is to inform an arrival of duplicate data
>> segment and the spec explicitely prohibits repeating that info in the
>> spirit of the one ACK per data segment rule of RFC5681. RFC 2883, Sec 4,
>> item (2):
>> >>>> "Each duplicate contiguous sequence of data received is reported
>> >>>> in at most one D-SACK block.  (I.e., the receiver sends two identical
>> >>>> D-SACK blocks in subsequent packets only if the receiver receives two
>> >>>> duplicate segments.)"
>> >>>> Even if one selects the intended option (c above), it does not
>> necessarily result in correct outcome. SACK specification in RFC 3517 used
>> the same definition for DupAck as RFC 5681.
>> >>>> The DupAck definition in RFC 6675 holds for the purposes of RFC 6675
>> only as clearly stated in that specification. That is, it depends on an RFC
>> spec which definition of DupAck (RFC 5681 of RFC 6675) it adopts regardless
>> of whether the spec involves SACK or not. For example, F-RTO deliberately
>> uses the DupAck definition of RFC 5681 for both non-SACK version and the
>> SACK-enhanced version of F-RTO. In other words, the SACK-enhanced version
>> of F-RTO uses an arriving DupAck without SACK option (or DupAck with SACK
>> block but with no new SACK information) to declare RTO being not spurious
>> similar to the non-SACK version does (Sec 3.1, step 3 a). Therefore, an
>> arriving Ack of an Ack without SACK info incorrectly declares an RTO not
>> spurious even if it actually was spurious RTO.
>> >>>> (This needs a bit different scenario than what I draw in Fig 3 b) of
>> my scenarios that was for the non-SACK version of F-RTO)
>> >>>> To sum up: In order to partially solve the ambiguity on how to ack
>> ACKs and avoid triggering false fast retransmits, this spec must update RFC
>> 2018 by making an exception to the rule that specifies when a SACK block
>> should be included. However, this does not solve the entire problem with
>> Acks of Acks because there are algos like F-RTO that use the RFC 5681
>> definition of DupAck. Therefore, IMHO sending Acks of Acks should not be
>> included in a stds track spec.
>> >>>>> You repeatedly refer forward to apparent problems with SACK, which
>> sounds like you have identified that the protocol is
>> >>>>> broken. But, having read forward to the end, you agree that the
>> SACK condition is more solid than using TSOpt. And the only
>> >>>>> concrete criticism I can find is that we don't specify what DSACK
>> to send. Richard & I (and others) have worked through all
>> >>>>> the cases you have proposed (and others we have contrived
>> ourselves), and we cannot find any case where an implementation
>> >>>>> has to do anything different from what the DSACK RFCs already say.
>> >>>> [MK3] Please see the explanation above. Hope it clarifies the issue
>> now.
>> >>>>> I had independently found the rule you point out in RFC 5681, Sec
>> 2, against generating more than one ACK for every incoming
>> >>>>> [data] segment. We can say that the potential requirement to ack
>> ACKs contravenes that rule, which is why the SACK condition
>> >>>>> is necessary. I know you are concerned that it might not be as
>> simple as that. But, without evidence, how do we distinguish
>> >>>>> this from over-dramatisation? In the absence of anything specific,
>> we can't just sit on our hands. As Yoshi says, these will
>> >>>>> probably be corner cases. If new problems surface, we will have to
>> deal with them as they arise.
>> >>>> [MK3] Please see above. Definitely not a corner case.
>> >>>>> #4) NOT GENERIC ENOUGH?
>> >>>>> To your point about feedback from pure ACKs and data being
>> combined, that's not driven by any particular CCA. If ACKs are
>> >>>>> ECT, AccECN is designed to make it possible for the Data Sender to
>> estimate how much of the combined per-packet feedback is
>> >>>>> from ACKs and data, by using the per-byte feedback in the option to
>> estimate the number of data packets. This might not be
>> >>>>> perfect, but it was recognised from the start that we would need to
>> decide on compromises,, particularly given very limited
>> >>>>> header space.
>> >>>>> Nothing in the increment-triggered ACK rule was designed around
>> ECN++. Requiring the receiver to emit an ACK after 'n' CE
>> >>>>> marks is a fairly obvious way of  ensuring that the sender  gets
>> timely feedback of multiple CE markings.
>> >>>> [MK3] Please see my reply to Richard where I explained why this
>> feedback with Acks of Ack is in almost all scenarious unnecessary or not
>> timely. In a single case when the other end first is idle but starts
>> sending data it might be useful but even in such scenarious the feedback
>> often comes too late or possibly is stale (if there is longish delay before
>> the other end starts sending).
>> >>>>> 'n' has to be less
>> >>>>> than 7 to prevent AccECN's 3-bit ACE field wrapping. And greater
>> than 2 to avoid too many ACKs. Then, as I said, we noticed
>> >>>>> that could cause ping-pong, so we raised the min to 3 if the ACK
>> would be in response to an ACK. That would be necessary for
>> >>>>> protocol completeness (see above) whether or not an ECN++ draft
>> existed.
>> >>>> [MK3] Raising the min to 3 helps in dampening the ping-pong effect.
>> But still the ping-pong may last several RTTs if the cwnd is large and lot
>> of pkts (most) get CE marked. Not sending feedback for CE-marked DupAcks
>> (and not counting them in the counters) would be much more efficient way to
>> dampen the ping-pong effect. In addition, it would avoid making unnecessary
>> rate reductions in such cases (when DupAcks are arriving) where there will
>> be a notable rate reduction anyway (the increased Ack rate due to DupAcks
>> being sent for every data pkt goes away roughly in one RTT and the end
>> receiving DupAcks will react to congestion and reduce cwnd, resulting in
>> lower ack rate for the next RTTs). Pls see my reply to Richard.
>> >>>> This is another reason why this part of the rule is experimental in
>> my opinion: we don't have any evidence/experience what is the best way to
>> provide feedback/react to CE-marked pure Acks.
>> >>>> It would be useful if you could give one scenario where acking
>> CE-marked DupAcks would give some benefit that cannot be (easily)
>> solved(gained in some other means.
>> >>>>> You raise a concern that allowing Acks of Acks might preclude
>> future algos that rely on the absence of 'fake dupacks'.
>> >>>>> Indeed, you say that contravening the one ACK per data segment rule
>> of RFC5681 "will break all mechanisms that rely on the
>> >>>>> behavior specified in RFC 2883, including RFC 3708 and (TLP of)
>> RACK (RFC 8985) as well as any potential new and useful
>> >>>>> algos that rely on this rule." But I think this is all stated
>> rather over-dramatically, because you admit that the SACK
>> >>>>> condition allows an implementation to identify 'fake dupacks'. So
>> it can exclude them from all such present and future
>> >>>>> algos. Then this all becomes a non-issue.
>> >>>> [MK3] Please see above. My apologies if I was not clear enough for
>> this part. I intended to say that SACK would help in distinguishing "fake
>> dupacks" that will otherwise trigger a false fast rexmit. However, SACK
>> seemingly does not solve all problems (e.g., breaks f-RTO). Unfortunately I
>> have no time to pass through all potential algos that may break. Even less
>> time to consider all potential new algos that could count on the
>> fundamental rule for generating only one DupAck per arriving data segment.
>> I just try to point out the ones that I found being problematic. Even if
>> one existing and (widely) deployed algo gets broken, that should be strong
>> enough warning signal to not proceed as a stds track feature.
>> >>>>> _______________
>> >>>>> I haven't added any further discussion to the thread below (except
>> a couple of minor points). To check that the above 4
>> >>>>> points comprehensively address all your [MK2] points. I've tagged
>> each with [BB3] and pointer(s) to the relevant response(s)
>> >>>>> above.
>> >>>> [MK3] I hope the above clarifications help. I didn't add anything
>> below except one comment (taggd [MK3]). I may pass through the comments
>> below later and comment if need be.
>> >>>> Thanks,
>> >>>> /Markku
>> >>>>> On 11/07/2023 16:48, Markku Kojo wrote:
>> >>>>>      Bob, please see [MK2] inline.
>> >>>>>      And apologies for the long delay in replying, again.
>> >>>>>      On Mon, 5 Jun 2023, Bob Briscoe wrote:
>> >>>>>            Markku, pls see [BB2] inline
>> >>>>>            On 26/05/2023 22:56, Markku Kojo wrote:
>> >>>>>                  Bob,
>> >>>>>                  My apologies you had to wait for the scenarios as
>> it took much longer with my limited cycles
>> >>>>>            than I thought.
>> >>>>>                  Anyways, please see my reply to Richard, some
>> scenarios are also included there.
>> >>>>>                  To keep things easier, it might be good to try to
>> keep the discussion on Acks of Acks (mainly)
>> >>>>>            in the thread
>> >>>>>                  with my reply to Richard.
>> >>>>>                  However, see inline tagged [MK].
>> >>>>>                  On Wed, 24 May 2023, Bob Briscoe wrote:
>> >>>>>                        Markku,
>> >>>>>                        Sorry, it's taken a week to build a
>> comprehensive reply to this long email. See inline tagged [BB]...
>> >>>>>                        On 17/05/2023 12:24, Markku Kojo wrote:
>> >>>>>                              Hi Michael, all,
>> >>>>>                              On Sun, 14 May 2023,
>> tuexen@fh-muenster.de wrote:
>> >>>>>                                          On 30. Mar 2023, at 16:53,
>> Bob Briscoe <ietf@bobbriscoe.net>
>> >>>>>                                          wrote:
>> >>>>>                                          Michael, Yoshi, Ian (as
>> tcpm chairs),
>> >>>>>                                          To close off the WGLC, I
>> have just posted a new rev of
>> >>>>>                                          accurate-ecn. Hyperlinks
>> quoted at the end.
>> >>>>>                                          You will see the diff is
>> rather extensive. I won't give a
>> >>>>>                                          summary of all the diffs
>> like I usually do. Instead I can just
>> >>>>>                                          refer to the summary I
>> gave in the presentation on Monday:
>> >>>>>
>> https://datatracker.ietf.org/meeting/116/materials/slides-116-tcpm-draft-ietf-tcpm-accurate-ecn
>> >>>>>                                          Thank you again to the
>> people who reviewed this during the WGLC:
>> >>>>>                                          Michael Tüxen, Alex Burr,
>> Gorry Fairhurst and Markku Kojo.
>> >>>>>                                          All changes are editorial,
>> apart from removing the para about
>> >>>>>                                          not mistaking certain ACKs
>> of ACKs for DupACKs, which I will add
>> >>>>>                                          to a rev of the ECN++
>> draft, hopefully later this week.
>> >>>>>                                          On the list, we have seen
>> agreement from all the reviewers to
>> >>>>>                                          these changes, except no
>> response from Markku yet.
>> >>>>>                                          On Monday, I told Markku
>> that I would post the draft in a few
>> >>>>>                                          days, so everyone can see
>> the updates and diff.
>> >>>>>                                    Anyone having additional
>> comments? In particular Markku regarding loss
>> >>>>>                                    recovery?
>> >>>>>                              My apologies for being late with my
>> reply to the author's comments on my review
>> >>>>>            (I've
>> >>>>>                              been extremly busy with other issues
>> since the wg mtng in Yokohama, including the
>> >>>>>            rest
>> >>>>>                              of mtng week).
>> >>>>>                              I don't have much new comments but it
>> seems that my major concern regarding the
>> >>>>>            problem
>> >>>>>                              of sending ACKs of ACKs was not fully
>> understood.
>> >>>>>                              The first thing where I think I was
>> not quite clear is that the major problem with
>> >>>>>            ACKs
>> >>>>>                              of ACKs is not that a pure Ack is made
>> ECN-capable. Instead, the problem is in
>> >>>>>                              generating an Ack of an pure Ack and
>> that is what one should prohibit to avoid
>> >>>>>            problems.
>> >>>>>                              I understand that it might be
>> problematic to formulate rules whether generating an
>> >>>>>            Ack
>> >>>>>                              of an Ack is allowed (and when),
>> instead of just disabling sending ECN-capable
>> >>>>>            ACKs.
>> >>>>>                              I don't have a strong opinion which
>> way the problems with ACKs of ACKs is avoided
>> >>>>>            as
>> >>>>>                              long as they are avoided.
>> >>>>>                        [BB] See later after your similar point
>> (following your 'Why?' heading)...
>> >>>>>                              I am preparing a few scenarios to
>> illustriate the problems ACKs of ACks raise and
>> >>>>>            will
>> >>>>>                              send them shortly once I have
>> formulated a more thorough reasoning why sending
>> >>>>>            ACKs of
>> >>>>>                              ACKs is not really a good idea and
>> even seems to be unnecessary in most if not all
>> >>>>>                              cases, i.e., it just results in
>> sending unnecessary packets with not much useful
>> >>>>>            effect
>> >>>>>                              but creates a notable number of
>> problems.
>> >>>>>                        [BB] Having waited this long, it's rather
>> disappointing to still hear you say "I have an
>> >>>>>                        argument,
>> >>>>>                        but I'll tell you later."
>> >>>>>                  [MK] I understand. My sincere apologies again.
>> >>>>>                              Given that this draft is intended to
>> become a stds track RFC I am concerned of any
>> >>>>>            text
>> >>>>>                              in this document that indicates (or
>> even hints) that TCP could acknowledge pure
>> >>>>>            ACKS
>> >>>>>                              (this holds particularly the rules and
>> text in Sec 3.2.2.5.1 for the
>> >>>>>                              "Increment-Triggered ACKs"). If it is
>> seen necessary that this doc should have
>> >>>>>            such
>> >>>>>                              pieces of rules and text, I am fine if
>> any such text is moved to an appendix as
>> >>>>>            long as
>> >>>>>                              the appendix makes it cristal clear
>> that the text is valid only in case one is
>> >>>>>                              implementing an experiment as per
>> [I-D.ietf-tcpm-generalized-ecn].
>> >>>>>                        [BB] See point below about "Generic
>> (Mechanistic) Reflector".
>> >>>>>                              Why?
>> >>>>>                              1) It is well known that TCP does not
>> acknowledge ACKs and Standards track TCP has
>> >>>>>            not
>> >>>>>                              been specified to acknowledge ACKs.
>> This means that a reader/implementer of this
>> >>>>>            doc
>> >>>>>                              cannot correctly understand the rule
>> for "Increment-Triggered ACKs" unless there
>> >>>>>            is a
>> >>>>>                              normative reference to a spec that
>> specifies ACKs of ACKs (or tells that it is
>> >>>>>            even
>> >>>>>                              possible).
>> >>>>>                        [BB] ACKs of ACKs can indeed be tricky. But
>> there's no need to consider not ACKing ACKs
>> >>>>>            as an
>> >>>>>                        architectural principle. Not Acking ACKs on
>> principle certainly avoids some tricky
>> >>>>>            problems.
>> >>>>>                        However, we have a new situation here where,
>> in limited circumstances, ACKs of ACKs are
>> >>>>>                        necessary.
>> >>>>>                        So the WG has already worked through the
>> tricky problems and they have been addressed in
>> >>>>>            the
>> >>>>>                        draft
>> >>>>>                        (e.g. mistaking ACKs of ACKs for DupACks,
>> infinite ping-pong, etc). We'll discuss below
>> >>>>>            whether
>> >>>>>                        you've found some more trickiness.
>> >>>>>                  (MK] I did not mean to refer to any principle but,
>> as I said, that a reader/implementer cannot
>> >>>>>            correctly
>> >>>>>                  understand the rule for "Increment-Triggered ACKs"
>> because it is well-known to her/him that
>> >>>>>            TCP does not Ack
>> >>>>>                  ACKs. This fact is that one can ack ACKs is not
>> specified in this doc
>> >>>>>            [BB2] The fact that one /can/ ack ACKs is specified in
>> the AccECN draft. It clearly says:
>> >>>>>                "Although TCP normally only ACKs newly delivered
>> data, in this case it is mandatory for A to
>> >>>>>            emit ACKs of ACKs
>> >>>>>            because they feed back new congestion state (useful in
>> case B starts sending)."
>> >>>>>            We'll also make it clearer that "in this case" means "in
>> the case of ECN-capable ACKs". And we'll
>> >>>>>            make it clear that it's
>> >>>>>            conditional on carefully following all the conditions in
>> any draft that specifies ECN-capable ACKs.
>> >>>>>      [MK2] Right, but this (acking Acks) is experimental behaviour,
>> needed only for those participating the
>> >>>>>      experiment. However, this doc specifies the behaviour in the
>> Increment-Triggered ACKs rule: MUST emit an ACK".
>> >>>>>      If one implements this draft but is not interested in ECN++
>> nor any other similar experiment that allows
>> >>>>>      ECN-capable ACKs, one must still implement these Acks of Acks
>> but there is no specification nor normative ref
>> >>>>>      how to do it (correctly, including all the conditions). If
>> then this implementation is deployed in the wild, it
>> >>>>>      automatically becomes part of the experiment once the other
>> endpoint enables ECN-capable ACKs but without the
>> >>>>>      necessary safety procedures. This doc cannot depend on an
>> experimental spec which explains how to do it and what
>> >>>>>      conditions to follow.
>> >>>>> [BB3] See
>> >>>>> #1) Generic should not be confused with experimental.
>> >>>>> #2) Completeness
>> >>>>> #3) Does not specify the necessary details?
>> >>>>>                  nor does this doc give a (normative) reference
>> where it is specified,
>> >>>>>            [BB2] As already explained, there is no normative ref
>> where acking ACKs is specified in general,
>> >>>>>            because they are not
>> >>>>>            needed in general. They are specified whenever they are
>> needed, including in the examples Yoshi
>> >>>>>            pointed to (keepalive,
>> >>>>>            etc).
>> >>>>>      [MK2] An implementation of this draft send Acks of Acks
>> "randomly" and possibly multiple of them in a row but
>> >>>>>      this draft does not specify the necessary details unlike you
>> claim above.
>> >>>>> [BB3] See #4) Does not specify the necessary details
>> >>>>>      [MK2] Pls see also my reply to Yoshi. The specific examples
>> Yoshi mentions are sent in very limited cases and
>> >>>>>      result in sending only a single Ack of an Ack which is not
>> causing any harm to others unlike sending multiple
>> >>>>>      "random" Acks of Acks.
>> >>>>>                  including the details on which TSecr value to add
>> or which SACK info if any to include when
>> >>>>>            acking a pure
>> >>>>>                  Ack.
>> >>>>>            [BB2] OK.  But I've had to read all the through SACK and
>> TS specs to guess what complication you
>> >>>>>            might have seen. If you
>> >>>>>            know what made you ask this question, it would be much
>> easier if you gave us a clue, or even just
>> >>>>>            told us explicitly.
>> >>>>>      [MK2] Sorry for not being clear/detailed enough. Maybe this
>> was too obvious to me. See details below for SACK
>> >>>>>      (and my reply to Richard for Timestamps for which I believe
>> you already figured out the problem).
>> >>>>> [BB3] See #3) Does not specify the necessary details?
>> >>>>>            * For TS, I'm pretty sure the normal rules (for which
>> TSecr value to include) apply.
>> >>>>>            * Similarly, for SACK, I can't see that anything new
>> needs to be said.
>> >>>>>                  It is easy to misinterpret the
>> "Increment-Triggered ACKs", if one doesn't realize that pure
>> >>>>>            Acks may be
>> >>>>>                  acked.
>> >>>>>            [BB2] We'll make it clearer in the rule that 'packet'
>> intentionally includes packets without data.
>> >>>>>      [MK2] But as I said earlier, it would specify experimental
>> behavior in a PS doc.
>> >>>>> [BB3]  See: #1) Generic should not be confused with experimental.
>> >>>>>                        What is the new situation?
>> >>>>>                         *  Until ECN was introduced, TCP ACKs only
>> acknowledged data. So there was no need to
>> >>>>>                        acknowledge
>> >>>>>                            pure ACKs, which contain no data.
>> >>>>>                         *  When ECN was introduced in RFC3168, TCP
>> ACKs also acknowledged ECN markings.
>> >>>>>            However, because
>> >>>>>                            RFC3168 precluded pure ACKs from being
>> ECN-capable, there was still no need to
>> >>>>>            acknowledge
>> >>>>>                        pure
>> >>>>>                            ACKs.
>> >>>>>                         *  RFC5690, and now the ECN++ draft
>> introduce the possibility of ECN-capable pure ACKs.
>> >>>>>            So, in
>> >>>>>                        the
>> >>>>>                            limited circumstances described in the
>> AccECN draft, ECN-capable pure ACKs now need
>> >>>>>            to be
>> >>>>>                            acknowledged, because they contain new
>> information - their ECN field.
>> >>>>>                        Similarly, even though the final ACK of
>> TCP's 3WHS is an ACK of an ACK , it is sent
>> >>>>>            because it is
>> >>>>>                        needed (to prove that the SYN wasn't from a
>> spoofed address).
>> >>>>>                  [MK] All otherwise clear, but I disagree that the
>> final ACK of TCP's 3WHS is an ACK of an ACK.
>> >>>>>            It is required
>> >>>>>                  because SYNACK contains control data that eats one
>> sequence number, i.e., it advances RCV.NXT
>> >>>>>            at the client
>> >>>>>                  end and when the ACK arrives at the server it is
>> needed to advance SND.UNA. Very different
>> >>>>>            from Acks of Acks
>> >>>>>                  in this draft.
>> >>>>>            [BB2] Yes, not the same, but similar - ECN information
>> is also control data. But agreed that it
>> >>>>>            doesn't consume a
>> >>>>>            sequence no. Neither do keepalive probes or their ACKs.
>> >>>>>      [MK2] Right, but the actual purpose of Acks is to acknowledge
>> sequence numbers (that have arrived) and the logic
>> >>>>>      of many crucial TCP algos depend on how packets are acked.
>> >>>>> [BB3] Good protocol specs never define or limit the uses of the
>> protocol (it would be pointless to try anyway).
>> >>>>> If you only wanted ACKs to be used to acknowledge sequence numbers,
>> you should have objected to RFC3168, which used ACKs to
>> >>>>> feed back ECN as well. Or you could go further back and object to
>> SACK because it acknowledges gaps, not sequence numbers
>> >>>>> that have arrived.
>> >>>> [MK3] With both RFC 3168 and SACK the ACKS ack the sequence numbers
>> in the first place. These specs just piggyback additional information on
>> ACKS that would be sent anyway. They do not introduce extra pkts to be sent
>> like this spec does. I think this makes a major difference.
>> >>>> [snipped the rest of msg as the msg was too long for the wg list]
>> >>>
>> >>> --
>> >>> ________________________________________________________________
>> >>> Bob Briscoe                               http://bobbriscoe.net/
>> >>>
>> >> _______________________________________________
>> >> tcpm mailing list
>> >> tcpm@ietf.org
>> >> https://www.ietf.org/mailman/listinfo/tcpm
>> >
>> >_______________________________________________
>> tcpm mailing list
>> tcpm@ietf.org
>> https://www.ietf.org/mailman/listinfo/tcpm
>>
>