首页 > 其他分享 >心跳机制

心跳机制

时间:2024-07-29 20:50:58浏览次数:9  
标签:TCP Keep 心跳 机制 连接 keepalive

1、简介

在长连接中, 客户端和服务器之间定期发送一个固定信息给服务器端, 通知对方自己还在线,以确保连接的有效性。

在服务器和客户端之间一定时间内没有数据交互时,即处于 idle 状态时,客户端或服务器会发送一个特殊的数据包(即心跳包)给对方,当接收方收到这个数据报文后,也立即发送一个特殊的数据报文,回应发送方, 这就是一个 PING-PONG 交互。 当某一端收到心跳消息后,就知道了对方仍然在线,这就确保 TCP 连接的有效性。

2、实现

两种方式实现心跳机制:

  • 使用 TCP 协议层面的 keepalive 机制
  • 在应用层上实现自定义的心跳机制

虽然在 TCP 协议层面上, 提供了 keepalive 保活机制, 但是使用它有几个缺点:

  1. 它不是 TCP 的标准协议, 并且是默认关闭的.
  2. TCP keepalive 机制依赖于操作系统的实现, 默认的 keepalive 心跳时间是 两个小时, 并且对 keepalive 的修改需要系统调用(或者修改系统配置), 灵活性不够.
  3. TCP keepalive 与 TCP 协议绑定, 因此如果需要更换为 UDP 协议时, keepalive 机制就失效了.

使用 TCP 层面的 keepalive 机制比自定义的应用层心跳机制节省流量

2.1 应用层

  • HTTP长连接中的Keep-Alive:

    原理: HTTP协议的Keep-Alive机制允许在单个TCP连接上发送和接收多个HTTP请求和响应,避免了每次请求都建立新的TCP连接。

    应用场景: 在Web服务中,通过保持TCP连接的持久性来提高网络性能,减少连接建立和断开的开销。

  • WebSocket中的Ping/Pong帧:

    原理: WebSocket通过应用层的Ping/Pong帧来实现心跳机制。客户端定期发送Ping帧到服务器,服务器接收到后回复Pong帧,以确认连接仍然有效。

    应用场景: 用于长连接场景,如实时通讯、在线游戏等,确保连接的稳定性和及时性。

2.2 传输层

  • TCP: TCP协议本身提供了一种称为keep-alive的机制,可以在连接空闲一段时间后自动发送探测报文,检测对端是否仍然在线。具体实现依赖于操作系统的TCP/IP协议栈,通常可以通过套接字选项进行配置。默认KeepAlive状态是不打开的。需要将setsockopt将SOL_SOCKET.SO_KEEPALIVE设置为1才是打开KeepAlive状态
// 设置TCP Keep-Alive参数
int optval = 1;
int keepidle = 60; // 开始首次Keep-Alive探测前的空闲时间(秒)
int keepintvl = 10; // 两次Keep-Alive探测间的时间间隔(秒)
int keepcnt = 3; // 未收到回复的Keep-Alive探测的次数

setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt));
  • UDP: 虽然UDP是无连接的协议,但在一些应用中可以模拟心跳机制来确认数据包的发送和接收状态。

标签:TCP,Keep,心跳,机制,连接,keepalive
From: https://www.cnblogs.com/LiBlog--/p/18328422

相关文章

  • 通道注意力机制(CA)
    通道注意力机制(ChannelAttention,CA)是一种广泛应用于计算机视觉中的注意力机制。它主要用于提取图像特征中不同通道之间的相关性,以帮助网络更好地聚焦于重要的特征信息。在深度学习中,卷积神经网络(CNN)通常通过堆叠多个卷积层来提取图像的高级特征表示。然而,不同的通道可能对......
  • Laravel序列化解码:深入Eloquent模型的序列化机制
    Laravel序列化解码:深入Eloquent模型的序列化机制引言Laravel作为一门优雅的PHPWeb开发框架,提供了许多便利的功能来简化开发过程。其中一个强大而易用的功能便是模型的序列化。序列化是将对象状态转换为可以存储或传输的格式的过程。在Laravel中,EloquentORM支持模型的自......
  • React 的 KeepAlive 实战指南:深度解析组件缓存机制
    Vue的Keep-Alive组件是用于缓存组件的高阶组件,可以有效地提高应用性能。它能够使组件在切换时仍能保留原有的状态信息,并且有专门的生命周期方便去做额外的处理。该组件在很多场景非常有用,比如:·tabs缓存页面·分步表单·路由缓存在Vue中,通过KeepAlive包裹内的组件......
  • Linux Kernel CFI机制简介及测试禁用
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  当我们为android移植linux的驱动程序的时候,总会遇到一些错误,这些错误有一部分就是android内核开启的安全的机制导致的。本文就会介绍一种......
  • Java基础11:包机制
    包机制1.问题发现存在这样一个问题:当定义了多个类的时候,可能会发生类名的重复问题。解决方式:在java中采用包机制处理开发者定义的类名冲突问题。就好比我们平时的用电脑,一个文件夹下不能存在同名的文件,我们要是有这样的需求,但是又不想换名字,我们就可以考虑使用新建一个文件......
  • Flink SQL 的工作机制
    前言FlinkSQL引擎的工作流总结如图所示。 从图中可以看出,一段查询SQL/使用TableAPI编写的程序(以下简称TableAPI代码)从输入到编译为可执行的JobGraph主要经历如下几个阶段:将SQL文本/TableAPI代码转化为逻辑执行计划(LogicalPlan)LogicalPlan通过优化器优......
  • Android低功耗子系统的投票机制以及触发进入系统休眠的过程
    从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了wakeupsource以及autosleep机制关于wakeupsource的介绍,请参考:WakeupSource框架设计与实现关于autosleep机制,请参考:autosleep框架设计与实现在内核中,使用wakeupsource提供投票机制,让各个系统模块投票......
  • 训练的韧性:Mojo模型中自定义训练中断与恢复机制的实现
    训练的韧性:Mojo模型中自定义训练中断与恢复机制的实现在机器学习模型的开发过程中,训练过程可能会因为多种原因(如硬件故障、电源中断等)被迫中断。Mojo模型,作为一个泛指,可以代表任何机器学习或深度学习模型。支持模型的自定义训练中断和恢复机制,可以显著提高模型训练的稳定性......
  • Java类加载器实现机制详细笔记
    1.类加载器的基本概念类加载器(ClassLoader):在Java中,类加载器负责将Java类动态加载到JVM中。它是实现动态类加载机制的核心组件,对于开发复杂应用程序(如插件系统、模块化设计等)至关重要。2.类加载过程加载(Loading):从文件系统或网络读取.class文件,创建包含类数据的Class对象......
  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10引入结合ECA和NRMS形成全新的ERMS注意力
    1. ERMS介绍     (1).整合通道和空间注意力机制:     ECA模块专注于通道间的交互,通过全局平均池化提取每个通道的全局信息,然后通过一维卷积生成每个通道的权重,最终使用Sigmoid激活函数得到通道注意力权重,从而增强重要通道的特征。然而,ECA模块没有考虑到......