TCP定时器

1. TCP中7种定时器

 TCP中有7中定时器

(1)建立连接定时器(connection-establishment timer)

(2)重传定时器(retransmission timer)

(3)延迟应答定时器(delayed ACK timer)

(4)坚持定时器(persist timer)

(5)保活定时器(keepalive timers)

(6)FIN_WAIT_2定时器(FIN_WAIT_2 timer)

(7)TIME_WAIT定时器(TIME_WAIT timer,也叫2MSL timer)

2. 建立连接定时器(connection-establishment timer)

这个定时器是在建立连接的时候使用的,TCP建立连接需要3次握手,如图:

 

建立连接的过程中,在发送SYN时,会启动一个定时器(默认应该是3秒),如果SYN包丢失了,那么3秒以后会重新发送SYN包(当然还会启动一个新的定时器,设置成6秒超时),当然也不会一直没完没了的发SYN包,在/proc/sys/net/ipv4/tcp_syn_retries可以设置到底要重新发送几次SYN包。如图:

3. 重传定时器(retransmission timer)

重传定时器在TCP发送数据时设定,在计时器超时后没有收到返回的确认ACK,发送端就会重新发送队列中需要重传的报文段。使用RTO重传计时器一般有如下规则:
(1)当TCP发送了位于发送队列最前端的报文段后就启动这个RTO计时器
(2)如果队列为空则停止计时器,否则重启定时器
(3)当计时器超时后,TCP会重传发送队列最前端的报文段
(4)当一个或多个报文段被累计确认后,这个货这些报文段会被清除出队列
重传计时器保证了接收端能够接收到丢失的报文段,继而保证了接收端交付给接收进程的数据始终是有序完整的。因为接收端永远不会把一个失序不完整的报文段交付给接收进程。

4. 延迟应答定时器(delayed ACK timer)

延迟应答也被称为捎带ACK,这个定时器是在延迟应答的时候使用的。为什么要延迟应答呢?延迟应答是为了提供网络传输的效率。
举例说明,比如服务端收到客户端的数据后,不是立刻回ACK给客户端,而是等一段时间(一般最大200ms),这样如果服务端要是有数据需要发给客户端,那么这个ACK就和服务端的数据一起发给客户端了,这样比立即给客户端一个ACK节省了一个数据包。

5. 坚持定时器(persist timer)

TCP通过让接收方指明希望从发送方接收的数据字节数(即窗口大小)来进行流量控制。如果窗口大小为0会发生什么情况呢?这将有效地阻止发送方传送数据,直到窗口变为非0为止。接收端窗口变为非0后,就会发送一个确认ACK指明需要的报文段序号以及窗口大小。
如果这个确认ACK丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据(因为它已经向发送方通告了一个非0的窗口),而发送方在等待允许它继续发送数据的窗口更新。为防止这种死锁情况的发生,发送方使用一个坚持定时器(persist timer)来周期性地向接收方查询,以便发现窗口是否已增大。这些从发送方发出的报文段称为窗口探查(window probe)。

6. 保活定时器(keepalive timer)

许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接,也就是说,如果TCP连接的双方都没有向对方发送数据,则在两个TCP模块之间不交换任何信息。
两个应用进程--客户进程或服务器进程都没有使用应用级的定时器来检测非活动状态,而这种非活动状态可以导致应用进程中的任何一个终止其活动。
许多时候服务器希望知道客户主机是否崩溃并关机或崩溃又重新启动,许多实现提供的保活定时器可以提供这种能力。
保活功能主要是为服务器应用程序提供的,服务器应用希望知道客户主机是否崩溃。保活功能试图在服务器端检测到这种半开放的连接。

