• Eric Dumazet's avatar
    tcp: fix dynamic right sizing · b0983d3c
    Eric Dumazet authored
    Dynamic Right Sizing (DRS) is supposed to open TCP receive window
    automatically, but suffers from two bugs, presented by order
    of importance.
    
    1) tcp_rcv_space_adjust() fix :
    
    Using twice the last received amount is very pessimistic,
    because it doesn't allow fast recovery or proper slow start
    ramp up, if sender wants to increase cwin by 100% every RTT.
    
    copied = bytes received in previous RTT
    
    2*copied = bytes we expect to receive in next RTT
    
    4*copied = bytes we need to advertise in rwin at end of next RTT
    
    DRS is one RTT late, it needs a 4x factor.
    
    If sender is not using ABC, and increases cwin by 50% every rtt,
    then we needed 1.5*1.5 = 2.25 factor.
    This is probably why this bug was not really noticed.
    
    2) There is no window adjustment after first RTT. DRS triggers only
      after the second RTT.
      DRS needs two RTT to initialize, so tcp_fixup_rcvbuf() should setup
      sk_rcvbuf to allow proper window grow for first two RTT.
    
    This patch increases TCP efficiency particularly for large RTT flows
    when autotuning is used at the receiver, and more particularly
    in presence of packet losses.
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarYuchung Cheng <ycheng@google.com>
    Cc: Van Jacobson <vanj@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b0983d3c
tcp_input.c 165 KB