本章介绍保活定时器。
在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器;在 TCP的超时与重传 章节中,我们介绍了 重传定时器;在上一章节中,我们介绍了 防止死锁现象的 坚持定时器。
那么在本章节,我们将介绍 争议颇多的 保活定时器。

保活定时器

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

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

但是,保活定时器并不是TCP规范中的一部分,它有如下三个缺点:

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

在连接两个端系统的网络出现临时故障的时候,保活选项会引起一个实际上很好的连接终止。比如,一个中间路由器崩溃并重新启动时,发送保活探查,那么TCP会认为客户的主机已经崩溃,但是实际上并不是这样。
保活功能主要是为应用程序提供的。服务器应用程序可能会代表客户绑定一些资源,因此希望知道客户主机什么时候关闭或者已经崩溃。

在之前的章节里面,我们介绍了 半开放连接 会引起复位,但是那是来自正在发送数据的客户端,如果客户消失了,服务器会永远等待客户的数据:保活定时器 就是试图在服务器端检测到这种半开放的连接。

具体描述

保活选项的一端 为服务器端,另外一端为客户端。一般都是服务器设置这个功能。

如果一个给定的连接在两个小时之内没有任何动作,则服务器就向客户发送一个 探查报文段,客户主机必须处于以下4个阶段之一:
(1)客户主机依然正常运行,并从服务器可达。TCP响应正常,服务器就将保活定时器复位。如果进行了交换数据,那么就在交换数据结束之后进行复位。
(2)客户主机崩溃,并且关闭 或者 正在重新启动。客户的TCP没有响应,服务器收不到对该探查的响应,在 75s 之后超时,总共发送 10个探查,每个间隔75s,如果没有收到任何一个响应,它就认为客户主机已经关闭 并且 终止这个连接。
(3)客户主机已经崩溃,并已经重新启动。服务器收到探查,但是是一个复位,使得服务器终止这个连接。
(4)客户主机正常运行,但是从服务器不可达。这与状态2相同,因为TCP不能识别状态4和状态2的区别,它所能发现的就是 没有收到探查。

在第一种情况下,服务器的进程没有感觉到保活探查的发生,TCP负责一切,这个过程对所有的应用程序都是透明的。在后面三种情况下,服务器将收到来自TCP的差错报告:比如 连接超时,连接被对方复位等等。

小结:保活定时器的优点与缺点

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

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

2016/8/20

【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器的更多相关文章

  1. TCP/IP详解 卷一(第十三章 IGMP:Internet组管理协议)

    本章将介绍用于支持主机和路由器进行多播的Internet组管理协议(IGMP) 它让一个物理网络上的所有系统知道主机当前所在的多播组.多播路由器需要这些信息以便知道多播数据报应该向那些接口转发. 跟I ...

  2. TCP/IP详解 卷1 第二十一章 TCP的超时与重传

    21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1)  ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...

  3. TCP/IP详解 卷一(第十七章 TCP:传输控制协议)

    与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...

  4. TCP/IP详解 卷一(第二章 链路层)

    在TCP/IP协议族中,链路层主要有三个目的: 1.为IP模块发送和接收IP数据报 2.为ARP模块发送ARP请求和接收ARP应答 3.为RARP请求和接收RARP应答 TCP/IP支持多种不同的链路 ...

  5. TCP/IP详解 卷一(第三章 IP:网际协议)

    IP是TCP/IP协议族中最为核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输. IP提供不可靠.无连接的数据报传送服务. 1.不可靠:就是它不能保证IP数据报能成功地到 ...

  6. TCP/IP详解 卷1 第十七章 TCP:传输控制协议

    17.2 TCP的服务 TCP提供了一种面向连接的.可靠的字节流服务.两个使用TCP的应用在彼此交换数据之前必须先建立一个TCP连接. TCP通过下列方式来提供可靠性: 1)  应用数据被分割成TCP ...

  7. TCP/IP详解 卷一(第二十章 TCP的成块数据流)

    本章将介绍TCP所使用的被称为滑动窗口协议的一种流量控制方法. 该协议允许发送方在停止并等待确认前可以连续发送多个分组,这样就可以加速数据的传输. 滑动窗口 下图用可视化的方法显示了滑动窗口协议 我们 ...

  8. TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)

    UDP是一个简单的面向数据报的运输层协议. UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地. UDP首部的个字段如下图所示

  9. TCP/IP详解 卷一(第六章 ICMP:Internet控制报文协议)

    ICMP是(Internet Control Message Protocol)Internet控制报文协议. 用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可达.路由是否可 ...

  10. TCP/IP详解 卷一(第十八章 TCP连接的建立和终止)

    建立连接 建立一个TCP连接时会发生下述情况 1.客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号. 2.服务器确认(ACK)客户的SYN,同时自己也得发送 ...

随机推荐

  1. memcached-session-manager 教程实现session共享

    1简单介绍     1.1决定用什么序列化策略.     1.2配置tomcat         1.2.1加入 memcached-session-manager jar 包到tomcat中.    ...

  2. POJ3087:Shuffle'm Up(模拟)

    http://poj.org/problem?id=3087 Description A common pastime for poker players at a poker table is to ...

  3. [LeetCode] 114. Flatten Binary Tree to Linked List_Medium tag: DFS

    Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...

  4. Django的基本开发环境配置和MTV模型

    一.MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的 ...

  5. js实现轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. zend studio9破解版

    一.下载window http://downloads.zend.com/studio-eclipse/9.0.3/ZendStudio-9.0.3.msi 下载linux64 http://down ...

  7. javascript利用jquery-1.7.1来判断是否是谷歌Chrome浏览器

    <!DOCTYPE html> <html> <head>     <meta http-equiv="Content-Type" con ...

  8. linux常用命令:ip 命令

    ip命令是Linux下较新的功能强大的网络配置工具. 1.命令格式: ip  [OPTIONS]  OBJECT  [COMMAND [ARGUMENTS]] 2.命令功能: ip命令用来显示或操纵L ...

  9. python函数里面,一个*是可变参数的元祖,两个*是可变参数的字典

    python的函数中,有时会有类似*args,**keys这样的参数,代表的是可变参数,一个*表示元祖,两个*表示字典,就是说这个函数可以接受任何类型的参数,都不会报错,有些函数为了提高可用性,会加这 ...

  10. SpringMVC中controller返回图片(转)

    本文转自:http://blog.csdn.net/u011637069/article/details/51112187 SpringMVC中controller通过返回ModelAndView然后 ...