5_TCP的定时器

tcp中使用的定时器 定时器的使用场景主要有两种。(1)周期性任务这是定时器最常用的一种场景,比如 tcp 中的 keepalive 定时器,起到 tcp 连接的两端保活的作用,周期性发送数据包,如果对端回复报文,说明对端还活着;如果对端不回复数据包,就会判定对端已经不存在了;再比如分布式系统中,各个组件之间的心跳报文也是定时发送来维护组件之间的状态。(2)兜底功能一些不立即执行的任务的时间底线。 阅读详情

1. TCP的定时器

1.1. TCP的坚持定时器

  • 当接收窗口变为0是,会发送 win = 0的ACK,告知对方停止发送。
  • 当接收窗口变为MSS(或变为Windows的一般时),发送窗口更新ACK,通知发送方继续发送数据。

   TCP 不对 ACK 报文段进行确认, TCP 只确认那些包含有数据的 ACK 报文段。 如果更新窗口确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期性地 向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查 ( windowprobe )。

  坚持定时器的原理是简单的,当TCP服务器收到了客户端的0滑动窗口报文的时候,就启动一个定时器来计时,并在定时器溢出的时候向向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到0窗口就再开一个新的定时器准备下一次查询。通过观察可以得知,TCP的坚持定时器使用1,2,4,8,16……64秒这样的普通指数退避序列来作为每一次的溢出时间。

具体详见 …/test/persistTime.cap

1.2. TCP的保活定时器

  如果 TCP 连接的双方都没有向对方发送数据,则在两个 TCP 模块之间不交换任何信息。 这意味着我们可以启动一个客户与服务器建 立一个连接,然后离去数小时、数天、数个星期或者数月,而连接依然保持。中间路由器可 以崩溃和重启,电话线可以被挂断再连通,但是只要两端的主机没有被重启,则连接依然保 持建立。

  • 保活并不是 TCP 规范中的一部分。Host Requirements RFC提供了3个不使用保活定 时器的理由:
    • 在出现短暂差错的情况下,这可能会使一个非常好的连接释放掉;
    • 它们耗费不必要的带宽;
    • 在按分组计费的情况下会在互联网上花掉更多的钱。

一般这个功能在服务端使用,检测客户端的链接状态。当然客户端也可以使用

  • 如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报 文段。客户主机必须处于以下 4 个状态之一
    1. 客户主机依然正常运行,并从服务器可达。客户的 TCP响应正常,而服务器也知道对方是正常工作的。服务器在两小时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此连接,则定时器在交换数据后的未来 2 小时再复位。
    2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的 TCP 都 没有响应。服务器将不能够收到对探查的响应,并在 7 5秒后超时。服务器总共发送 1 0个这样 的探查,每个间隔7 5秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止 连接。
    3. 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。
    4. 客户主机正常运行,但是从服务器不可达。这与状态 2 相同,因为 TCP 不能够区分状态 4 与状态 2 之间的区别,它所能发现的就是没有收到探查的响应。

  在第1种情况下,服务器的应用程序没有感觉到保活探查的发生。 TCP 层负责一切。这个 过程对应用程序都是透明的,直至第 2、3或4种情况发生。在这三种情况下,服务器应用程序 将收到来自它的 TCP 的差错报告(通常服务器已经向网络发出了读操作请求,然后等待来自 客户的数据。如果保活功能返回一个差错,则该差错将作为读操作的返回值返回给服务器)。 在第2种情况下,差错是诸如“连接超时”之类的信息,而在第 3种情况则为“连接被对方复 位”。第4种情况看起来像是连接超时,也可根据是否收到与连接有关的 ICMP 差错来返回其他的差错。

  一个被人们不断讨论的关于保活选项的问题就是两个小时的空闲时间是否可以改 变。通常他们希望该数值可以小得多,处在分钟的数量级。这个值通常可以改变,但是在所有系统中,保活间隔时间是系统级的 变量,因此改变它会影响到所有使用该功能的用户

# 保活时间:默认7200秒(2小时)如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段
cat /proc/sys/net/ipv4/tcp_keepalive_time
#保活时间间隔:默认75秒,总共发送 9 个这样的探查,每个间隔 75 秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
#保活探测数:默认9次
cat /proc/sys/net/ipv4/tcp_keepalive_probes

