获取 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_cwnd初始化 TCP 套接字时设置的参数的初始值。

看起来从linux内核开始,就引入了2.6.39一个宏TCP_INIT_CWNDlinux/include/net/tcp.hsnd_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内部也存在类似的初始化代码tcp_v6_init_sock()net/ipv6/tcp_ipv6.c

相关内容