このような値は次のように操作できます。
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 ソケットが初期化されるときに設定されるパラメータの初期値を探していることになります。
2.6.39
Linuxカーネルからマクロ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