Holen Sie sich den aktuellen/Standardwert von TCP initcwnd unter Linux

Holen Sie sich den aktuellen/Standardwert von TCP initcwnd unter Linux

Ich kann diesen Wert wie folgt manipulieren:

ip route change ... initcwnd 10

und dann ein Feedback mit:

ip route show

Aber was ist mit dem Standardwert vor jeder Änderung? Gibt es eine Möglichkeit, diesen Wert vom System abzufragen?

Alternativ können Sie einegültigReferenz, die den fest codierten Standardwert für jede Kernelversion anzeigt?

Antwort1

Ich weiß es nicht genau, aber das scheint eine legitime Referenz zu sein

Ahnung:

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

aus:

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

Antwort2

Nun, ich bin mir nicht 100 % sicher, dass dies die Antwort ist, aber wie so oft ssist es eine gute Wahl, um einige Informationen preiszugeben, zum Beispiel:

 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

-nist typisch, um lästige DNS-Auflösungen loszuwerden, -lindem wir uns nur auf Listening-Sockets beschränken und -i(der Schlüssel) „Interne TCP-Informationen anzeigen“ ist. Wie man sehen kann, werden sowohl der Überlastungsalgorithmus als auch das Standard-CWND angezeigt.

Antwort3

Wenn ich Sie richtig verstanden habe, suchen Sie nach dem Anfangswert des snd_cwndParametersatzes bei der Initialisierung eines TCP-Sockets.

Es sieht so aus, als ob ab dem Linux-Kernel 2.6.39ein Makro TCP_INIT_CWNDeingeführt wurde inlinux/include/net/tcp.hwelches den Wert snd_cwndbeim Initialisieren eines TCP-Sockets auffüllt.

Ich weiß, wo sich dieser Code im Kernel befindet IPv4, und leider scheint er kein Makro zu verwenden, um den Wert für Kernel zu füllen, die älter sind als2.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;

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

Ein ähnlicher Init-Code existiert IPv6auch innerhalb tcp_v6_init_sock()der Funktion innet/ipv6/tcp_ipv6.c

verwandte Informationen