Bug 140597

Summary: [tcp] Implement Lost Retransmission Detection
Product: Base System Reporter: Richard Scheffenegger <rs>
Component: kernAssignee: Richard Scheffenegger <rscheff>
Status: Closed FIXED    
Severity: Affects Only Me CC: hiren, net, rscheff, tuexen
Priority: --- Keywords: feature
Version: UnspecifiedFlags: koobs: mfc-stable13-
koobs: mfc-stable12-
koobs: mfc-stable11-
Hardware: Any   
OS: Any   
URL: https://reviews.freebsd.org/D28931

Description Richard Scheffenegger 2009-11-16 07:20:00 UTC
SACK TCP in FreeBSD does not do Lost Retransmission Detection.

Unlike linux, that functionality is not implemented, leading to a RTO when a single segment is lost twice. This reduces Goodput considerably during phases 
of higher congestion.

See http://ubinet.yonsei.ac.kr/v2/publication/hpmn_papaers/ij/29.pdf
And http://projects.itri.aist.go.jp/gnet/pfldnet08kodama.ppt

Fix: 

Simple fix is rather easy (doesn't work perfectly under all circumstances,
but doesn't need new state variable and runs in constant time):

When sending the last segment in a sackhole, store snd.max in rxmit.
During SACK Ack processing, check the value of rxmit from the lowest 
hole against snd.fack; if snd.fack <= rxmit of that hole, set rxmit to 
start, and sackhint.nexthole == sackhole[0]. 

Care must be taken during hole-splitting (if rxmit > end of lower hole, set
rxmit to snd.max), and all checks of sackhole[].rxmit need to deal with
the signal rxmit > end.

See http://www.ietf.org/mail-archive/web/tcpm/current/msg05003.html ff.
How-To-Repeat: Drop the same segment of a TCP Stram twice, when cwnd is open enough (3+ segments).
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2009-11-16 08:39:23 UTC
State Changed
From-To: open->suspended

Mark suspended awaiting patches. 


Comment 2 Mark Linimon freebsd_committer freebsd_triage 2009-11-16 08:39:23 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-net

Over to maintainer(s).
Comment 3 Richard Scheffenegger 2010-04-02 18:48:04 UTC
As discussed earlier, here is a simple fix.

Caveat: Doesn't work at the end of a session or when cwnd is very small
(<4 segments). Also, during heavy reordering, some spurious
re-retransmissions might occur (but that would only affect very few
re-retransmitted segments, as holes would still close with each
additional received SACK, reducing the chance of spurious
re-transmissions).=20

Benefit: during LAN burst drop events, TCP will not revert to
retransmission timeouts in order to recover. In a LAN, the RTO is
typically many orders of magnitude larger than the RTT. Not relying on
RTO whenever possible can help keep throughput up..


Simple Patch:


------------------------------------------
diff -u netinet.orig/tcp_output.c netinet/tcp_output.c
--- netinet.orig/tcp_output.c   2009-10-25 02:10:29.000000000 +0100
+++ netinet/tcp_output.c        2010-04-02 16:55:14.000000000 +0200
@@ -953,6 +953,10 @@
        } else {
                th->th_seq =3D htonl(p->rxmit);
                p->rxmit +=3D len;
+               /* lost again detection */
+               if (SEQ_GEQ(p->rxmit, p->end)) {
+                       p->rxmit =3D tp->snd_nxt;
+               }
                tp->sackhint.sack_bytes_rexmit +=3D len;
        }
        th->th_ack =3D htonl(tp->rcv_nxt);
diff -u netinet.orig/tcp_sack.c netinet/tcp_sack.c
--- netinet.orig/tcp_sack.c     2009-10-25 02:10:29.000000000 +0100
+++ netinet/tcp_sack.c  2010-04-02 16:46:42.000000000 +0200
@@ -460,6 +460,13 @@
        /* We must have at least one SACK hole in scoreboard. */
        KASSERT(!TAILQ_EMPTY(&tp->snd_holes),
            ("SACK scoreboard must not be empty"));
+       /* lost again - then restart */
+       if ((temp =3D TAILQ_FIRST(&tp->snd_holes)) !=3D NULL) {
+               if (SEQ_GT(tp->snd_fack, temp->rxmit)) {
+                       temp->rxmit =3D temp->start;
+                       tp->sackhint.nexthole =3D temp;
+               }
+       }
        cur =3D TAILQ_LAST(&tp->snd_holes, sackhole_head); /* Last SACK
hole. */
        /*
         * Since the incoming sack blocks are sorted, we can process
them
@@ -508,7 +515,9 @@
                        if (SEQ_GEQ(sblkp->end, cur->end)) {
                                /* Move end of hole backward. */
                                cur->end =3D sblkp->start;
