Skip to content

心跳技术是什么

心跳技术概述

  • 定义
  • 心跳技术(Heartbeat)是一种通过定期发送简单消息(心跳包)来检测网络连接状态或保持长连接活跃的机制。
  • 目的
  • 检测存活:确认对端是否在线。
  • 保持连接:防止超时断开。
  • 同步状态:传递轻量信息。
  • 核心点
  • 轻量、周期性的通信。

1. 心跳技术原理

(1) 基本机制

  • 过程
  • 一方(客户端或服务器)定时发送心跳包(如 PING)。
  • 另一方收到后回复(如 PONG)。
  • 发送方根据响应判断连接状态。
  • 包内容
  • 通常是小数据(如字符串、标志位),减少带宽占用。
  • 间隔
  • 自定义(如 30 秒),根据场景平衡频率和开销。

(2) 实现方式

  • 应用层
  • 自定义协议,程序手动发送和处理。
  • 协议层
  • 如 WebSocket 的 PING/PONG 帧,TCP 的 Keep-Alive。

(3) 超时处理

  • 若未收到响应(超时),认为连接断开:
  • 重连。
  • 标记对端不可用。

2. 心跳技术特点

  • 轻量
  • 数据包小,占用资源少。
  • 周期性
  • 固定或动态间隔发送。
  • 双向性
  • 可单向检测,也可双向确认。

3. 应用场景

(1) 检测存活

  • 示例
  • 客户端检测服务器是否宕机。
  • 实现
setInterval(() => {
  ws.send("PING");
}, 30000); // 每 30 秒发送
ws.onmessage = (msg) => {
  if (msg.data === "PONG") console.log("Server alive");
};

(2) 保持连接

  • 问题
  • 长连接(如 WebSocket、TCP)因空闲被防火墙或 NAT 超时断开。
  • 解决
  • 定期发送心跳,避免断连。
  • 示例
  • WebSocket 每 60 秒发 PING

(3) 状态同步

  • 示例
  • 游戏中玩家在线状态。
  • 实现
  • 心跳包携带时间戳或序列号。

4. 具体实现

(1) WebSocket 心跳

  • 协议支持
  • PING(Opcode 0x9)/ PONG(Opcode 0xA)。
  • 代码
const ws = new WebSocket("ws://example.com");
setInterval(() => ws.send("PING"), 30000);
ws.onmessage = (event) => {
  if (event.data === "PONG") console.log("Alive");
};

(2) TCP Keep-Alive

  • 操作系统支持
  • TCP 层内置,每 2 小时发探测包(可调)。
  • 配置(Linux):
sysctl -w net.ipv4.tcp_keepalive_time=7200 # 空闲时间
sysctl -w net.ipv4.tcp_keepalive_intvl=75   # 探测间隔
sysctl -w net.ipv4.tcp_keepalive_probes=9   # 探测次数

(3) 自定义心跳

  • 示例(Java):
class HeartbeatClient {
    Socket socket;
    void start() {
        new Thread(() -> {
            while (true) {
                socket.send("PING");
                Thread.sleep(30000);
            }
        }).start();
    }
}

5. 优缺点

优点

  • 简单高效,易实现。
  • 实时监控连接状态。
  • 维持长连接稳定。

缺点

  • 增加网络和服务器负载。
  • 频繁心跳耗电(移动设备)。
  • 无法完全避免瞬时断连。

6. 延伸与面试角度

  • 与超时
  • 心跳间隔 < 超时时间(如 NAT 60 秒)。
  • 优化
  • 动态调整间隔。
  • 批量心跳减少频率。
  • 实际应用
  • IM 聊天:检测用户在线。
  • IoT:设备状态监控。
  • 面试点
  • 问“原理”时,提发送和响应。
  • 问“场景”时,提 WebSocket。

总结

心跳技术通过定期发送轻量消息检测存活、保持连接或同步状态,广泛用于 WebSocket、TCP 等长连接场景。实现简单但需权衡频率。面试时,可提代码示例或画流程,展示理解深度。