TCP协议中不存在轮询机制,这意味着加入启动一个客户端进程,与服务器建立连接后,然后离开几小时、几天、甚至几个月,连接依然会保持着。理论上,中间路由器可以崩溃和重启,数据线可以断开再连接,只要连接两端的主机没有被重新启动(或者更改IP地址),那么它们仍会保持连接状态。

TCP保活机制

TCP保活机制是一种在不影响数据流内容的情况下探测对方的方式。它由一个保活计时器实现,当计时器被激发,连接一端将发送一个保活探测(简称保活)报文,另一端接收报文的同时会发送一个ACK作为响应。

保活机制并不是TCP规范中的一部分,对此[RFC1122]给出三个理由:

  1. 在出现短暂的网络错误的时候,保活机制会使一个好的连接断开

  2. 保活机制会占用不必要的带宽

  3. 在按流量计费的情况下会产生更多经济开销

并且保活机制仍存在争议,许多人认为这一功能不应该在TCP协议中提供,而应在应用程序中实现;反之也有人认为大多数应用程序需要该功能,应该在TCP协议中实现。然后...现在所有主流TCP版本都实现了保活功能,只是该功能在默认情况下是关闭的,是一个可选择激活的功能。

TCP连接的任何一端都可以请求打开这一功能,且可以设置在连接的一端、两端或者两端都没有。

保活功能的操作如下:如果在一段时间(保活时间)内连接处于非活动状态,开启保活功能的一端将向对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过一个已经提前配置好的保活时间间隔后继续发送一个保活探测报文,直到发送探测报文的次数达到保活探测数,这时对方主机将被确认为不可到达,连接也将被中断。

TCP保活功能的规则过程中,开启该功能的一端会发现对方处于以下四种状态之一:

  1. 对方主机仍在工作,并且可以到达。请求端将保活计时器重置(重新设定为保活时间值)。如果在计时器超时前有应用程序通过该连接传输数据,那么计时器将再次被设定为保活时间值。

  2. 对方主机已经奔溃,包括已经关闭或者正在重新启动。请求端接收不到响应报文,并在经过保活时间间隔指定的时间后超时。超时前,请求端会持续发送探测报文,一共发送保活探测数指定次数为止,如果请求端没收到任何探测报文响应,那么它将认为对方主机已经关闭,连接也将被断开。

  3. 客户主机奔溃并且已重启。请求端会受到一个对其保活探测报文的响应,但这个响应是一个重置报文段,请求端将会断开连接。

  4. 对方主机仍在工作,但是由于某些原因不能到达请求端。这种情况与状态2相同,因为TCP不能区分状态2和状态4,结果都是没有受到探测报文的响应。

变量保活时间、保活时间间隔和保活探测数的设置是可以变更的。有些系统允许用户在每次建立连接时设置这些变量,有些系统规定只有在系统启动时才能设置。比如在linux中,这些变量分别对应net.ipv4.tcp_keepalive_time、net.ipv4.tcp_keepalive_intvl、net.ipv4.tcp_keepalive_probes,默认设置是7200秒、75秒和9次探测。

保活探测报文为一个空报文段(只包含1字节)。它的序列号等于对方主机发送的ACK报文的最大序列号减1,因为这一序列号的数据段已经被成功接收,所以不会对到达的报文段造成影响,但探测报文返回的响应可以确定连接是否仍在工作。需要注意的是,探测及其响应报文丢失时不会进行重传。

书中的三个案例:

(案例一:正常连接 -> 另一端突然奔溃,本例中将保活时间设置为7000ms/7s,保活时间间隔设置为1s,在确认连接断开之前(62.120s),客户端会发送10个间隔为1秒的保活探测报文,最后连接断开)

(案例二:另一端奔溃后重启,本例中将保活时间设置为12000ms/2min,最后是另一端重启后响应一个RST报文段,连接断开)

(案例三:另一端不可达,本例中将保活时间设置为12000ms/2min,到达保活探测数后仍未收到响应,连接断开)

参考:

《TCP IP 详解卷1:协议》

RFC官方文档

