[Tsvwg] problem with draft-allman-tcp-sack-11.txt

"Henderson, Thomas R" <thomas.r.henderson@boeing.com> Tue, 09 July 2002 15:48 UTC

Received: from optimus.ietf.org (ietf.org [132.151.1.19] (may be forged)) by ietf.org (8.9.1a/8.9.1a) with ESMTP id LAA00092 for <tsvwg-archive@odin.ietf.org>; Tue, 9 Jul 2002 11:48:59 -0400 (EDT)
Received: (from daemon@localhost) by optimus.ietf.org (8.9.1a/8.9.1) id LAA13870 for tsvwg-archive@odin.ietf.org; Tue, 9 Jul 2002 11:49:51 -0400 (EDT)
Received: from optimus.ietf.org (localhost [127.0.0.1]) by optimus.ietf.org (8.9.1a/8.9.1) with ESMTP id LAA12415; Tue, 9 Jul 2002 11:33:23 -0400 (EDT)
Received: from ietf.org (odin [132.151.1.176]) by optimus.ietf.org (8.9.1a/8.9.1) with ESMTP id LAA12390 for <tsvwg@optimus.ietf.org>; Tue, 9 Jul 2002 11:33:21 -0400 (EDT)
Received: from stl-smtpout-01.boeing.com (stl-smtpout-01.boeing.com [12.13.247.21]) by ietf.org (8.9.1a/8.9.1a) with ESMTP id LAA29339 for <tsvwg@ietf.org>; Tue, 9 Jul 2002 11:32:28 -0400 (EDT)
Received: from slb-av-02.boeing.com ([129.172.13.7]) by stl-smtpout-01.boeing.com (8.9.2/8.8.5-M2) with ESMTP id KAA08496; Tue, 9 Jul 2002 10:33:19 -0500 (CDT)
Received: from blv-hub-01.boeing.com (localhost [127.0.0.1]) by slb-av-02.boeing.com (8.9.3/8.9.2/MBS-AV-01) with ESMTP id IAA08603; Tue, 9 Jul 2002 08:33:18 -0700 (PDT)
Received: from xch-nwbh-02.nw.nos.boeing.com (xch-nwbh-02.nw.nos.boeing.com [192.54.12.28]) by blv-hub-01.boeing.com (8.11.3/8.11.3/MBS-LDAP-01) with ESMTP id g69FXH021158; Tue, 9 Jul 2002 08:33:17 -0700 (PDT)
Received: by xch-nwbh-02.nw.nos.boeing.com with Internet Mail Service (5.5.2650.21) id <N8R58C2Y>; Tue, 9 Jul 2002 08:28:16 -0700
Message-ID: <CFD05F4EAA7CCC4ABB08A47859D484140A0B6715@xch-nw-29.nw.nos.boeing.com>
From: "Henderson, Thomas R" <thomas.r.henderson@boeing.com>
To: "'tsvwg@ietf.org'" <tsvwg@ietf.org>
Cc: "'homa@crl.go.jp'" <homa@crl.go.jp>
Date: Tue, 09 Jul 2002 08:28:11 -0700
MIME-Version: 1.0
X-Mailer: Internet Mail Service (5.5.2650.21)
Content-Type: text/plain
Subject: [Tsvwg] problem with draft-allman-tcp-sack-11.txt
Sender: tsvwg-admin@ietf.org
Errors-To: tsvwg-admin@ietf.org
X-Mailman-Version: 1.0
Precedence: bulk
List-Id: Transport Area Working Group <tsvwg.ietf.org>
X-BeenThere: tsvwg@ietf.org

A recent paper at ICC 2002 ("Improving TCP Performance after a Long Channel
Outage" by Murakami, Wu, and Inoue) describes some pathological behavior
that might arise due to strict observance of draft-allman-tcp-sack-11.txt.
The problem is basically as follows:

- consider a TCP, with a somewhat large usable window, that traverses a path
that becomes blocked for a duration of time that it is able to "swallow"
roughly a window's worth of data and ACKs.

- this TCP will time out eventually (setting cwnd to 1 segment) and resend
its oldest unacked segment.  At some point, the blockage clears and a
retransmission and ACK thereof make it through the channel.  

- this first ACK received will have no SACK blocks since all of the data off
the top of the window was lost.  According to the algorithm, HighACK will
grow by one segment, so pipe will decrement a corresponding amount.  But
pipe will still be a large (multiple segments), and greater than cwnd.  Note
that the internet-draft does not say anything about touching any of the
variables determining "LeftNetwork()" when a timeout occurs. 

- at this point, correct behavior is somewhat ambiguous (underspecified).
Murakami et al., who cite draft-allman-tcp-sack-07.txt, describe a TCP
sender that waits again for timeouts for each subsequent retransmission
(ever increasing the backoff), resulting in recoveries that can last for
tens of minutes.  If instead the TCP sender always permits at least one
transmission upon receipt of an ACK, it may instead send the next
retransmission in response to this ACK, without waiting for a timeout.  But
the bottom line is that it seems that at most one segment can be recovered
per RTT if pipe control is used and pipe > cwnd.

Suggested fix:
--------------------
Data that has been sent before a timeout event should be considered as
having left the network.  "pipe" should equal one segment immediately after
the first retransmission following a timeout, and zero when this first
retransmission's ACK arrives (i.e., ability to send retransmissions after a
timeout should be governed by cwnd).  Perhaps a case e) in LeftNetwork()
defined as follows:
"(e) 'S1' was most recently transmitted before the TCP sender incurred its
most recent timeout."

The question of whether HighData should be changed upon a timeout is
interesting.  A cautious approach would be to not reset it so as to avoid
false fast retransmissions that might arise from dupacks that are generated
due to previously received segments that the sender retransmits-- this would
be in line with NewReno principles.  However, if the receiver is properly
sending SACK blocks, unnecessary retransmissions should be avoided, and
dupacks would probably indicate an additional segment loss (or possibly that
the receiver has discarded SACKed data).   

Thoughts?

Tom

p.s. Interestingly, we have observed similar behavior using SackFullTcp in
ns-2, but for a different reason.  ns-2 SackFullTcp only enables pipe
control when fast retransmission is entered via dupack action.  However,
after a timeout, SackFullTcp does not use pipe control but instead
mistakenly considers itself in fast recovery mode, suppressing cwnd growth.
As a result, cwnd is stuck at one segment until snd_nxt grows beyond
HighData again, and we can only retransmit 1 segment at a time (per RTT).  

_______________________________________________
tsvwg mailing list
tsvwg@ietf.org
https://www1.ietf.org/mailman/listinfo/tsvwg