-                               cur->rxmit =3D SEQ_MIN(cur->rxmit,
cur->end);
+                               if (SEQ_GEQ(cur->rxmit, cur->end)) {
+                                       cur->rxmit =3D tp->snd_nxt;
+                               }
                        } else {
                                /*
                                 * ACKs some data in middle of a hole;
need
@@ -524,8 +533,9 @@
                                                    - temp->start);
                                        }
                                        cur->end =3D sblkp->start;
-                                       cur->rxmit =3D =
SEQ_MIN(cur->rxmit,
-                                           cur->end);
+                                       if (SEQ_GEQ(cur->rxmit,
cur->end)) {
+                                               cur->rxmit =3D
tp->snd_nxt;
+                                       }
                                }
                        }
                }
Comment 4 Mark Linimon freebsd_committer freebsd_triage 2010-04-03 18:54:12 UTC
State Changed
From-To: suspended->open

New patch received.
Comment 5 Mark Linimon 2010-04-05 05:09:23 UTC
uuencoded version of patch received in private email (should fix the
problems with quoted-printable):

----- Forwarded message from "Scheffenegger, Richard" <rs@netapp.com> -----

begin 600 patch.tar
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
"`0``
`
end

----- End forwarded message -----
Comment 6 Richard Scheffenegger 2010-04-21 02:16:01 UTC
I found a small oversight (bug) in my earlier simple fix. If we had sent
out multiple holes already, all of which get (partially) lost in the
retransmission again, the original simple patch would only work for the
very first hole. So, subsequent holes would not get re-sent, unless
another ACK (SACK) would be received - however, seeing more SACKs
becomes less likely the more loss is expirienced.

This is a updated patch diff, which accounts for that case as well - but
at the cost of O(n) time, instead of O(c).

(Just check all holes from the hint backwards to the head, if any
already fully resent hole needs to be reset, instead of only the first
one - which might go away during subsequent processing in the original
patch).



diff -u netinet.orig/tcp_output.c netinet/tcp_output.c
--- netinet.orig/tcp_output.c   2009-10-25 02:10:29.000000000 +0100
+++ netinet/tcp_output.c        2010-04-02 16:55:14.000000000 +0200
@@ -953,6 +953,10 @@
        } else {
                th->th_seq =3D htonl(p->rxmit);
                p->rxmit +=3D len;
+               /* lost again detection */
+               if (SEQ_GEQ(p->rxmit, p->end)) {
+                       p->rxmit =3D tp->snd_nxt;
+               }
                tp->sackhint.sack_bytes_rexmit +=3D len;
        }
        th->th_ack =3D htonl(tp->rcv_nxt);
diff -u netinet.orig/tcp_sack.c netinet.simple_mod/tcp_sack.c
--- netinet.orig/tcp_sack.c     2009-10-25 02:10:29.000000000 +0100
+++ netinet/tcp_sack.c          2010-04-21 00:48:23.000000000 +0200
@@ -508,7 +508,9 @@
                        if (SEQ_GEQ(sblkp->end, cur->end)) {
                                /* Move end of hole backward. */
                                cur->end =3D sblkp->start;
-                               cur->rxmit =3D SEQ_MIN(cur->rxmit,
cur->end);
+                               if (SEQ_GEQ(cur->rxmit, cur->end)) {
+                                       cur->rxmit =3D tp->snd_nxt;
+                               }
                        } else {
                                /*
                                 * ACKs some data in middle of a hole;
need
@@ -524,8 +526,9 @@
                                                    - temp->start);
                                        }
                                        cur->end =3D sblkp->start;
-                                       cur->rxmit =3D =
SEQ_MIN(cur->rxmit,
-                                           cur->end);
+                                       if (SEQ_GEQ(cur->rxmit,
cur->end)) {
+                                               cur->rxmit =3D
tp->snd_nxt;
+                                       }
                                }
                        }
                }
@@ -540,6 +543,15 @@
                else
                        sblkp--;
        }
+       /* retransmission lost again - then restart */
+       if ((temp =3D tp->sackhint.nexthole) !=3D NULL) {
+               do {
+                       if (SEQ_GT(tp->snd_fack, temp->rxmit)) {
+                               temp->rxmit =3D temp->start;
+                               tp->sackhint.nexthole =3D temp;
+                       }
+               } while ((temp =3D TAILQ_PREV(temp, sackhole_head,
scblink)) !=3D NULL);
+       }
 }

 /*




Richard Scheffenegger

=20
Comment 7 Andre Oppermann freebsd_committer freebsd_triage 2010-08-10 23:15:15 UTC
Responsible Changed
From-To: freebsd-net->andre

Take over.
Comment 8 Hiren Panchasara freebsd_committer freebsd_triage 2017-01-05 22:30:21 UTC
This might still be true but I am not quite sure. i.e. dropping the same segment twice resulting in RTO. If thats still the case, it'd be nice to resurrect this patch.
Comment 9 Eitan Adler freebsd_committer freebsd_triage 2018-05-28 19:41:10 UTC
batch change:

For bugs that match the following
-  Status Is In progress 
AND
- Untouched since 2018-01-01.
AND
- Affects Base System OR Documentation

DO:

Reset to open status.


Note:
I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed.
Comment 10 Richard Scheffenegger freebsd_committer freebsd_triage 2021-02-13 17:05:49 UTC
LRD is implicitly performed by RACK.

LRD is not formally specified in any IETF standard. This constitues a new functionality, but as long as simple RTO fall-back loss recovery is sufficient, I don't see support to commit this mechanism.
Comment 11 Richard Scheffenegger freebsd_committer freebsd_triage 2021-07-15 14:56:01 UTC
Feature added with D28931