前言

在有关TCP的章节中,介绍了四种定时器,它们体现了TCP的可靠性,其中最重要的 就是重传定时器了,剩下的定时器都是为了解决TCP的理解上的一些问题而设置的。

四种定时器:

  • 2MSL定时器,出现在 TCP连接的建立与终止。
  • 重传定时器,出现在 TCP的超时与重传。
  • 坚持定时器。
  • 保活定时器。

相关随笔:

TCP连接的建立与终止
TCP的超时与重传
TCP的坚持定时器
TCP的保活定时器

2MSL定时器

出现:TCP连接的建立与终止 教材P183

四次挥手客户端一共有三次状态:应用程序关闭,发送完第一个FIN之后进入 FIN_WAIT1,之后接收到来自服务器的ACK进入 FIN_WAIT2。接收到来自服务器的FIN进入 TIME_WAIT 状态(又称2MSL等待状态),使用2MSL定时器进行计时。

MSL:TCP实现选择的 一个报文段最大生存时间MSL。与IP的TTL类似。
RFC 793 指出MSL为2分钟,但是实际中常用值一般为 30s,1min,或者2min。

主要作用:在 TIME_WAIT状态 停留的时间为2倍的MSL。这样如果最后的ACK丢失 -> 另外一端(被动关闭)超时 重新发送FIN -> 可以让TCP重发最后一个ACK。

重传定时器

出现:TCP的超时与重传 教材P226-232

它对RTT和RTO的计算是整个 TCP超时与重传 中最重要的部分。
重传定时器,以RTO(Retransmission Timeout 重传超时时间)的时间来计时,一旦溢出超时即重发数据报。

这时就涉及到了RTT和RTO的计算了,这里有不同的策略:
正常接收到数据报:使用公式法计算RTT和RTO。
超时:采用指数退避策略。

公式法需要注意的是:采用了 被平滑的RTT估计器 和 均值偏差,降低了计算的误差。

主要作用:是TCP可靠性的体现,超时之后重传数据报,从而保证接收方能够接收到完整的数据。

坚持定时器

出现:TCP的坚持定时器 教材P245-250

当通知窗口为0的时候,发送方停止发送数据,等待接收方发送的非0的窗口更新。但是,如果这个非0的窗口更新丢失,会造成一种死锁的现象:发送方等待这个窗口更新的出现,而接收方等待发送方发送的数据。

为了防止这种死锁现象的发生,发送方使用一个 坚持定时器 来周期性地向接收方询问,以便发现窗口是否增大。这些发送的报文段称为 窗口探查。
在通告窗口设置为0之后,客户设置了 坚持定时器,在该定时器时间到时客户还没有接收到一个窗口更新,它就探查这个空的窗口以决定这个窗口更新是否丢弃。

计算坚持定时器使用了TCP指数退避策略。TCP从不放弃发送窗口探查,这些探查每隔60s发送一次。

主要作用:防止窗口更新造成的死锁现象。

保活定时器

出现:TCP的保活定时器 教材P251-255

一个比较让人惊讶的事实是:可以没有任何数据通过一个空闲的TCP连接,如果TCP连接的双方都没有向对方发送数据,那么在两个TCP模块之间不交换任何信息。
两个应用进程 -客户进程 和 服务器进程 都没有使用应用级的定时器来检测 非活动状态:这种非活动状态 可以导致应用程序中的任何一个 终止其活动。

许多时候,一个服务器希望知道客户主机是否 崩溃并关机,或者 崩溃又重新启动。许多实现提供的保活定时器可以提供这个能力。

优点:
(1)激活应用程序中的保活选项 通常比 编写应用程序探查报文 更简单。
(2)通过探查可以使服务器知道客户主机是否崩溃又重新启动。
(3)探查报文 比 应用程序探查报文 耗费更少的带宽。

缺点:
(1)在出现短暂错误的情况下,这可能会使一个非常好的连接释放掉。
(2)它们耗费不必要的带宽。
(3)在按分组计费的情况下,会在互联网花掉更多的钱。

主要作用:通过探查,使服务器知道另外一端的客户主机的运行状况。

具体实现参阅我之前的笔记。

2016/8/19

