使用ip命令修改初始拥塞窗口和接收窗口


在不修改内核的情况下,Linux提供了一种使用ip命令修改初始拥塞窗口和接收窗口的机制。
具体的例子可看这篇文章


修改初始拥塞窗口

使用如下命令可修改init cwnd

sudo ip route change default via 192.168.1.1 dev eth0  proto static initcwnd 10

内核源码分析

// 初始化cwnd的函数,会判断是否设置了route来指定initcwnd  
__u32 tcp_init_cwnd(const struct tcp_sock *tp, const struct dst_entry *dst)
{
    __u32 cwnd = (dst ? dst_metric(dst, RTAX_INITCWND) : 0);

    if (!cwnd)
        cwnd = TCP_INIT_CWND;
    return min_t(__u32, cwnd, tp->snd_cwnd_clamp);
}

// 内核中一个典型的调用序列  
tcp_finish_connect()
    => tcp_init_metrics()
        => tp->snd_cwnd = tcp_init_cwnd(tp, dst);

修改初始接收窗口

使用如下命令可修改init rwnd

sudo ip route change default via 192.168.1.1 dev eth0  proto static initrwnd 10

内核源码分析

// 一个典型的调用序列
tcp_connect_init()
    => tcp_select_inital_window()
        => dst_metric(dst, RTAX_INITRWND)

参考资料

Tuning initcwnd for optimum performance