How to check whether or not your OS supports TCP Window scaling.
# cat /proc/sys/net/ipv4/tcp_window_scaling 
1 
 | 
1 : enable window scale
0 : disable window scale
[ when disabling TCP window scale ]
Client ( CentOS 6.2 ) ------ web sites
OS informs Window scaling factor when sending syn packet.
# echo 0 > /proc/sys/net/ipv4/tcp_window_scaling 
 | 
capture and then access to an web site.
# tshark -i eth0 port 80 -w ws_disable.pcap 
 | 
# wget http://www.google.com 
 | 
Here’s a syn packet sent from the client
Client -> google 
the client does not add window scale option in TCP options.
   Flags: 0x02 (SYN) 
        0... .... = Congestion Window Reduced (CWR): Not set 
        .0.. .... = ECN-Echo: Not set 
        ..0. .... = Urgent: Not set 
        ...0 .... = Acknowledgement: Not set 
        .... 0... = Push: Not set 
        .... .0.. = Reset: Not set 
        .... ..1. = Syn: Set 
    Options: (16 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
 | 
[ when enabling Window scale ]
enable window scale
# echo 1 > /proc/sys/net/ipv4/tcp_window_scaling 
 | 
# tshark -i eth0 port 80 -w ws_enable.pcap 
# wget http://www.google.com 
 | 
syn packet
The client adds window scaling factor in TCP options.
    Flags: 0x02 (SYN) 
        0... .... = Congestion Window Reduced (CWR): Not set 
        .0.. .... = ECN-Echo: Not set 
        ..0. .... = Urgent: Not set 
        ...0 .... = Acknowledgement: Not set 
        .... 0... = Push: Not set 
        .... .0.. = Reset: Not set 
        .... ..1. = Syn: Set 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 807482, TSecr 0 
        NOP 
        Window scale: 6 (multiply by 64)  <-  2**6  =64 
 | 
In this case , Window size will be 1460 * 2**6 = 93440
[ how to change window scaling factor ]
You may change scaling factor by editing the following three files. ( receive buffer )
/proc/sys/net/ipv4/tcp_rmem
/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max
The scaling factor range is from 0 to 14.
- scaling factor : 0
# echo "4096 65535 65535" > /proc/sys/net/ipv4/tcp_rmem 
# echo 65535 > /proc/sys/net/core/rmem_default 
# echo 65535 > /proc/sys/net/core/rmem_max 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 1516864, TSecr 0 
        NOP 
        Window scale: 0 (multiply by 1) 
 | 
window size : 1460 * 2**0 = 1460
- scaling factor : 1
# echo 131070 > /proc/sys/net/core/rmem_max 
# echo 131070 > /proc/sys/net/core/rmem_default 
# echo "4096 131070 131070" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 1665986, TSecr 0 
        NOP 
        Window scale: 1 (multiply by 2) 
 | 
window size : 1460 * 2**1 = 2920
- scaling factor : 2
# echo "4096 196605 196605" > /proc/sys/net/ipv4/tcp_rmem 
# echo 196605 > /proc/sys/net/core/rmem_default 
# echo 196605 > /proc/sys/net/core/rmem_max 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 1892175, TSecr 0 
        NOP 
        Window scale: 2 (multiply by 4) 
 | 
- scaling factor : 3
# echo "4096 300000 300000" > /proc/sys/net/core/rmem_default 
# echo 300000 > /proc/sys/net/core/rmem_max 
# echo 300000 > /proc/sys/net/core/rmem_default 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 3386446, TSecr 0 
        NOP 
        Window scale: 3 (multiply by 8) 
 | 
- scaling factor : 4
# echo 1048560 > /proc/sys/net/core/rmem_default 
# echo 1048560 > /proc/sys/net/core/rmem_max 
# echo "4096 1048560 1048560" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 3644467, TSecr 0 
        NOP 
        Window scale: 4 (multiply by 16) 
 | 
- scaling factor : 5
>>> 65535*2**5
2097120
scaling factor becomes 5 ??? 
# echo 2097120 > /proc/sys/net/core/rmem_default 
# echo 2097120 > /proc/sys/net/core/rmem_max 
# echo "4096 2097120 2097120" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 3817108, TSecr 0 
        NOP 
        Window scale: 5 (multiply by 32) 
 | 
- scaling factor : 6
>>> 65535*2**6
4194240
# echo 4194240 > /proc/sys/net/core/rmem_default 
# echo 4194240 > /proc/sys/net/core/rmem_max 
# echo "4096 4194240 4194240" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 4000584, TSecr 0 
        NOP 
        Window scale: 6 (multiply by 64) 
 | 
- scaling factor : 7
>>> 65535*2**7
8388480
# echo 8388480 > /proc/sys/net/core/rmem_default 
# echo 8388480 > /proc/sys/net/core/rmem_max 
# echo "4096 8388480 8388480" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 4338817, TSecr 0 
        NOP 
        Window scale: 7 (multiply by 128) 
 | 
- scaling factor : 8
>>> 65535*2**8
16776960
# echo "4096 16776960 16776960" > /proc/sys/net/ipv4/tcp_rmem 
# echo 16776960 > /proc/sys/net/core/rmem_default 
# echo 16776960 > /proc/sys/net/core/rmem_max 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 4465434, TSecr 0 
        NOP 
        Window scale: 8 (multiply by 256) 
 | 
- scaling factor : 9
>>> 65535*2**9
33553920
# echo 33553920 > /proc/sys/net/core/rmem_default 
# echo 33553920 > /proc/sys/net/core/rmem_max 
# echo "4096 33553920 33553920" > /proc/sys/net/ipv4/tcp_rmem 
 | 
    Options: (20 bytes) 
        Maximum segment size: 1460 bytes 
        SACK permitted 
        Timestamps: TSval 4596689, TSecr 0 
        NOP 
        Window scale: 9 (multiply by 512) 
 | 
scale factor 10 – 14 ….. I’m tired of checking … :(
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.