首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

TCP 連接探測:Keepalive 與心跳包對比

     編輯:關於C++

問題背景

TCP 連接空閒時,一方異常斷電、斷網、路由故障,另一方無法感知,除非發送數據才收到錯誤。需及時檢測失效連接並優雅清理。

兩種方案

1. TCP Keepalive (內核層)

  • 默認關閉,需手動開啟 SO_KEEPALIVE。
  • 默認參數:空閒 2 小時 (7200s)、探測間隔 75s、重試 9 次 —— 過長不實用。
  • 可通過 setsockopt + SIO_KEEPALIVE_VALS (Windows) 或 TCP_KEEPIDLE/INTVL/COUNT (Linux) 自定義參數。
// Windows 設置示例
BOOL bKeepAlive = TRUE;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));

tcp_keepalive alive_in = {0};
alive_in.keepalivetime = 5000;      // 5 秒後首次探測
alive_in.keepaliveinterval = 1000;  // 間隔 1 秒
alive_in.onoff = TRUE;
WSAIoctl(sock, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in), &alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);

2. 應用層心跳包

  • 自定義協議:定期發送小數據包 (如 "PING"),對端回 "PONG"。
  • 超過閾值未收到回應視為斷開。
  • 優點:參數完全可控、可攜帶業務狀態、穿透 NAT/防火牆更可靠。
  • 缺點:需雙方協議支持、佔用應用邏輯帶寬。

選型建議

場景推薦
純內網、簡單服務、不想改協議Keepalive
跨公網、穿透 NAT、需業務級存活確認心跳包
高可靠要求雙重保障

Keepalive 由內核處理,對 IOCP/Select 模型均能觸發可讀/錯誤事件,應用層無感知;心跳包靈活但開發成本高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved