• Eric Dumazet's avatar
    tcp: properly increase rcv_ssthresh for ofo packets · 4e4f1fc2
    Eric Dumazet authored
    TCP receive window handling is multi staged.
    
    A socket has a memory budget, static or dynamic, in sk_rcvbuf.
    
    Because we do not really know how this memory budget translates to
    a TCP window (payload), TCP announces a small initial window
    (about 20 MSS).
    
    When a packet is received, we increase TCP rcv_win depending
    on the payload/truesize ratio of this packet. Good citizen
    packets give a hint that it's reasonable to have rcv_win = sk_rcvbuf/2
    
    This heuristic takes place in tcp_grow_window()
    
    Problem is : We currently call tcp_grow_window() only for in-order
    packets.
    
    This means that reorders or packet losses stop proper grow of
    rcv_win, and senders are unable to benefit from fast recovery,
    or proper reordering level detection.
    
    Really, a packet being stored in OFO queue is not a bad citizen.
    It should be part of the game as in-order packets.
    
    In our traces, we very often see sender is limited by linux small
    receive windows, even if linux hosts use autotuning (DRS) and should
    allow rcv_win to grow to ~3MB.
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4e4f1fc2
tcp_input.c 164 KB