TCP管理的4个不同的定时器:

1.重传定时器:用于当希望收到另一端的确认。

2.坚持定时器:使窗口大小信息保持不断流动。

3.保活定时器:检测TCP空闲连接的另一端何时崩溃或重启。

4.2MSL定时器:测量一个连接处于TIME_WAIT状态的时间。MSL(报文段最大生存时间)

重传定时器

规定:第一次发送后所设置的超时时间为1.5秒,之后为3、6、12、24、48、多个64秒,     第一次到最后一次的时间差约为9分                  钟,定义该值的变量名为tcp_ip_abort_interval。

若收到特定报文段的确认之前计时器已经超时,则重传该报文,并把计时器复位。

慢启动并不完全正确,慢启动期间进入网络的分组数增加的速率仍然是在增加的,只有在达到ssthresh拥塞避免算法起作用时,这种增加的速率才会慢下来。

坚持定时器

根本目的是防止接收端回复的ACK报文丢失,导致发送端不能及时发送下一个报文的死锁情况。其作用是使窗口大小信息保持不断流动。

当接收端回复的通告窗口为0,从而使客户端停止发送任何数据时,发送方的坚持定时器开始计时,第一次触发坚持定时器重新发送报文的时间间隔约为5秒,之后的时间间隔约为5、6、12、24、48、多个60秒,这与重传定时器触发的时间间隔类似,值得注意的时,坚持定时器与重传定时器不同的是:坚持定时器的TCP从不放弃发送窗口探查,之后的探查每隔60秒发送一次,一直持续到窗口被打开或者TCP连接被终止。此外,坚持定时器重发的窗口探查为字节数为1的报文,这降低了对网络上带宽的占用。

TCP的保活定时器:(通常用于服务器)

我们之前提到过TCP的半打开(half-open)连接,即一端已经关闭或者异常终止而没有通知另一端所引起。保活功能就是试图在服务器端检测到这种半打开的连接。

但也有人提出异议,如果TCP的两端都没有异常,而是中间路由器因为某种原因down掉而又重新启动,保活功能将会认为TCP的一端出现问题而将一个很好的连接断掉,他们认为保活功能不应该在TCP中提供,而应该由应用程序完成,例如,BGP协议每30秒向对端发送一个应用的探查;osfp协议默认hello消息10秒,dead 40秒,即如果40s没有收到hello消息,就认为邻居down掉了。

规定:如果一个给定的连接在默认的两个小时(tcp_keepidle = 14400 每个代表500ms)之内没有任何动作,则服务器就向客户发送一个探查报文段,客户机一定处于以下四种状态之一:

(1).客户机正常运行,并从服务器可达。这时,服务器将keepalive timer复位。

(2).客户机已经崩溃或者关闭或者重新启动。客户机的TCP没有响应,服务器将在75秒超时后在此向客户机发送探查报文段,总共发送10个,每个间隔75秒(tcp_keepintvl = 150),如果服务器都没有收到响应,则终止TCP连接。

(3).客户机崩溃并已经重新启动。此时如之前提到的半打开连接,客户端不再承认与服务器的tcp连接,它会向服务器发送RST响应,终止该连接。

(4).客户机正常运行,但是服务器不可达。这时,服务器的探查报文超时,接下来的操作与情况(2)相同。

2MSL定时器:

TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间(MSL)。它是任何报文段被丢弃前在网络内的最长时间(默认为2分钟,实现中常设置为30秒,1分钟或2分钟)。正如前文所提2MSL状态,2MSL定时器在TCP终止的四次握手中的第四次握手开始启动,此时发送FIN方处于LAST_ACK状态,而发送ACK方处于TIME_WAIT状态,为了确保它发送的最后一个ACK可以顺利的到达服务器,2MSL定时器启动,直至到达预定的时间才复位结束,双方进入CLOSED状态。如果主动关闭方在被动关闭方的TIME_WAIT状态不等待一段时间就直接释放连接并进入 CLOSED 状态,那么主动关闭方无法收到来自被动关闭方重发的 FIN+ACK 报文段,也就不会再发送一次确认ACK 报文段,因此被动关闭方就无法正常进入CLOSED状态。

此外,还有一点要说明,即使主动关闭方顺利收到ACK并且进入CLOSED状态,被动关闭方仍然要等待2MSL时间,并且,这段时间内,被动关闭方的端口不可以被其他应用程序使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

