zoukankan      html  css  js  c++  java
  • TCP定时器 之 TIME_WAIT定时器

    概述

    在FIN_WAIT_2收到对端发来的FIN,并回复ACK之后,会进入TIME_WAIT状态,此时添加定时器,定时器超时会将tw控制块从ehash和bhash中删除,并且释放tw控制块;

    启动定时器

    TIME_WAIT定时器主要通过inet_twsk_schedule函数进行启动;

    tcp_rcv_state_process函数中,在FIN_WAIT_2状态下,收到对端发来的FIN,并且向对端回复了ACK之后,会调用tcp_time_wait函数进入真正的TIME_WAIT状态,此时会创建TIME_WAIT控制块,创建之后调用inet_twsk_schedule启动定时器;

    调用关系如下:

    1 /**
    2  * tcp_rcv_state_process
    3  *    |-->tcp_time_wait
    4  *           |-->inet_twsk_alloc
    5  *           |      |-->setup_pinned_timer(&tw->tw_timer, tw_timer_handler,(unsigned long)tw);
    6  *           |-->__inet_twsk_schedule(tw, timeo, false);
    7  *                  |-->mod_timer(&tw->tw_timer, jiffies + timeo);
    8  */
    定时器回调函数

    定时器超时会进入到tw_timer_handler处理函数,该函数在统计信息之后,调用inet_twsk_kill;

     1 static void tw_timer_handler(unsigned long data)
     2 {
     3     struct inet_timewait_sock *tw = (struct inet_timewait_sock *)data;
     4 
     5     if (tw->tw_kill)
     6         __NET_INC_STATS(twsk_net(tw), LINUX_MIB_TIMEWAITKILLED);
     7     else
     8         __NET_INC_STATS(twsk_net(tw), LINUX_MIB_TIMEWAITED);
     9     inet_twsk_kill(tw);
    10 }

    inet_twsk_kill从ehash和bhash中把tw控制块删除,并且释放之;

     1 static void inet_twsk_kill(struct inet_timewait_sock *tw)
     2 {
     3     struct inet_hashinfo *hashinfo = tw->tw_dr->hashinfo;
     4     spinlock_t *lock = inet_ehash_lockp(hashinfo, tw->tw_hash);
     5     struct inet_bind_hashbucket *bhead;
     6 
     7     spin_lock(lock);
     8     sk_nulls_del_node_init_rcu((struct sock *)tw);
     9     spin_unlock(lock);
    10 
    11     /* Disassociate with bind bucket. */
    12     bhead = &hashinfo->bhash[inet_bhashfn(twsk_net(tw), tw->tw_num,
    13             hashinfo->bhash_size)];
    14 
    15     spin_lock(&bhead->lock);
    16     inet_twsk_bind_unhash(tw, hashinfo);
    17     spin_unlock(&bhead->lock);
    18 
    19     atomic_dec(&tw->tw_dr->tw_count);
    20     inet_twsk_put(tw);
    21 }
  • 相关阅读:
    HDU6301 SET集合的应用 贪心
    线段树与树状数组的对比应用
    树状数组
    JDBC链接MySQL数据库
    HDU4686Arc of Dream 矩阵快速幂
    HDU1757矩阵快速幂
    B1013. 数素数 (20)
    B1023. 组个最小数 (20)
    [教材]B1020. 月饼 (25)
    [教材]A1025. PAT Ranking (25)
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11749491.html
Copyright © 2011-2022 走看看