zoukankan      html  css  js  c++  java
  • TCP定时器 之 重传/延迟ACK/保活 定时器初始化

    创建socket时会创建传输控制块,之后调用初始化函数对控制块进行初始化,其中包括对定时器的初始化,tcp会调用tcp_init_xmit_timers函数来初始化这些定时器,本文将详细分析tcp_init_xmit_timers函数;

    下面为这种情况的函数调用关系:

    1 /**
    2  * inet_create
    3  *  |-->sk->sk_prot->init
    4  *         |-->tcp_v4_init_sock
    5  *                |-->tcp_init_sock
    6  *                      |-->tcp_init_xmit_timers
    7  */

    tcp_init_xmit_timers函数将三个定时器回调传入到inet_csk_init_xmit_timers函数;

    1 void tcp_init_xmit_timers(struct sock *sk)
    2 {
    3     inet_csk_init_xmit_timers(sk, &tcp_write_timer, &tcp_delack_timer,
    4                   &tcp_keepalive_timer);
    5 }

    inet_csk_init_xmit_timers函数将重传定时器icsk_retransmit_timer的回调设置为retransmit_handler,将延迟ack定时器icsk_delack_timer的回调设置为delack_handler,将sk_timer定时器设置wei为keepalive_handler,注: sk_timer为共用定时器,会在连接处于不同状态下设置不同的定时器回调;

     1 /*
     2  * Using different timers for retransmit, delayed acks and probes
     3  * We may wish use just one timer maintaining a list of expire jiffies
     4  * to optimize.
     5  */
     6 void inet_csk_init_xmit_timers(struct sock *sk,
     7                    void (*retransmit_handler)(unsigned long),
     8                    void (*delack_handler)(unsigned long),
     9                    void (*keepalive_handler)(unsigned long))
    10 {
    11     struct inet_connection_sock *icsk = inet_csk(sk);
    12 
    13     setup_timer(&icsk->icsk_retransmit_timer, retransmit_handler,
    14             (unsigned long)sk);
    15     setup_timer(&icsk->icsk_delack_timer, delack_handler,
    16             (unsigned long)sk);
    17     setup_timer(&sk->sk_timer, keepalive_handler, (unsigned long)sk);
    18     icsk->icsk_pending = icsk->icsk_ack.pending = 0;
    19 }

    ——————–我是分割线——————–

    定时器初始化的另外一条调用路径是开启fastopen的情况,本文不做讨论,补充在尾部;

     1 /**
     2 *tcp_v4_rcv
     3 * |-->tcp_v4_do_rcv
     4 *       |-->tcp_rcv_state_process
     5 *              |-->tcp_v4_conn_request
     6 *                    |-->tcp_try_fastopen
     7 *                            |-->tcp_fastopen_create_child                       
     8 *                                    |-->tcp_v4_syn_recv_sock
     9 *                                            |-->tcp_create_openreq_child
    10 *                                                    |-->tcp_init_xmit_timers
    11 */
  • 相关阅读:
    ajax获取数据中文乱码问题最简单的完美解决方案
    修改easyui默认datagrid的表格内字体大小,样式
    setTimeout延迟加载方法的使用
    解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.ArrayList的问题
    模块和包
    常用模块
    匿名函数及推导式
    python-迭代器和生成器
    python-内置函数
    python-递归
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/11749417.html
Copyright © 2011-2022 走看看