Obtenga el valor actual / predeterminado de TCP initcwnd en Linux

9

Puedo manipular tal valor con:

ip route change ... initcwnd 10

y luego tener un comentario con:

ip route show

Pero, ¿qué pasa con el valor predeterminado antes de cualquier modificación? ¿Hay alguna manera de consultar ese valor desde el sistema?

Alternativamente, ¿puede proporcionar una referencia válida que muestre el valor predeterminado codificado para cada versión de kernel?

Ciro
fuente

Respuestas:

10

Realmente no estoy seguro, pero esto parece una referencia legítima

Corazonada:

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

fuera:

/usr/src/linux/include/net/tcp.h:
/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
#define TCP_INIT_CWND          10
Ярослав Рахматуллин
fuente
Sí, siempre es una buena idea usar el código.
cYrus
6

Bueno, no puedo decir que estoy 100% seguro de que esta debería ser la respuesta, pero, como suele suceder, sses la buena opción para revelar información, por ejemplo:

 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

-nes típico deshacerse de la molesta resolución de DNS, si -lnos limitamos a escuchar sockets y -i(la clave) es "Mostrar información TCP interna". Como se puede ver, se muestran tanto el algoritmo de congestión como el cwnd predeterminado.

poige
fuente
2

Si lo entendí correctamente, está buscando el valor inicial del snd_cwndconjunto de parámetros cuando se inicializa un socket TCP.

Parece que comienza con el kernel de Linux 2.6.39, TCP_INIT_CWNDse ha introducido una macro en Linux / include / net / tcp.h que completa el valor de snd_cwndal inicializar un socket TCP.

Sé dónde está este código en el núcleo IPv4y, desafortunadamente, no parece usar ninguna macro para completar el valor de los núcleos anteriores a2.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;

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

Existe un código de inicio similar para la función IPv6interna también tcp_v6_init_sock()ennet/ipv6/tcp_ipv6.c

Tuxdude
fuente