關於心跳包

2022-01-28 18:53:16 字數 755 閱讀 5300

tcp連線在預設的情況下就是所謂的長連線, 也就是說連線雙方都不主動關閉連線, 這個連線就應該一直存在.

明確一點, tcp長連線本質上不需要心跳包來維持, 大家可以試一試, 讓兩台電腦連上同乙個wifi, 然後讓其中一台做伺服器, 另一台用乙個普通的沒有設定keepalivesocket連上伺服器, 只要兩台電腦別斷網, 路由器也別斷電, dhcp正常續租, 就這麼放著, 過幾個小時再用其中一台電腦通過之前建立的tcp連線給另一台發訊息, 另一台肯定能收到.

那為什麼要有心跳包呢? 其實主要是為了防止上面提到的nat超時, 既然一些nat裝置判斷是否淘汰nat對映的依據是一定時間沒有資料, 那麼客戶端就主動發乙個資料.

當然, 如果僅僅是為了防止nat超時, 可以讓伺服器來傳送心跳包給客戶端, 不過這樣做有個弊病就是, 萬一連線斷了, 伺服器就再也聯絡不上客戶端了. 所以心跳包必須由客戶端傳送, 客戶端發現連線斷了, 還可以嘗試重連伺服器.

所以心跳包的主要作用是防止nat超時, 其次是探測連線是否斷開.

鏈路斷開, 沒有寫操作的tcp連線是感知不到的, 除非這個時候傳送資料給伺服器, 造成寫超時, 否則tcp連線不會知道斷開了. 主動kill掉一方的程序, 另一方會關閉tcp連線, 是系統代程序給伺服器發的fin. tcp連線就是這樣, 只有明確的收到對方發來的關閉連線的訊息(收到rst也會關閉, 大家都懂), 或者自己意識到發生了寫超時, 否則它認為連線還存在.

心跳包和輪詢看起來類似, 都是客戶端主動聯絡伺服器, 但是區別很大.

關於心跳包的實現手法

根據心跳包的理論機制來實現 udp篇 public class udpconnected system.timers.timer timer null 設定狀態過期時間 private void waitresponse timer.enabled true timer.start public b...

關於心跳 Heartbeat

最近做了一些服務軟體冗餘的工作。其中的一點就是實現服務冗餘的切換機制,通常採用心跳來實現,我這裡採用的是應用層的自定義心跳協議。心跳協議 heartbeat protocol 是用來監控網路中的節點及確認其正常工作。監控 倆字就要求了 心跳協議的資訊必須包含 狀態描述 和 切換機制描述。在服務冗餘心...

關於心智模式

心智模式這個名詞是由蘇格蘭心理學家kenneth craik 在1940 年代創造出來的,之後就被認知心理學家johnson laird和認知科學家馬文明斯基 marvin minsky 1975 西蒙 派珀特 seymour t 所採用,並逐漸成為人機互動的常用名詞。劉瀾老師提到的四種心智模式 1...