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

TCP 保活(KeepAlive)机制详解

文章目录

  • 一、TCP KeepAlive 初衷
  • 二、从 NAT 角度更具体地理解 TCP KeepAlive 的必要性
  • 三、TCP KeepAlive 工作原理
  • 四、TCP Keepalive 和 HTTP Keep-Alive 有什么区别?

一、TCP KeepAlive 初衷

交互双方建立 TCP 连接,但并不是一直有数据交互,有些连接在数据交互完毕后会被立即释放,有些则不会,那么在长时间无数据交互的情况下,双方都有可能发生掉电、网络异常等各种意外,当这些意外发生后,连接并未来得及被正常释放,另一方在不知道对端异常的情况下会一直维护这个连接,长时间的积累会占用过多的系统资源,尤其是服务端,为了避免资源浪费,于是就有了 TCP KeepAlive

二、从 NAT 角度更具体地理解 TCP KeepAlive 的必要性

网络基础 - NAT 篇有提到过转换表,其中,202.244.174.37:1025/1026 中的 1025/1026 是临时分配的端口

由于端口数量有限([0, 65535]),再加上维护转换表需要额外开销,因此不能无休止地向转换表中增加记录,对于过期的记录,需要将其删除

如何判断哪些是过期记录?
一段时间内无活动的连接,其对应记录就是过期的,NAT 路由器应定时检查转换表中的非活动连接,并将其丢弃,注意,这个丢弃的动作并不会告知该连接的任何一方
在这里插入图片描述
问题来了,如果一个客户端应用程序因业务需要必须与服务端维持长连接,那么该连接在长时间没有任何数据交互的情况下,NAT 路由器会将其对应记录从转换表中删除,客户端和服务端对此是毫无感知的,连接被丢弃后,服务端再也收不到客户端发送的数据包,显然客户端也收不到服务端的数据推送
在这里插入图片描述
一个具体的例子来感受下这个问题的严重性:

某财务应用,使用者需花费十几分钟甚至几十分钟在客户端填写大量的表单数据,填好后点击 “提交” 按钮

结果,这个时候由于 NAT 路由器早已将连接对应记录从转换表中删除,报文无法到达服务端,应用故障产生,这直接导致使用者所有的工作需要重新来过,给使用者带来极大的不便和损失

针对上述问题,TCP 协议这一层的解决方法就是利用 KeepAlive 维持长连接,让 NAT 路由器认为我们的连接是活动的,从而避免连接被 “干掉”

三、TCP KeepAlive 工作原理

TCP 连接建立好后,使用 KeepAlive 的一方会启动一个计时器,当这个计时器数值到达 0 之后(也就是经过tcp_keepalive_time时间后),一个 TCP 探测报文便会被发出。该报文是一个纯 ACK 报文(RFC 1122 规定,不应该包含任何数据,但也可以包含 1 个无意义的字节,比如0x0),其 Seq号是上一个报文 Seq 号减去1,所以其实探测保活报文不在窗口控制范围内。
在这里插入图片描述

四、TCP Keepalive 和 HTTP Keep-Alive 有什么区别?

  • HTTP Keep-Alive 是为了让 TCP 连接活得更久一点,以便发起多个 HTTP 请求时能复用同一个 TCP 连接,提高通信效率
  • TCP KeepAlive 是为了探测连接的对端是否存活
http://www.dtcms.com/a/272365.html

相关文章:

  • 汽车功能安全-软件集成和验证(Software Integration Verification)【验证方法用例导出方法输出物】10
  • Java入门之JDK下载和安装
  • Thrust库介绍与使用
  • 《汇编语言:基于X86处理器》第7章 整数运算(1)
  • 机器人接入AI的发展前景:从开发者视角看技术融合与生态构建
  • JavaScript中的Screen对象:你的屏幕“身份证”
  • 城市规则管理列表实现逻辑
  • 【Note】Linux Kernel 实时技术深入:详解 PREEMPT_RT 与 Xenomai
  • 【React】MQTT + useEventBus 实现MQTT长连接以及消息分发
  • 昇腾 k8s vnpu配置
  • 在Linux中,如何使用grep awk sed find?
  • 链式二叉树数据结构(递归)
  • 自动化——bat——批量复制所选的文件
  • 微服务架构的演进:迈向云原生——Java技术栈的实践之路
  • SpringBoot整合腾讯云新一代行为验证码
  • RabbitMQ 幂等性
  • Allegro PCB 手动添加元器件全流程解析
  • expect 安装入门手册
  • 【保姆级教程】基于anji-plus-captcha实现行为验证码(滑动拼图+点选文字),前后端完整代码奉上!
  • 人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)
  • 开源入侵防御系统——CrowdSec
  • Linux 服务器综合性能测试脚本(优化版)结构化分析
  • 若依框架去掉Redis
  • CORESET 0 and SIB1 Scheduling in a Nutshell
  • 论文阅读笔记:VI-Net: Boosting Category-level 6D Object Pose Estimation
  • RocketMQ安装(Windows环境)
  • 上线节点固定,项目进度紧张,如何合理压缩工期
  • NGINX系统基于PHP部署应用
  • 实验作业1+整理笔记截图
  • 实训八——路由器与交换机与网线