如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个探查报文段,客户主机必须处于一下4个状态之一:
(1)客户主机依然正常运行,并从服务器可达。客户端TCP响应正常,而服务器也知道对方是正常工作的。服务器在两个时以后将保活定时器复位。如果在两个小时定时器到时间之前有应用程序的通信量通过此链接,则定时器在交换数据后的未来2小时再复位
(2)客户主机已经崩溃,并且关闭或正在重新启动。在任何一种情况下,客户的TCP都没有响应,服务器将不能够收到探查的响应。--会返回诸如“连接超时”之类的信息。
(3)客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接。 -- 会返回诸如“连接被对方复位”
(4)客户主机正常运行,但是从服务器不可达。与(2)相同。

在TCP连接建立的时候指定了SO_KEEPALIVE,保活定时器才会有效。如果客户端和服务端长时间没有数据交互,那么需要保活定时器来判断是否对端还活着,但是这个其实很不实用,因为默认是2小时没有数据交互才探测,时间实在是太长了。如果你真的要确认对端是否活着,那么应该自己实现心跳包,而不是依赖于这个保活定时器。

7. FIN_WAIT_2定时器(FIN_WAIT_2 timer)

主动关闭的一段调用完close之后(即发FIN给被动关闭的一段,并且收到其对FIN的确认ACK)则进入FIN_WAIT_2状态。如果这个时候因为网络突然断掉,被动关闭的一段宕机等原因,导致主动关闭的一段不能收到被动关闭的一段发来的FIN,主动关闭的一端总不能一直等着,占用资源不释放吧。这个时候就需要FIN_WAIT_2定时器出马了,如果在该定时器超时的时候,还是没收到被动关闭一端发来的FIN,那么不好意思,不等了,直接释放这个连接。FIN_WAIT_2定时器的时间可以从/proc/sys/net/ipv4/tcp_fin_timeout中查看和设置。如图:

8. TIME_WAIT定时器(TIME_WAIT timer,也叫2MSL timer)

TIME_WAIT是主动关闭连接的一端之后进入的状态,而不是直接变成CLOSED的状态,为什么呢?
(1)万一被动关闭的一端在超时时间内没有收到最后一个ACK,则会重发最后的FIN,2MSL(报文段最大生存时间)等待时间保证了重发的FIN会被主动关闭的一端收到且重新发送最后一个ACK
(2)另一个原因是在2MSL等待时间内,任何迟到的报文段会被接收并丢弃,防止老的TCP连接的包在新的TCP连接里出现。不可避免,在这个2MSL等待时间呢,不会建立同样(源IP、源端口、目的IP、目的端口)的连接。

 

转载于:https://www.cnblogs.com/lujiango/p/10494850.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql优化大全

1. 优化SQL步骤 1. 通过 show status和应用特点了解各种 SQL的执行频率 通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得。 SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果。 如显示当前s…

Halcon实现边缘提取

一、边缘提取 1、设置ROI兴趣区域 2、快速二值化,并连接相邻区域。 这样做的目的是进一步减少目标区域,通过二值化将目标区域大概轮廓提取出来 3、提取最接近目标区域的轮廓 常用函数有boundary,gen_contour_region_xld 4、根据自己的需求提取…

软件工程网络15个人阅读作业1 201521123038 游舒婷

软件工程网络15个人阅读作业1 201521123038 游舒婷 1.博客园地址 sakurai3104 2.码云地址 sakurai3104 3.阅读与思考 (1)回想一下你初入大学时对网络工程专业的畅想 当初你是如何做出选择网络工程专业的决定的? 填报志愿的时候,大…

18LaTeX学习系列之---LaTeX的参考文献

目录 目录前言(一)简单的参考文献1.说明2.源代码3.输出效果(二)以文件管理的方式1.说明:2.源代码:3.输出效果(三)直接从源网站获取1.说明2.操作目录 本系列是有关LaTeX的…

Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究

Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究 在github上阅览README.md以获得最佳阅读体验,点这里 v-for响应式key, index及item.id参数对v-bind:key值造成差异研究 实验背景 通常情况下,我们渲染一个li列表,采用…

halcon edges_sub_pix算子

