当前位置: 首页 > news >正文

TCP连接保活机制

在TCP连接中有一个保活机制,叫做Keep-Alive,用语言描述就是如下:

在保活时间内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔(保活时间间隔),发送一个探测报文,该探测报文包含的数据非常少,如果超过保活探测次数,探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。

就如下图(画图参考了《傻傻分不清的TCP keepalive和HTTP keepalive》):
在这里插入图片描述

在操作系统里边三个变量的相关信息:

概念存放位置sysctl变量
保活时间/proc/sys/net/ipv4/tcp_keepalive_timenet.ipv4.tcp_keepalive_time
保活间隔/proc/sys/net/ipv4/tcp_keepalive_intvlnet.ipv4.tcp_keepalive_intvl
保活探测次数/proc/sys/net/ipv4/tcp_keepalive_probesnet.ipv4.tcp_keepalve_probes

在这里插入图片描述

开启了 TCP 保活,需要考虑以下几种情况:

第一种,对端程序是正常工作的。当 TCP 保活的探测报文发送给对端, 对端会正常响应,这样 TCP 保活时间会被重置,等待下一个 TCP 保活时间的到来。
第二种,对端程序崩溃并重启。当 TCP 保活的探测报文发送给对端后,对端是可以响应的,但由于没有该连接的有效信息,会产生一个 RST 报文,这样很快就会发现 TCP 连接已经被重置。
第三种,是对端程序崩溃,或对端由于其他原因导致报文不可达。当 TCP 保活的探测报文发送给对端后,石沉大海,没有响应,连续几次,达到保活探测次数后,TCP 会报告该 TCP 连接已经死亡。

TCP保活机制默认是关闭的,当我们选择打开时,可以分别在连接的两个方向上开启,也可以单独在一个方向上开启。如果开启服务器端到客户端的检测,就可以在客户端非正常断连的情况下清除在服务器端保留的“脏数据”;而开启客户端到服务器端的检测,就可以在服务器无响应的情况下,重新发起连接。

如果使用 TCP 自身的 keep-Alive 机制,在Linux系统中,最少需要经过 2 小时 11 分 15 秒才可以发现一个“死亡”连接。这个时间是怎么计算出来的呢?其实是通过 2 小时,加上 75 秒乘以 9 的总和。实际上,对很多对时延要求敏感的系统中,这个时间间隔是不可接受的。

相关文章:

  • 串口通信(11)-CRC校验介绍算法
  • 第 117 场 LeetCode 双周赛题解
  • webpack打包时使用import引入element,element地址信息不会被打包到budle中而axios就会呢?
  • Python爬取股票交易数据代码示例及可视化展示。
  • CSS 属性学习笔记(入门)
  • Mybatis-Plus条件构造器QueryWrapper
  • 2023年云计算发展趋势浅析
  • 招投标系统软件源码,招投标全流程在线化管理
  • 除了Excel中可以添加公式之外,在Word中也可以添加公式,不过都是基于表格
  • 做一个Springboot文件上传-阿里云
  • ubuntu18.04配置Java环境与安装RCS库
  • 2. 深度学习——初始化方法
  • arcgis--NoData数据处理
  • 深入理解 TCP;场景复现,掌握鲜为人知的细节
  • 7 款最好的 Android 手机数据恢复软件榜单(持续更新列表)
  • CEF与代理
  • CSS 专业技巧
  • CSS魔法堂:Absolute Positioning就这个样
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JS+CSS实现数字滚动
  • LintCode 31. partitionArray 数组划分
  • Redash本地开发环境搭建
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从0到1:PostCSS 插件开发最佳实践
  • 构建二叉树进行数值数组的去重及优化
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 聊聊flink的BlobWriter
  • 数组的操作
  • 小程序01:wepy框架整合iview webapp UI
  • 新版博客前端前瞻
  • 用mpvue开发微信小程序
  • 由插件封装引出的一丢丢思考
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​人工智能书单(数学基础篇)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (分布式缓存)Redis持久化
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (数据结构)顺序表的定义
  • (转)平衡树
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net 6.0 处理跨域的方式
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ C++ ] STL---string类的模拟实现
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BetterExplained]书写是为了更好的思考(转载)
  • [BSGS算法]纯水斐波那契数列
  • [BUG]vscode插件live server无法自动打开浏览器
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日