TCP/IP 笔记 - TCP保活机制的更多相关文章

  1. TCP/IP 笔记 - TCP拥塞控制

    拥塞控制是TCP通信的每一方需要执行的一系列行为,这些行为有特定算法规定,用于防止网络因为大规模的通信负载而瘫痪.其基本方法是当有理由认为网络即将进入拥塞状态(或已由于拥塞而出现路由丢包情况)时减缓T ...

  2. TCP/IP 笔记 - TCP数据流和窗口管理

    TCP流量控制机制通过动态调整窗口大小来控制发送端的操作,确保路由器/接收端消息不会溢出. 交互式TCP连接 交互式TCP连接指该连接需要在客户端和服务器之间传输用户输入信息,如按键操作.短消息.操作 ...

  3. TCP/IP 笔记 - TCP连接管理

    TCP是一种面向连接的单播协议,在发送数据之前,通信双方必须在彼此建立一条连接:这与UDP的无连接不同,UDP无需通信双方发送数据之前建立连接.所有TCP需要处理多种TCP状态时需要面对的问题,比如连 ...

  4. TCP/IP笔记——TCP特点、首部格式、滑动窗口

    这次总结一下TCP相关的知识. TCP主要特点 面向连接:在通信前必须建立连接(只是逻辑上存在,而不是物理连接) 只能有两个端点:即只能一对一通信(所以通常p2p是用UDP实现的) 提供可靠交付服务: ...

  5. TCP/IP笔记(一)网络基础知识

    计算机与网络发展 计算机自诞生伊始,经历了一系列演变与发展.大型通用机计算机.超级计算机.小型机.个人电脑.工作站.便携式电以及现如今的智能手机终端都是这一过程的产物.它们性能逐年增强,价格却逐年下降 ...

  6. TCP/IP笔记 一.综述

    1. TCP/IP分层 TCP/IP 是四层的体系结构:应用层.运输层.网际层和网络接口层,如下图: OSI协议是国际标准的网络协议,但是由于OSI的实用性等问题造成OSI没有流行起来.目前国际上广泛 ...

  7. TCP/IP、TCP、UDP、Socket知识汇总

    带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...

  8. 【TCP/IP】TCP详解笔记

    目录 前言 17. TCP 传输控制协议 17.1 引言 17.2 TCP 服务 17.3 TCP的首部 18. TCP连接的建立与终止 18.1 引言 18.2 连接的建立与终止 18.2.1 建立 ...

  9. TCP/IP笔记(二)TCP/IP简介

    上回,主要介绍了下协议和OSI参考模型,并简单了解下网络构成要素,这回该说说TCP/IP了 互联网与TCP/IP的关系   互联网进行通信时,需要相应的网络协议,TCP/IP原本就是为使用互联网而开发 ...

随机推荐

  1. spring boot 注解

    一级注解:(写在类名前面的)@RestController: 等价于在函数前面写@ResponseBody ,会直接返回要显示的内容 @ControllerString返回的是模板文件的名称. 二级注 ...

  2. 对于新版本的webstorm对vue的支持

    webstorm 对于官方vue的支持,直到2017.1,这个版本,之后的版本不能直接安装vue插件,这时候就需要自己手动新建vue模板了

  3. Finish final project

    一.项目地址:https://github.com/Joyce45/final-project 二.团队成员陈述: 于浩: 张雨: 遇到的问题:1.通过relativepanel解决了刚开始设计上使用 ...

  4. Effective C++ 笔记:条款 33 避免继承导致的名称遮掩

    Avoid hiding inherited names 作用域(scopes)所带来的名称二义性,c++编译器会寻找指涉(refer to)的对象并实现名称遮掩规则(name-hiding rule ...

  5. 绕过D盾的php一句话

    d_dun.php <?php $a = '小狗狗你好啊'; $b = '小盾盾你好啊'; foreach ($_REQUEST as $key => $value) { $$key = ...

  6. lsf运行lsload命令显示“lsload: Host does not have a software license”

    因为这个问题也是花费好长时间了,对一个小白的我来说真的挺激动的.下面说一下我的解决思路吧.不过造成这个问题也有很多种原因,需要对症下药. 我入手解决是从这个网站上看到同样的问题,然后通过一个个排除最后 ...

  7. .Net WebApi开发SharePoint出现System.IO.FileNotFoundException: 找不到位于的 Web 应用程序

    System.IO.FileNotFoundException: 找不到位于 http://xxx/sites/xxxx 的 Web 应用程序.请确认正确键入了此 URL.如果此 URL 需要提供现有 ...

  8. iBtais 多重嵌套循环

    iBatis支持集合循环, 但是如何做到双重循环, 请见下例子 例子描述: 需要去三张结构相同的表中获取信息, 需要将信息拼合去重后返回 入参数据类型: Map<String,Object> ...

  9. 解答VS2013编译报错不准确是什么原因

    1.当程序在错误时,VS2013编译报出的错误有时不会一起全部报出,而是按错误的英文首字母逐个报出的 2.如果报错的信息双击点过去查看时又发现无明显错误问题时,这个这个时候可以是VS编译的缓存问题,这 ...

  10. pyspider爬取tourism management 所有文章的标题 作者 摘要 关键词等等所有你想要的信息

    #!/usr/bin/env python # -*- encoding: utf-8 -*- # vim: set et sw=4 ts=4 sts=4 ff=unix fenc=utf8: # C ...