正常保活包,详见 …/test/keepAlive.cap
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y0jJjUzW-1611729160755)(./img/keepalive.png)]
在这里插入图片描述

网络异常保活尝试包,详见 …/test/keepAliveCrash.cap
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EKVxRRpm-1611729160757)(./img/keepaliveCrash.png)]
在这里插入图片描述

异常后网络恢复保活相应包,详见 …/test/keepAliveReset.cap
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9xj9yBXW-1611729160758)(./img/keepaliveReset.png)]
在这里插入图片描述

1.3. TCP的重传定时器

   TCP 提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确 认都有可能会丢失。 TCP 通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。

最初的算法:

R = k1*R+ (1-k1)M //均值
RTO = k2*R        //均值直接估算 RTO
  • M 表示所测量到的RTT
  • k1 是一个推荐值为 0.9 的平滑因子。每次进行新测量的时候,这个被平滑的 RTT 将得到更新。每个新估计的 90% 来自前一个估计,而 10% 则取自新的测量
  • 这里的 k2 是一个推荐值为 2 的时延离散因子

优化后算法(结合了方差):

Err = M-A
A = A+g*Err      //均值,等同于 A = A+g(M-A)=(1-g)A+gM,和初始算法一致,g=1-k1
D = D+h(|Err|-D) //均值偏差是对标准偏差的一种好的逼近,等同于 D = (1-h)D+h|M-A|
RTO = A+4D       //均值和偏差同时估算 ROT
  • M 表示所测量到的RTT
  • Err 是刚得到的测量结果与当前的 RTT 估计器之差。
  • A 是被平滑的 RTT(均值的估计器)
  • D 则是被平滑的均值偏差,A和D均被用于计算下一个重传时间(RTO)。
  • 增量g起平均作用, 取为 1/8(0.125)。
  • 偏差的增益是h,取值为0.25。当 RTT 变化时,较大的偏差增益将使 RTO 快速上升。
  • 基于均值和方差来计算 RTO,将比作为均值的常数倍数来计算 RTO能提供更好的响应。

1.4. TCP的2MSL定时器

具体详见TCP从建立到终止 的 2.3.1 2MSL等待状态 章节

1.5. 参考资料

  1. TCP的超时与重传
  2. TCP的坚持定时器
  3. TCP的保活定时器
  4. TCP的超时与重传
用asio的定时器实现带超时的connect,备忘 #include "stdafx.h"   #include    #include    #include    #include       using namespace boost::asio;   using boost::asio::ip::tcp;      class connect_handler   {   public:       connect_h 阅读详情

相关推荐

【Netty4 简单项目实践】六、断掉未鉴权的TCP长连接--ChannelHandelContext中的定时器用法

本文是Netty实践中的一个小应用:用ChannelHandlerContext定时器来实现阻断无效TCP长连接的方法。

arctan90的专栏 7941

TCP的四种定时器

TCP提供可靠的端到端数据传输,保证端到端的方法之一就是确认从另一端收到的数据。但数据和ACK在传输的过程中有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。 对于每个连接,TCP管理4个不同的定时器。 1,重传定时器:适用于希望收到另一端的确认ACK 2,坚持定时器:使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口 3,保活定时器:可检测一个空闲连接的另一端何时崩溃或重启 4,2M...

ftzchina的博客 3368

TCP保活定时器的使用

linux c 在tcp服务端或客户端设置保活定时器、ip选项域等。

TCP定时器

目录 坚持计时器:Persistent Timer 关于窗口大小 保活计时器:Keeplive Timer TCP有四种定时器:重传定时器,坚持计时器,保活定时器,时间等待计时器。我们主要看其中两种:坚持定时器,保活定时器。 定时器是做什么的呢? 这要提到面试的时候老生常谈的问题:TCP和UDP的区别。最直接的,TCP安全,UDP不安全;那么问题来了,TCP为什么是安全的呢,又是怎么实现的呢?这个答案很长,比如面向连...

兔子扛刀 419

TCP 四种定时器(重传定时器,坚持计时器,保活定时器,时间等待计时器)

