• 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 的总和。实际上,对很多对时延要求敏感的系统中,这个时间间隔是不可接受的。

  • 相关阅读:
    安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法
    性能测试过程
    2020年最新版Java面试题大全(文末附参考答案)
    RestTemplate踩坑 之 ContentType 自动添加字符集
    【PyQt】PyQt入门安装和Hello World
    Java设计模式面试题和答案
    使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南
    『现学现忘』Docker基础 — 30、Docker中数据卷相关命令
    让你的Mac体验更便捷,快速启动工具Application Wizard为你助力!
    任意文件上传漏洞
  • 原文地址:https://blog.csdn.net/qq_42108074/article/details/134404725