Re: [tcpm] Fwd: New Version Notification for draft-jarvinen-tcpm-sack-recovery-entry-01

" Ilpo Järvinen " <> Mon, 17 August 2009 12:37 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id CFA0E3A6EEF for <>; Mon, 17 Aug 2009 05:37:31 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -5.547
X-Spam-Status: No, score=-5.547 tagged_above=-999 required=5 tests=[AWL=0.152, BAYES_00=-2.599, J_CHICKENPOX_33=0.6, MIME_8BIT_HEADER=0.3, RCVD_IN_DNSWL_MED=-4]
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id ZVlS+kG-BtGb for <>; Mon, 17 Aug 2009 05:37:30 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id 971593A6CF3 for <>; Mon, 17 Aug 2009 05:37:30 -0700 (PDT)
Received: from ( []) (AUTH: PLAIN cs-relay, TLS: TLSv1/SSLv3,256bits,AES256-SHA) by with esmtp; Mon, 17 Aug 2009 15:37:33 +0300 id 000704CA.4A894F0D.0000262D
Received: by (Postfix, from userid 50795) id 58D3B20208F; Mon, 17 Aug 2009 15:37:33 +0300 (EEST)
Received: from localhost (localhost []) by (Postfix) with ESMTP id 56826202011; Mon, 17 Aug 2009 15:37:33 +0300 (EEST)
Date: Mon, 17 Aug 2009 15:37:33 +0300
From: Ilpo Järvinen <>
To: Alexander Zimmermann <>
In-Reply-To: <>
Message-ID: <>
References: <> <>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
Mime-Version: 1.0
Content-Type: text/plain; format="flowed"; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Cc: "" <>, Markku Kojo <>
Subject: Re: [tcpm] Fwd: New Version Notification for draft-jarvinen-tcpm-sack-recovery-entry-01
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: TCP Maintenance and Minor Extensions Working Group <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Mon, 17 Aug 2009 12:37:31 -0000

On Wed, 12 Aug 2009, Alexander Zimmermann wrote:

> after carefully reading Ilpo's I-D I fully support it as a WG item. All in 
> all it describes Linux
> "interpretation" of RFC3517, which is IMHO a more secure way than simply 
> counting
> *** Comments
> * I think we need a clear definition what the term DUPACK means when SACK is
> enabled. The I-D says (page 5): We also note that the defination of a 
> duplicate acknowledgement
> already suggests that an incoming ACK can be considered as a duplicate ACK if 
> it "contains
> previously unknown SACK information" [RFC2581bis].
> What does it mean exactly? Is the fact that an ACK contains new SACK blocks a 
> necessary
> or a sufficient property to delcare the ACK as DUPACK? Example: ACK with new 
> SACK blocks,
> but containing data: DUPACK or not? ACK with new SACK blocks and FIN bit: 
> DUPACK or not?

This comes quite directly from rfc2581bis, but I can understand that
it's considerably harder to understand without having duplicate 
ACK said like in RFC2581bis. I'll change it to ' a "duplicate" ACK if 
it "contains previously unknown SACK information" [RFC2581bis]'. But even 
with that change I agree that it is useful to add a very precise 
description what should be considered as a "duplicate" ACK in the context 
of this algorithm. And that would then be made to cover also the cases 
where the ACK is in fact cumulative (either due to minor reordering or 
out-of-sync due to ACK loss).

However, I don't find problematic the examples you mention. We are not 
interested in emulating behavior of dupack counter with bug-to-bug 
compatibility. Dupack counter is an artificial metric, the real metric 
the sender is interested is the number of in-window segments that receiver 
already has buffered (and how accurately the dupack counter could estimate 
that depends on scenario). After all, we try to fix the inaccuracies in 
the dupack counter, not to duplicate them. In the cases you mentioned, we 
may miss some "duplicate" ACKs because of ACK losses but never 
overestimate them because we have not received those earlier, "real" 
duplicate ACKs. While considering all this it is good to keep in mind 
that the duplicate ACK part is just a fallback for the small segment 
sender case, the IsLost() check takes care of the other cases.

> * Section 2, 5A)
> Why do you set HightRxt to SND.UNA?

This is there to avoid implementer confusion, as RFC3517 from which we 
"borrow" the SetPipe() requires a valid HighRxt.

> * Section 3.1, paragraph 3:
> ... a TCP sender that is able to discern segment boundaries...
> Example?

You mean an implementation or something else?

> * Section 3.1, Note:
> ...the problem is not unique to this algorithm ... because of how IsLost() is 
> defined.
> Do you know a better way how we can implement IsLost()? :-)

Sure, but I guess somebody might think that having to keeping track of 
segment boundaries of all segments is relatively expensive and that we 
should not be forcing all implementations to do that (please see the 
trick they used in early-rexmit to avoid keeping track of every boundary; 
though the wording there was slightly milder than what I had read into it

> *** Minor comments
> * IMHO %s/RFC2581/RFC2581bis/g

Seems sensible for the two remaining, changed.

> * Section 1, paragraph 4 (without ADDME): Add a reference (RFC) for Limited 
> Transmit.


> * Section 3.2: ... case is the case ... Sounds not optimal.
> *** Misspellings
> %s/advertises/advertizes/g


Thanks for the feedback.