心跳机制

news/2024/11/14 20:34:30/文章来源:https://www.cnblogs.com/LiBlog--/p/18328422

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是无连接的协议,但在一些应用中可以模拟心跳机制来确认数据包的发送和接收状态。

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

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

相关文章

JavaSE基础编程十题

学习了java上一期的知识,快来看看你能不能秒杀这些题!写在前面 昨天说了一下Java中的数据类型、运算符、选择语句、循环语句部分的基础知识,今天写的编程题就是来检验这部分的成果,来看看你能写出来几题。答案也是仅供参考,如果有更好的解法欢迎在下面留言! 题目展示 1.输…

软件测试必备 - 14个接口与自动化测试练习网站

随着互联网和移动应用的快速发展,接口和自动化测试的重要性日益凸显。越来越多的企业开始重视API测试,因为它不仅能提升开发效率,还能确保系统的稳定性和安全性。这些练习网站为测试人员提供了宝贵的资源,帮助他们掌握必要的技能,应对日益复杂的测试需求。在软件测试的世界…

.NET 高性能缓冲队列实现 BufferQueue

目录前言适用场景功能说明使用示例BufferQueue 内部设计概述Topic 的隔离Partition 的设计对并发的支持Partition 的动态扩容Segment 的回收机制Benchmark写入性能测试消费性能测试 前言 BufferQueue 是一个用 .NET 编写的高性能的缓冲队列实现,支持多线程并发操作。 项目是从…

缓存优化(缓存击穿和缓存雪崩)

缓存优化(缓存击穿和缓存雪崩) 缓存击穿和缓存雪崩 缓存击穿缓存击穿是指用户查询的数据在缓存中不存在,但是后端数据库中却存在。 这种现象一般是由于缓存中的某个键过期导致的,比如一个热点数据键,它每时每刻都在接受大量的并发访问,如果某一刻这个键突然失效了,那么就…

【专题】2024家生活智能家居趋势报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37146 近二十载间,中国消费市场见证了从产品创新到渠道创新的双重飞跃,无论是耐用消费品还是快速消费品,均在线上线下平台绽放出前所未有的丰富选择,多数行业已转型为以消费者为核心导向的买方市场格局。阅读原文,获取专题报告合集全文,…

c语言字符数组

字符数组与字符串,字符数据输出用%s表示 上面两种方式的区别:

mysql授权

mysql连接的两种方式 mysql服务端 10.0.0.51:3306 mysql -uroot -p密码 -h该账户允许登录的网段 -P实例端口第一种 基于ip:port的 网络链接形式,入口一 ,链接参数 ,-hlocahost -P3306 端口,窗口提供服务的入口windows机器,去链接 mysql服务端本质上是tcp的建立n…

DelphiJNI实际调试

1:下载 DelphiJNI:下载地址https://github.com/aleroot/DelphiJNI,版本比较老,没有找到其他,就用这个吧,如朋友有较新的pas文件,请留言下 2:下载jdk,这里下载JDK,这里使用javase-jkd18,也不知道这个版本要不要收费,这里学习用暂时不关新这个。 3:编写调用class的代…

playbook+roles安装nginx实战

基本目录结构host文件夹 用于存放主机清单文件 hosts文件 hosts文件内容如下:(仅供参考) [proxy] node2 [web] 192.168.xx.xxplaybook-all-roles.yml文件 用于指定执行哪个role的文件(命名可以自定义) 文件内容如下:(仅供参考) 因为roles文件夹下只有nginx一个文件夹,所…

2024夏中山集训第1周

【NOIP模拟一】20240729 C 注意到答案是s除以区间gcd。 裴蜀定理推广 D像这样建图,跑全源最短路。 在这张图上有 \(1\to 2\to 3\to 4\to 5\) 和 \(7\to 8\to 9\to 3\ to 10\ to 11\) 两条路径。把路径上的点看作车上的点,每个点本身看作车站。 可以发现在车(一条路径)上的点…

关于多模块开发各级目录的用途

参考苍穹外卖 项目整体结构如下各层的用途序号 名称 说明1 sky-take-out maven父工程,统一管理依赖版本,聚合其他子模块2 sky-common 子模块,存放公共类,例如:工具类、常量类、异常类等3 sky-pojo 子模块,存放实体类、VO、DTO等4 sky-server 子模块,后端服务,存放配置文…