web-dev-qa-db-ja.com

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

私はそのような値を次のように操作できます:

ip route change ... initcwnd 10

そして、次のフィードバックがあります:

ip route show

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

または、各カーネルバージョンのデフォルトのハードコードされた値を示すvalid参照を提供できますか?

9
cYrus

確かなことはわかりませんが、これは正当な参照のようです

予感:

$ 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

まあ、私はこれが答えであるべきだと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(キー)は「Showinternal TCP information」です。ご覧のとおり、輻輳アルゴリズムとデフォルトのcwndの両方が表示されています。

6
poige

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

Linuxカーネル_2.6.39_から始めて、マクロ_TCP_INIT_CWND_が linux/include/net/tcp.h に導入され、_snd_cwnd_の値が入力されているようです。 TCPソケットを初期化するとき。

このコードが_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_にも存在し、_net/ipv6/tcp_ipv6.c_のtcp_v6_init_sock()関数内にも存在します。

2
Tuxdude