TCP的四种定时器简单记录的更多相关文章

  1. TCP四种定时器--学习笔记

    TCP使用四种定时器: 重传定时器(Retransmission Timer).坚持定时器(Persistent Timer).保活定时器(Keeplive Timer).时间等待定时器(Time_W ...

  2. wpf中应该使用c#四种定时器中的DispatcherTimer

    c#中有四种定时器 1:System.Threading.Timer 使用: private System.Threading.Timer timerClose; timerClose = new S ...

  3. 动手学习TCP:4种定时器

    上一篇中介绍了TCP数据传输中涉及的一些基本知识点.本文让我们看看TCP中的4种定时器. TCP定时器 对于每个TCP连接,TCP管理4个不同的定时器,下面看看对4种定时器的简单介绍. 重传定时器使用 ...

  4. 四种比较简单的图像显著性区域特征提取方法原理及实现-----> AC/HC/LC/FT。

    laviewpbt  2014.8.4 编辑 Email:laviewpbt@sina.com   QQ:33184777 最近闲来蛋痛,看了一些显著性检测的文章,只是简单的看看,并没有深入的研究,以 ...

  5. 解读TCP 四种定时器

    TCP 是提供可靠的传输层,它使用的方法之一就是确认从另一端收到的数据.但是数据和确认都可能会丢失.TCP 通过在发送时设置一个定时器来解决这个问题.如果当定时器溢出时还没收到确认,它就会重传该数据. ...

  6. TCP交换数据流——Nagle算法简单记录

    Nagle算法: 该算法提出的目的是想解决网络中大量的小的TCP数据包造成网络拥塞的问题,举个例子,当客户端要发送一个字节的TCP数据包到服务器时,我们实际上产生了41字节长的分组:包括20字节的IP ...

  7. Tomcat,Weblogic,WebSphere,JBoss四种服务器简单对比

    1,tomcat是Servlet容器,支持JSP.Servlet.JDBC等J2EE关键技术,常用于tomcat开发基于数据库.Servlet和JSP页面的Web应用.2,tomcat不是EJB容器, ...

  8. Jquery调用webService的四种方法 转载-记录

    我总结几个关键点 1. 服务必须声明为ScriptService(否则会出现下面的问题) 2.服务的方法不需要任何更改,保持原状 3.客户端用jquery的.ajax方法来调用 3.1 type必须是 ...

  9. RabbitMQ简单实现,exchange四种模式,持久化

    RabbitMQ目录 一.简介,简单实现二.Exchange四种类型简单介绍三.消息确认,交换机.队列及消息持久化一.简介及简单实现RabbitMQ是一个消息代理:它接受并转发消息.你可以把它当成一个 ...

随机推荐

  1. Codeforces 429D Tricky Function(平面最近点对)

    题目链接  Tricky Function $f(i, j) = (i - j)^{2} + (s[i] - s[j])^{2}$ 把$(i, s[i])$塞到平面直角坐标系里,于是转化成了平面最近点 ...

  2. Java NIO中的FileLock(文件锁)

    FileLock,文件锁. 文件锁在OS中很常见,如果多个程序同时访问.修改同一个文件,很容易因为文件数据不同步而出现问题.给文件加一个锁,同一时间,只能有一个程序修改此文件,或者程序都只能读此文件, ...

  3. 成长笔记--解决Eclipse 变量名的自动补全问题

    大家使用eclipse敲代码的时候,是不是都被这样一个问题困扰着.就是键入一个变量名的时候,会自动提示补全:在你的变量名后面加上类型的名字!这个时候,你就必须键入Esc才不会自动补全你的变量,如果你键 ...

  4. Idea下Maven的使用

    一.导入maven结构的web工程 (1)在Intellij IDEA中选择File->New->Project from Version Control->Subversion. ...

  5. RHEL CentOS Fedora各种源介绍和安装

    CentOS默认自带CentOS-Base.repo源,但官方源中去除了很多有版权争议的软件,而且安装的软件也不是最新的稳定版.   下面介绍各种第三方软件库,以下软件库适用于与RHEL完全兼容的li ...

  6. Youtube深度学习推荐系统论文

    https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/45530.pdf https://zh ...

  7. 一群牛人翻译:The Swift Programming Language 中文版

    无聊闲逛GIthub,看到一群牛人在github上创建了一个关于Switf的文档翻译项目 The Swift Programming Language 中文版 项目地址:中文版 Apple 官方 Sw ...

  8. Web前端开发规范收集

    在Web开发中,后端跟前端配合非常easy出现故障.这时我们就须要一些规则来约束前端任意的编写. CSS编程规范 1.      属性书写基本顺序 a.      先位置属性(position, to ...

  9. Java enum枚举的使用方法

    一. 出现背景: 在JDK1.5之前,我们定义常量是这种:public static final String RED = "RED"; 在JDK1.5中增加了枚举类型,我们能够把 ...

  10. SAS学习经验总结分享:篇二—input语句

    SAS编程语言中input语句的应用         SAS数据步的建立离不开input语句,在读入外部数据或cards语句后面的数据块时需要通过input语句定义变量.下面介绍input语句定义变量 ...