【TCP/IP详解 卷一:协议】TCP定时器 小结的更多相关文章

  1. 『TCP/IP详解——卷一:协议』读书笔记——10

    2013-08-22 22:57:17 3.8 ifconfig命令 这个命令在Linux系统下可以通过下面的指令阅读说明文档: ifconfig 由于书中作者用的系统比较早的某Unix系统,所以我的 ...

  2. 『TCP/IP详解——卷一:协议』读书笔记——01

    从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...

  3. 【TCP/IP详解 卷一:协议】第二章:链路层

    2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...

  4. TCP/IP详解 卷一(第一章 概述)

    很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议族允许它们相互进行通信. 1.分层 TCP/IP不是一个协议,而是一个协议族,通常它被认为是一个四层的协议系统,下面展 ...

  5. 【TCP/IP详解 卷一:协议】第二十二章 TCP的坚持定时器

    这两章来到了TCP的定时器部分,在 TCP的超时与重传 和 TCP的三握四挥 我们介绍了 TCP的重传定时器 和 TCP的2MSL定时器. 本随笔介绍 防止返回ACK丢失的死锁情况 的 坚持定时器 和 ...

  6. 【TCP/IP详解 卷一:协议】TCP的小结

    前言:TCP学习的综述 在学习TCP/IP协议的大头:TCP协议 的过程中,遇到了很多机制和知识点,详解中更是用了足足8章的内容介绍它. TCP协议作为 应用层 和 网络层 中间的 传输层协议,既要为 ...

  7. 【TCP/IP详解 卷一:协议】第十一章 UDP 用户数据报协议

    11.1 引言 UDP 是一个简单的 面向数据报 的运输层协议:进程的每个 输出操作 都正好产生一个 UDP数据报,并且组装成一份待发送的IP数据报. 这与 TCP 不一样,它是 面向流字符 的协议, ...

  8. 【TCP/IP详解 卷一:协议】第六章:DHCP 和自动配置

    简介 为了使用 TCP/IP 协议族,每台主机or路由器都需要一定的配置信息: IP地址 子网掩码 广播地址 路由或转发表 DNS 协议配置方法: 手动 通过使用网络服务来获得 使用一些算法来自动确定 ...

  9. 『TCP/IP详解——卷一:协议』读书笔记——13

    2013-08-24 16:03:39 4.6 ARP代理 ARP代理(Proxy ARP):如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求.这样可 ...

随机推荐

  1. python center() 函数

    center Python center() 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串.默认填充字符为空格. 语法 center()方法语法: str.center(widt ...

  2. iOS入门怎样选择Swift和objective-c

    版权声明:本文为博主原创文章,未经博主同意不得转载.博主微信:lofocus https://blog.csdn.net/cuibo1123/article/details/28261795 学oc吧 ...

  3. VUX

    1.mapState 2.mapGetters 3. 4. 当你的操作行为中含有异步操作,比如向后台发送请求获取数据,就需要使用action的dispatch去完成.其他使用commit即可. 举个例 ...

  4. vue-页面回退

    <template> <div> <button @click="goback">我是Home01</button> </di ...

  5. 使用PHP创建一个REST API(译)

    最近API在网络领域有些风靡,明确的说是REST的影响力.这实在没什么好惊讶的,因为在任何编程语言中,消费REST API都是非常的容易.构建它也非常的简单,因为本质上你不会用到任何那些已存在很久的H ...

  6. python的时间差计算

    import time start = time.clock() #当中是你的程序 elapsed = (time.clock() - start) print("Time used:&qu ...

  7. Session实例

    Session常用方法(一) session对象用来保存一些在与每个用户回话期间需要保存的数据信息,这样就方便了回话期间的一些处理程序.如可以用session变量记住用户的用户名,以后就不必在其他的网 ...

  8. C++(STL)&&树-堆结构练习——合并果子之哈夫曼树

    题目题解:http://blog.csdn.net/xu12110501127/article/details/9199335 有关博客:http://www.360doc.com/content/1 ...

  9. PAT Spell It Right [非常简单]

    1005 Spell It Right (20)(20 分) Given a non-negative integer N, your task is to compute the sum of al ...

  10. C#可扩展数组转变为String[]数组

    简单备忘: 由于需要将数据最终以逗号隔开来拼接,因而写了下面的处理方法. public void GetJoinString() { ArrayList arr = new ArrayList(); ...