• Jason Xing's avatar
    tcp: remove 64 KByte limit for initial tp->rcv_wnd value · 378979e9
    Jason Xing authored
    Recently, we had some servers upgraded to the latest kernel and noticed
    the indicator from the user side showed worse results than before. It is
    caused by the limitation of tp->rcv_wnd.
    
    In 2018 commit a337531b ("tcp: up initial rmem to 128KB and SYN rwin
    to around 64KB") limited the initial value of tp->rcv_wnd to 65535, most
    CDN teams would not benefit from this change because they cannot have a
    large window to receive a big packet, which will be slowed down especially
    in long RTT. Small rcv_wnd means slow transfer speed, to some extent. It's
    the side effect for the latency/time-sensitive users.
    
    To avoid future confusion, current change doesn't affect the initial
    receive window on the wire in a SYN or SYN+ACK packet which are set within
    65535 bytes according to RFC 7323 also due to the limit in
    __tcp_transmit_skb():
    
        th->window      = htons(min(tp->rcv_wnd, 65535U));
    
    In one word, __tcp_transmit_skb() already ensures that constraint is
    respected, no matter how large tp->rcv_wnd is. The change doesn't violate
    RFC.
    
    Let me provide one example if with or without the patch:
    Before:
    client   --- SYN: rwindow=65535 ---> server
    client   <--- SYN+ACK: rwindow=65535 ----  server
    client   --- ACK: rwindow=65536 ---> server
    Note: for the last ACK, the calculation is 512 << 7.
    
    After:
    client   --- SYN: rwindow=65535 ---> server
    client   <--- SYN+ACK: rwindow=65535 ----  server
    client   --- ACK: rwindow=175232 ---> server
    Note: I use the following command to make it work:
    ip route change default via [ip] dev eth0 metric 100 initrwnd 120
    For the last ACK, the calculation is 1369 << 7.
    
    When we apply such a patch, having a large rcv_wnd if the user tweak this
    knob can help transfer data more rapidly and save some rtts.
    
    Fixes: a337531b ("tcp: up initial rmem to 128KB and SYN rwin to around 64KB")
    Signed-off-by: default avatarJason Xing <kernelxing@tencent.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Acked-by: default avatarNeal Cardwell <ncardwell@google.com>
    Link: https://lore.kernel.org/r/20240521134220.12510-1-kerneljasonxing@gmail.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    378979e9
tcp_output.c 129 KB