TCP长连接,心跳机制介绍

  • 长连接
  • 为何要长连接
  • 心跳
    • 心跳为何设置在服务器端
  • 心跳维持长连接
    • TCP keep-alive的三个参数
    • 参数的具体意义
  • 心跳的使用场景

长连接

  • TCP经过三次握手建立连接,长连接是指不管有无数据包的发送都长期保持建立的连接;
    有长连接自然也有短连接,短连接是指双方有数据发送时,就建立连接,发送几次请求后,就主动或者被动断开连接。

为何要长连接

  • 减少连接建立过程的耗时
    TCP连接建立需要三次握手,三次握手也就说需要三次交互才能建立一个连接通道,同城的机器之间的大概是ms级别的延时,影响还不大,如果是北京和上海两地机房,走专线一来一回大概需要30ms,如果使用长连接,这个优化还是十分可观的。

  • 方便实现push数据
    数据交互-推模式实现的前提是网络长连接,有了长连接,连接两端很方便的互相push数据,来进行交互。

心跳

  • 心跳是用来检测一个系统是否存活或者网络链路是否通畅的一种方式,做法是定时向被检测系统发送心跳包,被检测系统收到心跳包进行回复,收到回复说明对方存活。心跳能够给长连接提供保活功能,能够检测长连接是否正常,一旦链路死了,不可用了,能够尽快知道,然后做些其他的高可用措施,来保证系统的正常运行。

心跳为何设置在服务器端

  • 心跳包所以实现在服务器侧,是因为与客户端相比,服务器侧的寿命更长,因为服务器侧需要不间断地提供服务,而客户端可能由于用户下班而合上电脑(TCP没有来得及发送FIN关闭连接),这样的话,服务器侧就会有很多不可用的TCP连接(established),这样的连接依然会占用服务器内存资源,于是就设计这个keepalive 来检测客户端是否可用,如果几次重传keepalive ,客户端没有相应,删除连接,释放资源。需要指出的是,超时时间是指TCP连接没有任何数据、控制字传输的时间,如果有任何数据传输,会刷新定时器,重新走表。

心跳维持长连接

  • TCP的KeepAlive机制(此机制并不是TCP协议规范中的内容,由操作系统去实现)KeepAlive机制开启后,在一定时间内(一般时间为7200s,参数tcp_keepalive_time)在链路上没有数据传送的情况下,TCP层将发送相应的KeepAlive探针以确定连接可用性,探测失败后重试10(参数tcp_keepalive_probes)次,每次间隔时间75s(参数tcp_keepalive_intvl),所有探测失败后,才认为当前连接已经不可用。这些参数是机器级别,可以调整。KeepAlive的保活机制只在链路空闲的情况下才会起到作用。

应用层实现:
如果客户端已经消失而连接未断开,则会使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何动作,服务器就向客户发送一个探测报文段,根据客户端主机响应探测4个客户端状态:

  1. 客户主机依然正常运行,且服务器可达。此时客户的TCP响应正常,服务器将保活定时器复位。
  2. 客户主机已经崩溃,并且关闭或者正在重新启动。上述情况下客户端都不能响应TCP。服务端将无法收到客户端对探测的响应。服务器总共发送10个这样的探测,每个间隔75秒。若服务器没有收到任何一个响应,它就认为客户端已经关闭并终止连接。
  3. 客户端崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
  4. 客户机正常运行,但是服务器不可达。这种情况与第二种状态类似。

TCP keep-alive的三个参数

用man命令,可以查看linux的tcp的参数:

man 7 tcp

这些的默认配置值在/proc/sys/net/ipv4 目录下可以找到。
其中keep-alive相关的参数有三个:

tcp_keepalive_intvl (integer; default: 75; since Linux 2.4)The number of seconds between TCP keep-alive probes.tcp_keepalive_probes (integer; default: 9; since Linux 2.2)The  maximum  number  of  TCP  keep-alive  probes  to send before giving up and killing the connection if noresponse is obtained from the other end.tcp_keepalive_time (integer; default: 7200; since Linux 2.2)The number of seconds a connection needs to be idle before TCP begins sending out keep-alive probes.   Keep-alives  are  sent only when the SO_KEEPALIVE socket option is enabled.  The default value is 7200 seconds (2hours).  An idle connection is terminated after approximately an additional 11 minutes (9 probes an intervalof 75 seconds apart) when keep-alive is enabled.