转载http://blog.51cto.com/juwen/133003 介绍一下Canny算子: 使用累计直方图计算两个阀值。凡是大于高阀值的一定是边缘; 凡是小于低阀值的一定不是边缘;如果检测结果大于低阀值但又小于高阀值,那就要看这个像素的邻接像素中有…

Python 基础(常用数据结构)

常用数据结构 1)元组 元组是一种静态的数据结构,无法修改,若要修改只能重新生成新的元组。 输出结果: 元组元素的获取是通过索引值去获得的;例如上面的tup1[0]返回apple;另外你可以直接把tup1一次性赋给多个…

Java IO(二)——RandomAccessFile

一、RandomAccessFile RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持"随机访问"方式,可以跳转到文件的任意位置处读写数据。要访问一个文件的时候,不想把文件…

halcon select_shape_xld按区域大小描绘xld

常用与对xld进行以面积、长、宽进行XLD的选择操作。 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) XLD:需要选择的xld SelectedXLD:选择后的xld Features:面积、长、高等 Operation:and、or等 Min:最小值门…

工业三防手持终端如何选

物联宇手持终端作为工业级的数据采集器,目前[]()已广泛应用在物流快递、生产制造、零售、医疗、公共事业等领域。由于工业环境的复杂性,手持终端在恶劣的环境下作业,在性能、稳定性、电池耐用性上的要求都较高,同时还必须采用一些…

centos7 安装python3

1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置 可见执行文件在/usr/bin/ 目录下,切换到该…

centos svn 的搭建

一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏…

halcon边缘提取和检测常用方法

转自:http://blog.csdn.net/Bob_qiuxu/article/details/46924969 一、边缘提取 1、设置ROI兴趣区域 2、快速二值化,并连接相邻区域。 这样做的目的是进一步减少目标区域,通过二值化将目标区域大概轮廓提取出来 3、提取最接近目标区域的轮廓…

oracle sqlplus常用命令

转自:https://www.cnblogs.com/wdx8927304/p/7927613.html 一、sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1)、sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默…

使用css绘制小三角

<div style"width:0;height:0;overflow: hidden;border-top:4px solid transparent;border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid red; "></div>转载于:https://www.cnblogs.com/boonook/p/8570442.h…

C#与halcon联合开发——内存溢出

1.对所以的局部零时变量HObject类的使用前后都加Dispose(); 2.对全局的HObject类变量进行如下定义 HObject liveImage null;HObject ExpGet_liveImage(){return liveImage;}void ExpSet_liveImage(HObject obj){if (liveImage ! null)liveImage.Dispose();liveImage obj.Cop…

点击跳转到QQ聊天界面

<!--//需要添加好友验证--><a href"tencent://message/?uinQQ号码&Site&Menuyes"><img src"需要点击的图片" width"80"/></a><!--不需要添加好友验证--><a href"tencent://message/?Menuyes&am…

学习React的一知半解

① 初探 HMTL的渲染过程 ​ 这个结构化文本就是 HTML 文本&#xff0c; HTML 中的每个元素都对应 DOM中某个节点&#xff0c;这样&#xff0c;因为 HTML 元素的逐级包含关系&#xff0c; DOM 节点自然就构成了一个树形结构&#xff0c;称为 DOM 树 。 ​ 浏览器为了渲染 HTML 格…

DataTable 转为ListT集合

public static List<T> HubbleTableToList<T>(this DataTable dt) where T:Class{List<T> _list new List<T>();if (dt null) return _list;T model;foreach (DataRow dr in dt.Rows)//进行循环dataTable行数据{model Activator.CreateInstance<…

工业相机与镜头分辨率匹配

// 转自 奥普特讲述工业相机与镜头分辨率匹配的技术方案 随着机器视觉行业的发展&#xff0c;为了更好的满足广大客户选配合适镜头的需求&#xff0c;奥普特自动化科技有限公司为您简述工业相机如何选配合适的镜头&#xff0c;以及在相机与镜头的分辨率匹配方面的技术方案。 …