温故知新之-TCP Keepalive机制及长短连接

[学习记录]

前言

TCP连接一旦建立,只要连接双方不主动 close ,连接就会一直保持。但建立连接的双方并不是一直都存在数据交互,所以在实际使用中会存在两种情况:一种是每次使用完,主动close,即短连接;另一种是使用完后,不主动close,即长连接。对于长连接而言,在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、等各种意外,导致TCP连接并未来得及正常close,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会造成端系统资源的消耗和浪费,为了解决这个问题,这就有了TCP Keepalive机制。

  • TCP本身并没有长短连接的区别,长短与否,完全取决于程序怎么用它
  • KeepAlive 并不是 TCP 协议的一部分,详见 TCP Keepalive
  • 短连接:每次通信时,创建 Socket;一次通信结束,调用 socket.close()
  • 长连接:每次通信完毕后,不会关闭连接,可以复用连接

TCP-KeepAlive机制

TCP长连接下,客户端和服务器若长时间无数据交互情况下,若一方出现异常情况关闭连接,抑或是连接中间路由出于某种机制断开连接,而此时另一方不知道对方状态而一直维护连接,浪费系统资源的同时,也会引起下次数据交互时出错。

为了解决此问题,引入了TCP KeepAlive机制(并非标准规范,但操作系统一旦实现,默认情况下须为关闭,可以被上层应用开启和关闭)。其基本原理是在此机制开启时,当长连接无数据交互一定时间间隔时,连接的一方会向对方发送保活探测包,如连接仍正常,对方将对此确认回应。

TCP Keepalive 协议解读

说是协议解读有点不准确,其实是 TCP Keppalive 的请求意见稿 RFC1122#TCP Keep-Alives

  1. TCP Keepalive 虽不是标准规范,但操作系统一旦实现,默认情况下须为关闭,可以被上层应用开启和关闭
  2. TCP Keepalive 必须在 没有任何数据(包括ACK包)接收之后的周期内才会被发送
  3. KeepAlive 机制开启后,在一定时间内(一般时间为 7200s,参数 tcp_keepalive_time)在链路上没有数据传送的情况下,TCP 层将发送相应的 KeepAlive 探针以确定连接可用性,探测失败后重试 10(参数 tcp_keepalive_probes)次,每次间隔时间 75s(参数 tcp_keepalive_intvl),所有探测失败后,才认为当前连接已经不可用。
  4. 不包含数据的ACK段在被TCP发送时没有可靠性保证,即一旦发送,不确保一定发送成功。系统实现不能对任何特定探针包作死连接对待
  5. 规范建议keepalive保活包不应该包含数据,但也可以包含1个无意义的字节,比如0x0。
  6. SEG.SEQ = SND.NXT-1,即TCP保活探测报文序列号将前一个TCP报文序列号减1。SND.NXT = RCV.NXT,即下一次发送正常报文序号等于ACK序列号。

TCP keepalive 如何使用

以下环境是在Mac上进行,应用程序若想使用需要设置 SO_KEEPALIVE 套接口选项 才能够生效。

查看TCP keepalive 系统内核参数配置

sysctl net.inet.tcp | grep -E "keepidle|keepintvl|keepcnt"

  1. tcp_keepalive_time,在TCP保活打开的情况下,最后一次数据交换到TCP发送第一个保活探测包的间隔,即允许的持续空闲时长,或者说每次正常发送心跳的周期,默认值为7200s(2h)。
  2. tcp_keepalive_probes 在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包次数,默认值为9(次)
  3. tcp_keepalive_intvl,在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包的发送频率,默认值为75s。

发送频率tcp_keepalive_intvl乘以发送次数tcp_keepalive_probes,就得到了从开始探测到放弃探测确定连接断开的时间;若设置,服务器在客户端连接空闲的时候,每90秒发送一次保活探测包到客户端,若没有及时收到客户端的TCP Keepalive ACK确认,将继续等待15秒*2=30秒。总之可以在90s+30s=120秒(两分钟)时间内可检测到连接失效与否。

设置TCP keepalive 系统内核参数配置

sudo sysctl -w net.inet.tcp.keepidle=300000 net.inet.tcp.keepcnt=3 net.inet.tcp.keepintvl=10000 

抓包验证

与设置的时间一致

TCP Keepalive 注意事项