主要介绍了TCP 四种定时器,重传定时器,坚持计时器,保活定时器,时间等待计时器的相关资料,需要的朋友可以参考下

详解TCP的四种定时器

主要介绍了详解TCP的四种定时器的相关资料,需要的朋友可以参考下

TCP的7种定时器

我们知道TCP是面向 连接 的, 可靠 的, 流式 传输的协议, 在TCP的里面有7种定时器, 分别是: 建立连接定时器(connection-establishment timer)重传定时器(retransmission timer)延迟应答定时器(delayed ACK timer)坚持定时器(persist timer)保活定时器(keepalive timer)FIN_WAIT_2

Number_0_0的博客 897

Codesys电子凸轮Cam表实战:从可视化配置到程序化构建

本文详细介绍了Codesys电子凸轮Cam表的实战应用,从可视化配置到程序化构建的全过程。通过包装机和印刷机案例,解析Cam表的基础设置、调试技巧及动态构建方法,帮助工程师快速掌握电子凸轮技术,提升运动控制精度和效率。

weixin_29309785的博客 298

解读TCP 四种定时器

一.TCP的四种定时器 TCP使用四种定时器(Timer,也称为“计时器”): 重传计时器:Retransmission Timer 坚持计时器:Persistent Timer 保活计时器:Keeplive Timer 时间等待计时器:Time_Wait Timer。   (1)重传计时器: 重传定时器:为了控制丢失的报文段或丢弃的报文段,也就是对报文段确认的等待时间

xiaofei0859的专栏 1万+

Pspice安装教程:Windows系统完整指南(含环境变量设置)

详细讲解在Windows系统中完成Pspice安装的全过程,涵盖安装步骤与关键的环境变量设置,帮助用户顺利运行仿真工具。适合初学者快速上手pspice安装教程中的核心环节。

weixin_42230607的博客 1177

VulnHub系列之BadStore_123渗透测试

BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004)

Flynn的博客 1630

TCP-IP详解之TCP的坚持定时器5

TCP的坚持定时器章节目录 1.一个例子 2.糊涂窗口综合症 前言 可以在图20-3中看到这种情况。当发送方接收到报文段9时,它打开被报文段8关闭的窗口并立即开始发送数据。TCP必须能够处理打开此窗口的ACK(报文段9)丢失的情况。ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含有数据的ACK报文段。 如果一个确认丢失了,则双方就有可能因为等待对方而使连...

怀素的专栏 545

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3137

5.8.7 TCP可靠传输(三)定时器

