我可以使用以下方法操纵该值:
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_CWND
linux/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