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

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

 /**
* inet_create
* |-->sk->sk_prot->init
* |-->tcp_v4_init_sock
* |-->tcp_init_sock
* |-->tcp_init_xmit_timers
*/

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

 void tcp_init_xmit_timers(struct sock *sk)
{
inet_csk_init_xmit_timers(sk, &tcp_write_timer, &tcp_delack_timer,
&tcp_keepalive_timer);
}

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

 /*
* Using different timers for retransmit, delayed acks and probes
* We may wish use just one timer maintaining a list of expire jiffies
* to optimize.
*/
void inet_csk_init_xmit_timers(struct sock *sk,
void (*retransmit_handler)(unsigned long),
void (*delack_handler)(unsigned long),
void (*keepalive_handler)(unsigned long))
{
struct inet_connection_sock *icsk = inet_csk(sk); setup_timer(&icsk->icsk_retransmit_timer, retransmit_handler,
(unsigned long)sk);
setup_timer(&icsk->icsk_delack_timer, delack_handler,
(unsigned long)sk);
setup_timer(&sk->sk_timer, keepalive_handler, (unsigned long)sk);
icsk->icsk_pending = icsk->icsk_ack.pending = ;
}

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

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

 /**
*tcp_v4_rcv
* |-->tcp_v4_do_rcv
* |-->tcp_rcv_state_process
* |-->tcp_v4_conn_request
* |-->tcp_try_fastopen
* |-->tcp_fastopen_create_child
* |-->tcp_v4_syn_recv_sock
* |-->tcp_create_openreq_child
* |-->tcp_init_xmit_timers
*/

TCP定时器 之 重传/延迟ACK/保活 定时器初始化的更多相关文章

  1. TCP之Nagle算法&&延迟ACK

    1. Nagle算法: 是为了减少广域网的小分组数目,从而减小网络拥塞的出现: 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要 ...

  2. TCP的定时器系列 — 保活定时器

    主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepaliv ...

  3. TCP的保活定时器 转

    http://blog.csdn.net/zhangskd/article/details/44177475 TCP的Keepalive,目的在于看看对方有没有发生异常,如果有异常就及时关闭连接. 当 ...

  4. 《TCP/IP详细解释》札记(23章)-TCP该保活定时器

    可能有这样的备用现实TCP连接:流通过. 也就是说.假设TCP连接的两方都没有向对方发送数据.则在两个TCP模块之间不交换不论什么信息,这意味着我们能够启动一个客户与server建立连接,然后长时间不 ...

  5. TCP系列28—窗口管理&流控—2、延迟ACK(Delayed Acknowledgments)

    一.简介 之前的内容中我们多次提到延迟ACK(Delayed Ack),延迟ACK是在RFC1122协议中定义的,协议指出,一个TCP实现应该实现延迟ACK,但是ACK不能被过度延迟,协议给出延迟AC ...

  6. TCP/IP详解学习笔记(13)-TCP坚持定时器,TCP保活定时器

    TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是: 坚持定时器 保活定时器 2MSL定时器 其中坚持定时器用于防止通告窗口为0以后双方互相等待死 ...

  7. 14.TCP的坚持定时器和保活定时器

    一.坚持定时器   1.坚持定时器的由来         TCP通过让接收方指明希望从发送方接受的窗口大小来进行流量控制.设置窗口大小为0可以组织发送方传送数据,直至窗口变为非0为止.         ...

  8. TCP系列13—重传—3、协议中RTO计算和RTO定时器维护

    从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果T ...

  9. 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器

    本章介绍保活定时器. 在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器:在 TCP的超时与重传 章节中,我们介绍了 重传定时器:在上一章节中,我们介绍了 防止死 ...

随机推荐

  1. 大数据学习(1)-shell脚本注意事项

    1.变量=值 (例如STR=abc)  不用加引号,但此时空格不再是空格字符,特殊字符可用于转义 2.等号两侧不能有空格 3.变量名称一般习惯为大写 4.双引号和单引号有区别,双引号仅将空格脱意,单引 ...

  2. spring boot zuul集成kubernetes等第三方登录

    介绍一下,在单点登录平台集成kubernetes登录,集成其它系统的登录原理是一样的,如grafana, nacos, jenkins等. POM引用: <dependency> < ...

  3. 网站更换服务器出现加载不了js css文件的问题

    原因是 里面加找不到.woff类型,后面把上面注释掉就可以了

  4. JavaScript里面9种数组遍历!

    ​大家好,我在这里总结分享了JavaScript中的闹腾的数组循环家族. 1.大家最常用的for循环,我就不解释了: for(let i = 0; i < 5 ; i++){ console.l ...

  5. Linux Exploit系列之七 绕过 ASLR -- 第二部分

    原文地址:https://github.com/wizardforcel/sploitfun-linux-x86-exp-tut-zh/blob/master/7.md 这一节是简单暴力的一节,作者讲 ...

  6. win7-32位安装mysql-5.7.27

    下载 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 参考链接 https://blog.csdn.net/qq_41307443/a ...

  7. Centos7.0 三种网络适配器

    VMnet0:桥接模式 VMnet1:主机模式 VMnet8:NAT模式 VMware Network Adepter VMnet1:宿主Host用于与 主机模式 虚拟网络进行通信的虚拟网卡 VMwa ...

  8. java8学习之收集器枚举特性深度解析与并行流原理

    首先先来找出上一次[http://www.cnblogs.com/webor2006/p/8353314.html]在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点 ...

  9. oozie 启动过程中--- Existing PID file found during start. Removing/clearing stale PID file.

    如果oozie使用kill -9 暴力杀死了tomcat,再启动的时候,会出问题,需要删除tomcat的pid文件 彻底停止oozie的tomcat的进程,然后删除pid文件 rm -rf  /exp ...

  10. PHP商城的搜索功能

    大家好,今天分享一个商城的搜索功能,建立在上一篇文章的基础上实现的. 搜索功能简单的说就是通过sql语句在数据库中实现模糊查找 连接数据库,实现分页功能(可以参考上一篇文章) 定义一个变量接收传过来的 ...