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`
复制代码

 

posted @   codestacklinuxer  阅读(2)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示