参数的具体意义

  • TCP_KEEPIDLE :这个参数是多久没有发送数据时,开始发送Keep-Alive包的时间,也就是链路空闲时间。
  • TCP_KEEPINTVL:这个参数是指发送Keep-Alive probe后,对方多久没有回应,然后重新再发送keep alive probe的时间间隔
  • TCP_KEEPCNT:这个参数指,连续发送多少次keep alive probe,对方没有回应,认为连接已经失效的重试次数

心跳的使用场景

  • 方案一
    最简单的策略当然是客户端定时n秒发送心跳包,服务端收到心跳包后,回复客户端的心跳,如果客户端连续m秒没有收到心跳包,则主动断开连接,然后重连,将正常的业务请求暂时不发送的该台服务器上。
  • 方案二
    这样传送一些无效的数据包有点多,可以做些优化。因为心跳就是一种探测请求,业务上的正常请求除了做业务处理外,还可以用作探测的功能,比如此时有请求需要发送到服务端,这个请求就可以当作是一次心跳,服务端收到请求,处理后回复,只要服务端有回复,就表明链路还是通的,如果客户端请求比较空闲的时候,服务端一直没有数据回复,就使用心跳进行探测,这样就有效利用了正常的请求来作为心跳的功能,减少无效的数据传输。

TCP长连接,心跳机制介绍相关推荐

  1. mqtt如何发送心跳 安卓_互联网推送服务原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  2. [心跳] 互联网推送服务原理:长连接+心跳机制

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  3. 移动互联网消息推送原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  4. Android长连接心跳机制

    在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一 ...

  5. 转 互联网推送服务原理:长连接+心跳机制(MQTT协议)

    http://blog.csdn.net/zhangzeyuaaa/article/details/39028369 目录(?)[-] 无线移动网络的特点 android系统的推送和IOS的推送有什么 ...

  6. 互联网推送服务原理:长连接+心跳机制(MQTT协议)

    互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了 ...

  7. Netty(一) SpringBoot 整合长连接心跳机制

    https://github.com/crossoverJie/JCSprout 原创: crossoverJie 阅读原文 前言 Netty 是一个高性能的 NIO 网络框架,本文基于 Spring ...

  8. TCP长连接与短连接、心跳机制

    转自: 1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是 ...

  9. TCP握手机制、TCP长连接和短连接、TCP 保活机制 、心跳机制

    参考: https://www.cnblogs.com/Andya/p/7272462.html 1. TCP连接(3次握手建立连接.4次挥手关闭连接) 当网络通信时采用TCP协议时,在真正的读写操作 ...

最新文章

  1. sql server两种分页方法
  2. 查看端口被哪个进程占用
  3. python学成需要多久-小白学python怎么快速入门?多久能完成一个项目?
  4. [算法]一次商品交易利益最大化
  5. 听说GNN大有可为,从这篇开始学以致用
  6. Python__名称空间与作用域
  7. 使用java.util.zip包实现根据文件目录控制文件的压缩与解压
  8. 初接触设计模式 导航(一)
  9. 3步快速彻底卸载MySQL
  10. VM10虚拟机安装图解
  11. 15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件
  12. Sign function
  13. 商城系统建设:如何搭建自己的网上商城平台
  14. 修炼内功---数据结构与算法12---快速排序
  15. 中科蓝汛---长按3S进入语音助手功能实现
  16. 三层内网 外网打点到内网域 sec123 复现
  17. M1芯片Mac mini外接显示器的各种问题
  18. Codeforces Round #682 (Div. 2)
  19. VM15安装MacOS10.15.1系统
  20. 区块链100讲:V神·以太坊上的分片

热门文章

  1. 文件上载限制4gb_新get!百度网盘破除上传单个文件超4GB限制
  2. 空洞骑士复活歌女玛丽莎的方法(复活其他灵魂NPC同理)
  3. 使用ScriptX.cab控件
  4. CLA not signed yet
  5. find_package()快速理解
  6. WIN7 64位 配置JDK1.7的环境变量(百度上那么多坑爹货,乱搞真浪费时间)
  7. Ruby On Rails-2.0.2源代码分析(1)-Rails的启动
  8. 3 、OpenCvSharp 图片转视频
  9. PageHelper 插件踩过的坑
  10. 安全信息管理系统(OSSIM)