]> Git Repo - linux.git/commit
tcp: defer SACK compression after DupThresh
authorEric Dumazet <[email protected]>
Tue, 20 Nov 2018 13:53:59 +0000 (05:53 -0800)
committerDavid S. Miller <[email protected]>
Wed, 21 Nov 2018 23:49:52 +0000 (15:49 -0800)
commit86de5921a3d5dd246df661e09bdd0a6131b39ae3
treeefa8b73f929d9a2e136aaa0e0fa1605d6c12ed1e
parentb5dd186d10ba59e6b5ba60e42b3b083df56df6f3
tcp: defer SACK compression after DupThresh

Jean-Louis reported a TCP regression and bisected to recent SACK
compression.

After a loss episode (receiver not able to keep up and dropping
packets because its backlog is full), linux TCP stack is sending
a single SACK (DUPACK).

Sender waits a full RTO timer before recovering losses.

While RFC 6675 says in section 5, "Algorithm Details",

   (2) If DupAcks < DupThresh but IsLost (HighACK + 1) returns true --
       indicating at least three segments have arrived above the current
       cumulative acknowledgment point, which is taken to indicate loss
       -- go to step (4).
...
   (4) Invoke fast retransmit and enter loss recovery as follows:

there are old TCP stacks not implementing this strategy, and
still counting the dupacks before starting fast retransmit.

While these stacks probably perform poorly when receivers implement
LRO/GRO, we should be a little more gentle to them.

This patch makes sure we do not enable SACK compression unless
3 dupacks have been sent since last rcv_nxt update.

Ideally we should even rearm the timer to send one or two
more DUPACK if no more packets are coming, but that will
be work aiming for linux-4.21.

Many thanks to Jean-Louis for bisecting the issue, providing
packet captures and testing this patch.

Fixes: 5d9f4262b7ea ("tcp: add SACK compression")
Reported-by: Jean-Louis Dupond <[email protected]>
Tested-by: Jean-Louis Dupond <[email protected]>
Signed-off-by: Eric Dumazet <[email protected]>
Acked-by: Neal Cardwell <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
include/linux/tcp.h
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c
net/ipv4/tcp_timer.c
This page took 0.05294 seconds and 4 git commands to generate.