Linux で TCP initcwnd の現在の値/デフォルト値を取得する

Linux で TCP initcwnd の現在の値/デフォルト値を取得する

このような値は次のように操作できます。

ip route change ... initcwnd 10

そして、次のようなフィードバックをもらいます。

ip route show

しかし、変更前のデフォルト値はどうでしょうか? システムからその値を照会する方法はありますか?

あるいは、有効各カーネル バージョンのデフォルトのハードコードされた値を示すリファレンスはありますか?

答え1

よく分かりませんが、これは正当な参考資料のようです

予感:

$ grep -A 2 initcwnd `find /usr/src/linux/include -type f -iname '*h'`

外:

/usr/src/linux/include/net/tcp.h:
/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
#define TCP_INIT_CWND          10

答え2

まあ、これが答えであると100%確信しているとは言えませんが、よくあることですが、ssいくつかの情報を明らかにするための良い選択です。たとえば、

 ss -nli|fgrep cwnd
     westwood rto:1000 mss:536 cwnd:10
     westwood rto:1000 mss:536 cwnd:10
     westwood rto:1000 mss:536 cwnd:10

-n面倒な DNS 解決をなくすための典型的な方法は、-lリスニング ソケットのみに固執し、-i(キーは)「内部 TCP 情報を表示する」ことです。ご覧のとおり、輻輳アルゴリズムとデフォルトの cwnd の両方が表示されます。

答え3

私が正しく理解していれば、snd_cwndTCP ソケットが初期化されるときに設定されるパラメータの初期値を探していることになります。

2.6.39LinuxカーネルからマクロTCP_INIT_CWNDが導入されたようですlinux/include/net/tcp.hsnd_cwndTCP ソケットを初期化するときに値を設定します。

このコードがカーネルのどこにあるかはわかっていますIPv4が、残念ながら、それより古いカーネルの値を設定するマクロは使用されていないようです。2.6.39

/* net/ipv4/tcp_ipv4.c from 2.6.37 kernel */
static int tcp_v4_init_sock(struct sock *sk)
{
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);

        ....
        ....
        ....

        /* So many TCP implementations out there (incorrectly) count the
         * initial SYN frame in their delayed-ACK and congestion control
         * algorithms that we must have the following bandaid to talk
         * efficiently to them.  -DaveM
         */
        tp->snd_cwnd = 2;

        ....
        ....
        ....
}

同様の初期化コードは関数IPv6内にも存在します。tcp_v6_init_sock()net/ipv6/tcp_ipv6.c

関連情報