• Yuchung Cheng's avatar
    tcp: don't mark recently sent packets lost on RTO · 56f8c5d7
    Yuchung Cheng authored
    An RTO event indicates the head has not been acked for a long time
    after its last (re)transmission. But the other packets are not
    necessarily lost if they have been only sent recently (for example
    due to application limit). This patch would prohibit marking packets
    sent within an RTT to be lost on RTO event, using similar logic in
    TCP RACK detection.
    
    Normally the head (SND.UNA) would be marked lost since RTO should
    fire strictly after the head was sent. An exception is when the
    most recent RACK RTT measurement is larger than the (previous)
    RTO. To address this exception the head is always marked lost.
    
    Congestion control interaction: since we may not mark every packet
    lost, the congestion window may be more than 1 (inflight plus 1).
    But only one packet will be retransmitted after RTO, since
    tcp_retransmit_timer() calls tcp_retransmit_skb(...,segs=1). The
    connection still performs slow start from one packet (with Cubic
    congestion control).
    
    This commit was tested in an A/B test with Google web servers,
    and showed a reduction of 2% in (spurious) retransmits post
    timeout (SlowStartRetrans), and correspondingly reduced DSACKs
    (DSACKIgnoredOld) by 7%.
    Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
    Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Reviewed-by: default avatarSoheil Hassas Yeganeh <soheil@google.com>
    Reviewed-by: default avatarPriyaranjan Jha <priyarjha@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    56f8c5d7
tcp_input.c 183 KB