首頁>Club>
這個心跳包除了告知服務端我線上,還有其他作用嗎?
14
回覆列表
  • 1 # 喲喲吼說科技

    心跳機制是在資料通訊連線中,定時傳送一個自定義結構的心跳報文,讓對端清楚自己還線上,保證連線的有效性。

    如題,伺服器端在設計心跳的主要目的就是為了探測對端是否還正常線上,兩端都可以傳送心跳的報文,主要透過此方式去判斷使用者側是否線上,若不線上則對伺服器端的快取資料進行清理,即主動對使用者進行下線操作。以遊戲服務端為例做舉例:

    當用戶登入某遊戲進行試玩,因為其它原因長時間掛機,沒有操作,這時伺服器端與客戶端就會互動心跳報文,證明此使用者還線上,因此會保證使用者連線狀態,但也可以設定對應時間段內若沒有任何操作進行下線處理;

    當用戶登入遊戲後,因為其它原因造成主機非正常關機,沒有根據正常的操作步驟去下線,這時就會透過心跳報文來判斷主機是否正常線上,若不線上即可直接進行下線處理。

    個人認為,應用層的心跳報文與TCP連線的Keep-alive機制在功能上是一樣的效果,但是TCP的的這種機制存在弊端(如:在TCP建立連線後啟用定時器,若沒到定時器設定的時間點發生中斷,那麼TCP不能及時將連線斷開),而應用層的心跳機制可以設定資料傳送的頻率,因此心跳報文的功能只是負責告訴對方我線上,而不需要進行其它功能的互動。

  • 2 # 汽車有關

    心跳機制主要考慮伺服器資源及時回收,要知道伺服器端併發要求是很高的,每一個TCP連結都會在伺服器端分配相應的記憶體資源,如果客戶端已經掉線,但是伺服器卻不知道,不能及時釋放資源,再進來新的連結,由於沒有足夠的記憶體資源分配,可能導致拒絕服務的問題

  • 3 # 遷徙de麻雀

    心跳主要目的是探活。應用於移動場合最核心的作用是:防止基站移除私有IP的NAT對映表條目。

    原因

    NAT(Network Address Translation)的作用你懂的,在網際網路上,只有公網IP才能路由無阻,我們的私有IP需要路由器裝置代理:有公網IP的路由器用為我們分配一個埠,用這個埠和服務端通訊;對於服務端來說,和它建立連線的並不是我們自己的機器,而是路由器。

    假如市中心有一個移動的基站,人來人往,車來車往,大家的手機進入基站區域,透過基站連線到了某些伺服器,然後短時間又離開了基站。基站NAT可用的埠有限的,最大65535(理論值)個。如果NAT對映表不清除那些短暫連入基站的條目,一旦對映表滿了,後續就無法再提供NAT服務了。

    所以,基站一般設定較短的NAT失效時間(3分鐘左右),超過這個時間,如果這個埠沒有收發資料,就會移除埠,對應的TCP連線就失效了!心跳的作用剛好就可以延長NAT條目儲存的時間。

    還有問題

    即使你使用了心跳也不能100%保證客戶端成功接收,只是說成功機率更大了而已。

    為什麼?因為我們的心跳間隔一般不會太小,否則變相DOS攻擊自己的伺服器。在心跳間隔期間,連線失效,我們的推送一樣失敗。最悲傷的情況是剛心跳完,就失效了。

    另外你要弱化連線的概念,網路中並不存在一條固定保持的鏈路,只是雙方主機各自為連線保持了一個埠而已。真實網路中,這個資料能不能真正路由到對方,雙方只有在收發資料的時候才能確認。所以,我們面向網際網路的伺服器,有很多的半連線存在(我們的服務認為對方還線上)!這個也是心跳存在的最大理由。而基站nat是面向移動端的最常見的問題!所以面向移動應用保持長連結,我們的心跳時間會略小於基站NAT失效時間!

    心跳對資源的消耗比較大,移動端要注意為使用者省流量,省電,探活也不能太坑使用者。

  • 4 # IT老記者

    心跳

    很多應用層協議都有HeartBeat機制,通常是客戶端每隔一小段時間向伺服器傳送一個數據包,通知伺服器自己仍然線上,並傳輸一些可能必要的資料。使用心跳包的典型協議是IM,比如QQ/MSN/飛信等協議。

    心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴伺服器,這個客戶端還活著。事實上這是為了保持長連線,至於這個包的內容,是沒有什麼特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。

    在TCP的機制裡面,本身是存在有心跳包的機制的,也就是TCP的選項:SO_KEEPALIVE。系統預設是設定的2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火牆這些斷線。而且邏輯層處理斷線可能也不是那麼好處理。一般,如果只是用於保活還是可以的。

    心跳包一般來說都是在邏輯層傳送空的echo包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然後客戶端反饋一個同樣的空包回來,伺服器如果在一定時間內收不到客戶端傳送過來的反饋包,那就只有認定說掉線了。

    其實,要判定掉線,只需要send或者recv一下,如果結果為零,則為掉線。但是,在長連線下,有可能很長一段時間都沒有資料往來。理論上說,這個連線是一直保持連線的,但是實際情況中,如果中間節點出現什麼故障是難以知道的。更要命的是,有的節點(防火牆)會自動把一定時間之內沒有資料互動的連線給斷掉。在這個時候,就需要我們的心跳包了,用於維持長連線,保活。

    在獲知了斷線之後,伺服器邏輯可能需要做一些事情,比如斷線後的資料清理呀,重新連線呀……當然,這個自然是要由邏輯層根據需求去做了。

    總的來說,心跳包主要也就是用於長連線的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。

  • 中秋節和大豐收的關聯?
  • 常見的四種消費心理有哪些例子?