KeepAlive 机制是在网络层面保证了连接的可用性,但站在应用框架层面我们认为这还不够。主要体现在三个方面:

  • KeepAlive 的开关是在应用层开启的,但是具体参数(如重试测试,重试间隔时间)的设置却是操作系统级别的,位于操作系统的 /etc/sysctl.conf 配置中,这对于应用来说不够灵活。
  • KeepAlive 的保活机制只在链路空闲的情况下才会起到作用,假如此时有数据发送,且物理链路已经不通,操作系统这边的链路状态还是 ESTABLISHED,这时会发生什么?自然会走 TCP 重传机制,要知道默认的 TCP 超时重传,指数退避算法也是一个相当长的过程。
  • KeepAlive 本身是面向网络的,并不面向于应用,当连接不可用,可能是由于应用本身的 GC 频繁,系统 load 高等情况,但网络仍然是通的,此时,应用已经失去了活性,连接应该被认为是不可用的。

KeepAlive 使用方式

推荐方式:应用层心跳 + TCP keepalive

应用层心跳 + TCP keepalive一起使用,互相作为补充,但TCP保活探测周期和应用的心跳周期要协调,以互补方可,不能够差距过大,否则将达不到设想的效果。

参考文章

  1. TCP Keepalive机制刨根问底
  2. 聊聊 TCP 长连接和心跳那些事
  3. TCP KeepAlive机制理解与实践小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/619162.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvisualVM远程连接jstatd

使用本地的jvisualvm工具远程连接jstatd。 jvisualVM远程连接jstatd一般作为临时监控使用,例如:测试环境做压力测试时需要监控内存、以及其他的指标使用情况;线上服务出现内存使用异常等。 如需要功能更全面,更规范的监控方式&a…

开源版中文和越南语贷款源码贷款平台下载 小额贷款系统 贷款源码运营版

后台 代理 前端均为vue源码,前端有中文和越南语 前端ui黄色大气,逻辑操作简单,注册可对接国际短信,可不对接 用户注册进去填写资料,后台审批,审批状态可自定义修改文字显示 源码免费下载地址抄笔记 (chaob…

Redis报错:CROSSSLOT Keys in request don‘t hash to the same slot的解决方案

最近,项目上线的时候,出现了一个Redis的报错:CROSSSLOT Keys in request dont hash to the same slot,这个在内网环境下无法复现,因为正式环境的Redis是cluster集群模式,而我们内网环境是单机模式。(后面我…

系统思考—时间滞延

“没有足够的时间是所有管理问题的一部分。”——彼得德鲁克 鱼和熊掌可以兼得,但并不能同时获得。在提出系统解决方案时,我们必须认识到并考虑到解决方案的实施通常会有必要的时间滞延。这种延迟有时比我们预想的要长得多,特别是当方案涉及…

《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法

word2vec使用语言天生具备序列这一特性训练得到词语的向量表示。而在图结构上,则存在无法序列的难题,因为图结构它不具备序列特性,就无法得到图节点的表示。deepwalk 的作者提出:可以使用在图上随机游走的方式得到一串序列&#x…

PotPlayer 图像截取

PotPlayer 图像截取 1. PotPlayer2. PotPlayer 下载2.1. PotPlayer 240305 3. 图像截取References 1. PotPlayer http://www.potplayercn.com/ PotPlayer 是 KMPlayer 原作者姜勇囍进入新公司 Daum 之后推出的,继承了 KMPlayer 所有的优点,拥有异常强大…

C语言中局部变量和全局变量是否可以重名?为什么?

可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头,救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时,倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO,这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机,以其卓越的性能和功能&#…

SPI 设备驱动编写流程:创建SPI节点以及SPI设备节点(在设备树文件中)

一. 简介 SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动。 SPI主机控制器的驱动一般是芯片半导体厂商写好了,我们要编写的是SPI设备驱动代码。 本文开始来学习SPI设备驱动的编写流程(前提是支持设备树的情况)。 二…

Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测

案例背景 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领域过来的小白来问这些神经网络怎么写,怎么搭建,给我一篇论文看看感觉很厉害的样子。我一看:普刊、单变量时间序列预测、一个…

计算机网络常问面试题

一.HTTPS是如何保证安全传输的 https通过使⽤对称加密、⾮对称加密、数字证书等⽅式来保证数据的安全传输。 客户端向服务端发送数据之前,需要先建⽴TCP连接,所以需要先建⽴TCP连接,建⽴完TCP连接后,服务端会先给客户端发送公钥…

sudo apt install ros-humble-gazebo-*显示网络不可达 Ubuntu20.04使用清华镜像本地安装/更新ros2

问题 sudo apt install ros-humble-gazebo-*显示网络不可达,这是因为sources.list中的镜像源有问题,换成清华源可以解决问题 解决 1 设置Ubuntu镜像源为清华镜像源 1.1 备份source.list文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.ba…