中的窗口字段)通知而设置的,如果接收方缓存满了,就可能给发送方发送一个窗口字段值为零的报文段,当接收方缓存有了空闲时,就会向发送方发送窗口值更新报文段,这时我们又要考虑一种情况,如果窗口更新报文段丢失,此时接收方又有了缓存空间等待发送方进行数据发送,而发送方没有等到窗口更新报文,所以不能发送数据,也处于等待状态。如果服务器超过两个小时还没有收到来自于客户端的信息,此时就发出一个试探的报文段,但是如果发送了10个探测报文段对方仍然没有应答,此时的TCP的连接就终止了。这种定时器是专门对付零窗口(

nytcjsjboss的博客 979

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持

LT9211 单路mipi转双路mipi芯片

TEL15012949045的博客 5014

紫光展锐面试——FPGA/IC设计面试面经案例总结

自我介绍;研究生的主要研究方向是什么?为什么想要应聘数字芯片相关的工作?简单介绍下数字IC设计流程。逻辑综合主要做什么?你有实际做过逻辑综合工作吗?你了解SS corner和FF corner吗?综合时应该使用哪个corner?综合时需要考虑hold吗?为什么?提高时钟频率对setup和hold有什么影响?为什么?hvt、rvt/svt、lvt有什么区别?c40、c50是指什么概念?有什么区别?你对EDA工具有过了解吗?

FPGA/MATLAB学习教程/源码/项目合作开发 1563

[Qt] TCP客户端与服务器断开连接自动重联机制

TCP服务器断开连接自动重联机制 客户端加入定时器实现断线重联(客户端服务端代码见上一篇博客) 编译环境:Qt 5.9.5 ui界面如图: 代码如下 tcpclient.h #ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QWidget> #include <QTcpSocket> #include <QTime...

weixin_44779591的博客 5556

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 999

9.1 定时器初始化

TCP为每条连接先后设置9个定时器,分别为:重传定时器、丢失探测(LOSS_PROBE)定时器、早期重传(EARLY_RETRANS)定时器、SYN-ACK定时器、延迟ACK定时器、坚持定时器、保活定时器、FIN_WAIT2定时器、TIME_WAIT定时器。由于一些定时器不能同时设置,故TCP使用了5个定时器结构完成全部9个定时器的功能。相关数据结构如下: 285 struct sock

Remy的学习记录 2046

14、固态变压器(SST)供电的直流微电网控制策略解析

本文详细解析了基于固态变压器(SST)供电的直流微电网的分层功率管理与控制策略。重点介绍了二次控制和三次控制算法的原理及实现方式,探讨了将SST作为固态同步电机(SSSM)的控制概念及其频率调节方法。通过小型直流微电网的实验案例验证了控制策略的有效性,并对不同三次控制方法的优缺点进行了比较。最后,文章提出了未来控制策略的优化方向,包括通信技术提升、多目标优化和智能算法的应用,为直流微电网的可靠、高效运行提供了理论支持和实践指导。

star的博客 551

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TCP的坚持定时器

引言 TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为 0会发生什么情况呢?这将有效地阻止发送方传送数据,直到窗口变为非0为止。 TCP不对ACK报文段进行确认, TCP只确认那些包含有数据的ACK报文段。 如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非 0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器 (persist timer)来周期

一口Linux的专栏 571

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

go 实现 tcp服务器检测客户端是否发送心跳包或在5秒内没有请求,那么关闭客户端

这个例子中,服务器会接受客户端连接,并为每个连接启动一个新的goroutine(通过`go handleConnection(conn)`)。在`handleConnection`函数中,我们使用一个定时器(`timer`)来检测是否在5秒内没有收到客户端的请求。以下是一个简单的例子,演示如何实现一个TCP服务器,检测客户端是否发送心跳包,如果在5秒内没有请求,则关闭客户端连接。// 设置读取超时时间为1秒,以便在定时器到期后有机会处理。// 设置一个定时器,如果5秒内没有收到客户端的请求,关闭连接。

Fly_Sky 1108

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RT-Thread系统下LwIP Socket性能调优:从1M到5M,我的TCP服务器带宽提升实战记录

本文详细记录了在RT-Thread系统下通过LwIP Socket性能调优实现TCP服务器带宽从1M提升到5M的实战过程。通过内存池配置优化、TCP窗口与缓冲区调整、任务调度优化等关键步骤,结合嵌入式开发中的实际测试数据,为开发者提供了可复用的性能提升方案。

weixin_30851867的博客 260

tcping项目v1.5.0版本发布:TCP网络连通性测试工具新特性解析

tcping项目v1.5.0版本发布:TCP网络连通性测试工具新特性解析 tcping是一款专注于TCP层网络连通性测试的开源工具,它通过模拟TCP三次握手过程来检测目标主机的可达性和响应时间,相比传统ICMP协议的ping工具,tcping能够更好地反映真实应用场景下的网络状况。近日该项目发布了v1.5.0版本,带来多项重要改进和功能增强。 核心架构优化 v1.5.0版本对底层架构进行了显著优化...

gitblog_01346的博客 538

面试必懂:TCP协议七个定时器

建立连接时: 连接建立(connection establishment)定时器,在发送SYN报文段建立一条新连接时启动。如果没有在72秒内收到响应,连接建立将中止。 传输数据时: 重传(retransmission)定时器,在TCP发送数据时设定。如果定时器已超时而对方的确认还未到达,TCP将重传数据。重传定时器的值(即TCP等待对方确认的时间)是动态计算的,取决于TCP为该连接测量的往返视觉和该报文段已被重传的次数。 延迟应答(delayed ACK)定时器,接收端收到数据必须确认但无需.

Jiangtagong的博客 449
上一篇: 4_TCP的超时与重传
下一篇: 9_TCP问题集
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值