slow start after idle test
收到ACK时,tcp_slow_start_after_idle ==1;报文都已经被ack,也就是inflight==0 则 检查是否应该tcp_cwnd_restart
static int tcp_ack_update_window(struct sock *sk, const struct sk_buff *skb, u32 ack, u32 ack_seq) { if (!tcp_write_queue_empty(sk)) tcp_slow_start_after_idle_check(sk); // } static inline void tcp_slow_start_after_idle_check(struct sock *sk) { const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; struct tcp_sock *tp = tcp_sk(sk); s32 delta; if (!sock_net(sk)->ipv4.sysctl_tcp_slow_start_after_idle || tp->packets_out || ca_ops->cong_control) // return; delta = tcp_jiffies32 - tp->lsndtime; if (delta > inet_csk(sk)->icsk_rto) tcp_cwnd_restart(sk, delta); }
所以一般
- 禁用空闲后的慢启动 ( tcp_slow_start_after_idle = 0 )
`../common/defaults.sh ../common/set_sysctls.py /proc/sys/net/ipv4/tcp_slow_start_after_idle=0 \ /proc/sys/net/ipv4/tcp_min_tso_segs=5` 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 +0 bind(3, ..., ...) = 0 +0 listen(3, 1) = 0 +0 < S 0:0(0) win 65535 <mss 1000,sackOK,nop,nop,nop,wscale 7> +0 > S. 0:0(0) ack 1 <mss 1460,nop,nop,sackOK,nop,wscale 8> +.1 < . 1:1(0) ack 1 win 511 +0 accept(3, ..., ...) = 4 +0 setsockopt(4, SOL_SOCKET, SO_SNDBUF, [200000], 4) = 0 // +0 setsockopt(4, SOL_TCP, TCP_NODELAY, [0], 4) = 0 +0 write(4, ..., 26000) = 26000 +0 > P. 1:5001(5000) ack 1 +0 > P. 5001:10001(5000) ack 1 +0 %{ assert tcpi_snd_cwnd == 10, tcpi_snd_cwnd }% +0 %{ print("ack 0:", "tcpi_snd_cwnd:", tcpi_snd_cwnd) }% +.1 < . 1:1(0) ack 10001 win 511 +0 %{ assert tcpi_snd_cwnd == 20, tcpi_snd_cwnd }% +0 %{ print("ack 0:", "tcpi_snd_cwnd:", tcpi_snd_cwnd) }% +0 > P. 10001:20001(10000) ack 1 +0 > P. 20001:26001(6000) ack 1 +0 %{ print("ack 0:", "tcpi_snd_cwnd:", tcpi_snd_cwnd) }% +.1 < . 1:1(0) ack 26001 win 511 +0 %{ assert tcpi_snd_cwnd == 36, tcpi_snd_cwnd }% +0 %{ print("ack 0:", "tcpi_snd_cwnd:", tcpi_snd_cwnd) }% +2 write(4, ..., 20000) = 20000 // If slow start after idle works properly, we should send 5 MSS here (cwnd/2) +0 > P. 26001:31001(5000) ack 1 //+0 %{ assert tcpi_snd_cwnd == 10, tcpi_snd_cwnd }% +0 %{ print("ack 0:", "tcpi_snd_cwnd:", tcpi_snd_cwnd) }% // +0 `sleep 100` // Reset sysctls `/tmp/sysctl_restore_${PPID}.sh`
http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!!
但行好事 莫问前程
--身高体重180的胖子
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步