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,一经查实,立即删除!

相关文章

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

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

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

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

Python 基础(常用数据结构)

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

Java IO(二)——RandomAccessFile

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

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) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏…

软件建模——第3章 项目前期

3.1 项目前期的主要工作 3.1.1 现状分析 1.硬件分析 2.软件分析 3.1.2 需求收集 3.1.3 粗略设计 1.体系结构设计 2.硬件(网络)设计 3.应用系统设计 4.安全设计 5.配套设计 3.1.4 可行性分析 3.2 结构化的项目前期实例 3.2.1 组织分析(自动化…

echarts_部分图表配置_图表click事件

额。。当然其他事件都是支持的,此文仅以click做简单介绍: 请点击“柱子”。。。 官方介绍:http://echarts.baidu.com/tutorial.html#ECharts%20%E4%B8%AD%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%92%8C%E8%A1%8C%E4%B8%BA 1 function bottom_z (thisI…

mysql 5.7.25 的安装与 安装错误修改 适用于5.7解压版

1,根据自己的需求去官网下载 2.解压到自己喜欢的路径 其中date 和 my.ini 在5.7后面的版本 解压后是没有的,需要自己配置。 可以自己创建my.ini文件 ,但是不能自己创建date文件夹。 其中my.ini文件的配置如下(如果报错要将目录文件…

解除服务器端口号占用及服务器端口号的修改

这几天因为面试的原因把SSH的东西重新巩固下,所以用的服务器是Tomcat。但是因为前一个项目用的服务器是Jboss,项目一期迭代完成,转交测试组进行测试,提了很多bug,所以当改bug的时候发现我Jboss的服务器可以允许&#x…

Python 标准类库-Windows特殊服务之msvcrt

标准类库-Windows特殊服务之msvcrt by:授客 QQ:1033553122 广告:出售自研自动化小平台(无需编码也可用),有需要请联系 测试环境 win7 64位 Python 3.4 64bit 控制台I/O 1. 例子 getch演示 假设 1.py脚本内容如下&#…

redis服务器学习一

一:什么是redis服务器 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支…

java项目启动tomcat没报错,然后页面报404无法找到,重新编译后,出现以下状态...

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating bean with name MapperScannerConfigurer defined in c…

相机与镜头常识

1.焦距(FocalLength)   焦距是从镜头的中心点到胶平面上所形成的清晰影像之间的距离。焦距的大小决定着视角的大小,焦距数值小,视角大,所观察的范围也大;焦距数值大,视角小,观察范…

企业云存储:为什么中大型企业偏爱自建私有云?

“上云?我们通常自建企业私有云。”9102年了,在云存储服务的选择上,中大型企业基本步调一致,统筹规划自建企业私有云。为什么中大型企业都偏爱自建企业私有云?一、长久的成本考量从账面上看,通常私有云初期…

递归就这么简单

递归介绍 本来预算此章节是继续写快速排序的,然而编写快速排序往往是递归来写的,并且递归可能不是那么好理解,于是就有了这篇文章。 在上面提到了递归这么一个词,递归在程序语言中简单的理解是:方法自己调用自己 递归其…

阿里云RPA(机器人流程自动化)干货系列之二:认识RPA(下)

2019独角兽企业重金招聘Python工程师标准>>> 导读:本文是阿里云RPA(机器人流程自动化)干货系列之二,主要介绍了RPA的发展齐纳经和主要使用场景有哪些,目前国内外主流的RPA厂商以及RPA的未来在哪。 一、RPA的…

Halocn OCR识别入门学习

一、建立OCR库 dev_close_window() read_image(Image,OCR) get_image_size(Image,Width,Hight) dev_open_window(0,0,Width,Hight,black,Window) dev_display(Image)*字符处理 rgb1_to_gray(Image,ImageGray) *鼠标画你要找的roi区域 draw_rectangle1(Window,Row1,Column1,Row…

ctsc2009 移民站选址

分析:非常非常好的一道题! 首先需要对问题进行转化: 行列无关,对于行单独处理,对于列单独处理必然存在一个最优方案使得每一个新站与旧站重合.转化1很显然,对于转化2,是一类非常经典的“中位数问…