在不修改内核的情况下,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)