从长链接说起

TCP是长链接的,也就是说连接建立后,及时数年没有通信连接仍然存在。这样做的好处是:免去了DNS解析的时间,连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息。但前提是连接可用。

TCP的keepalive机制

服务器为了探测对端是否还活着,于是每隔两小时发送一个keepalive报文(携带一个字节的Data)。个人觉得保活机制也就是在局域网中用用,路由器表项每个几分钟老化一次,连接早就不存在了。

保活机制的缺点

1、网关设备由于保活问题,导致其连接表满,无法新建连接(XX局网闸故障案例)或性能下降严重

2、当连接一端在发送保活探测报文时,中间网络正好由于各种异常(如链路中断、中间设备重启等)而无法将该保活探测报文正确转发至对端时,可能会导致探测的一方释放本来正常的连接,但是这种可能情况发生的概率较小,另外,一般也可以增加保活探测报文发生的次数来减小这种情况发生的概率和影响。

应用层为何还要心跳报文

为什么我们需要使用应用层心跳来做检测,而不是直接使用 TCP 的特性呢?

我们知道 TCP 是一个基于连接的协议,其连接状态是由一个状态机进行维护,连接完毕后,双方都会处于 established 状态,这之后的状态并不会主动进行变化。这意味着如果上层不进行任何调用,一直使 TCP 连接空闲,那么这个连接虽然没有任何数据,但仍是保持连接状态,一天、一星期、甚至一个月,即使在这期间中间路由崩溃重启无数次。举个现实中经常遇到的栗子:当我们 ssh 到自己的 VPS 上,然后不小心踢掉网线,此时的网络变化并不会被 TCP 检测出,当我们重新插回网线,仍旧可以正常使用 ssh,同时此时并没有发生任何 TCP 的重连。

有人会说 TCP 不是有 KeepAlive 机制么,通过这个机制来实现不就可以了吗?但是事实上,TCP KeepAlive 的机制其实并不适用于此。Keep Alive 机制开启后,TCP 层将在定时时间到后发送相应的 KeepAlive 探针以确定连接可用性。一般时间为 7200 s(详情请参见《TCP/IP详解》中第23章),失败后重试 10 次,每次超时时间 75 s。显然默认值无法满足我们的需求,而修改过设置后就可以满足了吗?答案仍旧是否定的。

因为 TCP KeepAlive 是用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。两者听起来似乎是一个意思,但实际上却大相径庭。

考虑一种情况,某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态,对客户端而言,这时的最好选择就是断线后重新连接其他服务器,而不是一直认为当前服务器是可用状态,一直向当前服务器发送些必然会失败的请求。

从上面我们可以知道,KeepAlive 并不适用于检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层心跳有着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息。从这个角度而言,应用层的心跳的确是最佳实践。

TCP的keepalive和应用层的heart的更多相关文章

  1. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

    大家好,我是小林. TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗? 这是个好问题,应该有不少人都会搞混,因为这两个东西看上去太像了,很容易误以为是同一个东西. ...

  2. TCP/IP入门(4) --应用层

    /** 本篇博客由汗青ZJF整理并发布, 转载请注明出处: http://blog.csdn.net/zjf280441589/article/category/1854365 */ TCP/IP中的 ...

  3. 理解TCP之Keepalive

    理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...

  4. 浅谈Http长连接和Keep-Alive以及Tcp的Keepalive

    原文:https://blog.csdn.net/weixin_37672169/article/details/80283935 Keep-Alive模式: 我们知道Http协议采用“请求-应答”模 ...

  5. 在Linux环境下使用TCP的keepalive机制

    Linux内置支持keepalive机制,为了使用它,你须要使能TCP/IP网络,为了可以配置内核在执行时的參数.你还须要procfs和sysctl的支持. 这个过程涉及到keepalive使用的三个 ...

  6. 【转】http的keep-alive和tcp的keepalive区别

    http://blog.csdn.net/oceanperfect/article/details/51064574 1.HTTP Keep-Alive在http早期,每个http请求都要求打开一个t ...

  7. TCP/IP笔记(八)应用层协议

    TCP/IP的应用层涵盖了OSI参考模型中第5.第6.第7层的所有功能,不仅包含了管理通信连接的会话层功能.转换数据格式的标识层功能,还包括与对端主机交互的应用层功能在内的所有功能. 利用网络的应用程 ...

  8. http的keep-alive和tcp的keepalive区别

    原文地址:http://blog.csdn.net/oceanperfect/article/details/51064574 1.HTTP Keep-Alive在http早期,每个http请求都要求 ...

  9. TCP/IP笔记 四.应用层(2)——FTP

    1. FTP(File Transfer Protocol) 文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务. FTP 的主要功能是减少或消除在不同操作系统下处理 ...

随机推荐

  1. mybatis plus foreach 的用法

    一: foreach 用于 select * from tablename where colname in (A,B,C……); 1:service 层: Set<String> tea ...

  2. 在linux下php挂接mysql.so扩展的方法

    第一步:进入php源码中的"ext/mysql"目录下命令:cd 第二步:在当前目录下运行phpize 命令:/usr/local/php524/bin/phpize phpize ...

  3. Spring Boot项目中MyBatis连接DB2和MySQL数据库返回结果中一些字符消失——debug笔记

    写这篇记录的原因是因为我之前在Spring Boot项目中通过MyBatis连接DB2返回的结果中存在一些字段, 这些字段的元素中缺少了一些符号,所以我现在通过在自己的电脑上通过MyBatis连接DB ...

  4. smoothstep(),平滑阶梯函数,平滑过渡函数【转】

    函数定义: 参考:https://en.wikipedia.org/wiki/Smoothstep  相关函数图形如下:  计算机图形中经常用到正如上图所示的:两个smooth()函数相减. 相关C+ ...

  5. centos(linux)-maven配置

    1.确认已经安装jdk 2.下载 3.解压 tar -zxvf apache-maven-xxx(tab补全文件名) 4.配置环境变量 (1)sudo vim /etc/profile (2)在最下面 ...

  6. svn clean up

    1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db3.将sqlite3.exe放到.svn的同级目录4.启动cmd执行sqlite3 .svn/wc.db " ...

  7. CodeBlocks 配置

    CodeBlocks 配置 Code::Blocks 17.12 时间:2019.6 下载网址 http://www.codeblocks.org/downloads/26 ,这里选择的是 mingw ...

  8. java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  9. idea npm vue java开发工具安装 环境配置

    感谢此链接内容作者,从前往后流程较完整详细,助我成功配置好(不知道在这之前做的一些尝试有没有影响) https://blog.csdn.net/qq_42564846/article/details/ ...

  10. (四)Spring 的 bean 管理(注解方式)

    目录 前言 使用 aop 的配置文件写法 开启注解扫描 利用注解创建对象 注解方式注入属性 配置文件和注解混合使用 前言 注解可以写在 类.方法.属性 上 : 使用 注解,需要导入 aop 包: 使用 ...