心跳技术是什么
心跳技术概述
- 定义:
- 心跳技术(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 等长连接场景。实现简单但需权衡频率。面试时,可提代码示例或画流程,展示理解深度。