回來之後我查詢資料後發現,android的推送在後台維持的服務都會傳送心跳包來維持長連線,當一台智慧型手機連上流動網路的時候,其實並沒有鏈結上internet,運營商分配給手機的ip其實只是乙個內網的ip,手機端要連上internet必須要通過運營商的閘道器進行ip轉換,這個閘道器稱為nat(network address translation) ,簡單來說手機鏈結internt 就是鏈結移動運營商的內網ip 埠,外網相互對映
ggsn(gateway gprs support note ) 模組就實現了nat功能,由於大部分流動網路運營商為了減少閘道器nat對映表的負荷,當乙個鏈路有一段時間沒有通訊時,就會刪除對應表,造成鏈路中斷,正事這種可以縮短空閒連線的釋放超時,原本是想節省通道的資源,沒想到讓網際網路的應用,不得不以遠高於正常頻率傳送心跳,來維護推送的長連線,例如移動2.5g網路,大約五分鐘的基帶空閒,連線就會被釋放掉
由於流動網路的特點,長連線的心跳週期並不能設定的太長,否則長連線會被釋放掉,造成客戶端頻繁的重連與登入,同時也不能設定的太短,太短會加重伺服器的負擔。
內網機器如果不主動向外發起連線,外網機沒法直接連內網,這也是內網機安全的原因之一,又因為路由器會把內網發起的連線記錄起來,但是過一段時間可能會記錄丟失,所以客戶端每隔一段時間都會向伺服器傳送訊息,以保證伺服器隨時可以找到你,這個東西稱為心跳包
理論上來說,每乙個連線都會保持連線的,但實際情況是,如果中間節點出現故障是難以知道的 ,更要命的是有的節點(防火牆)會自動把一定時間內沒有資料互動的連線給斷掉,在這個時候就需要我們的心跳包來維持一直跟伺服器有資料互動,在獲知斷線以後,伺服器邏輯可能需要做一些事情,比如斷線之後的資料清理與重新連線,總之心跳是用來維持長連線的保活與斷線處理。
如果不主動關閉socket的話,系統是不會自動關閉的,除非當前的程序已經掛掉了,作業系統把占用的socket**了才會關閉,為什麼需要心跳包來判斷當前連線是否有效可被使用的。在實際操作中,假設一段時間沒有資料傳輸,理論上長連線應該是存活的,但是網路複雜中途出現的問題也會比較常見,譬如網線被掐斷,物件程序被殺掉,頻繁丟包,對方這時候的tcp長連線是不可使用的,,但是對於應用層並不知道。如果需要知道當前的網路狀況則需要很複雜的超時進行了解,tcp底層就實現了這樣的功能,心跳機制是tcp在一段時間間隔後傳送確定連線是否存在,如果確定存在的話,就會回傳乙個包來確定連線是存在的,如果沒有返回包的話,則應該通知上層,網路出現了問題,需要進行連線失敗的操作了
所以,即便客戶端是採用死迴圈的方式連線到伺服器,對於特定的服務端與客戶端來說也需要一定時間間隔的心跳,告訴伺服器我還活著,雖然我沒幹活,也沒說話,但是別把我給關了。
關於socket長連線的心跳包
出於最近對im研究的興趣,看到smack裡有個30s傳送乙個空訊息的執行緒,了解了下關於心跳包,keepalive的知識。tcp的socket本身就是長連線的,那麼為什麼還要心跳包呢?搜尋到的資料解釋如下 一 內網機器如果不主動向外發起連線,外網機沒法直連內網的,這也是內網機安全的原因之一吧,又因為...
長連線(輪詢,心跳,socket)
概念 表示客戶端和伺服器端保持聯絡,客戶端向伺服器端一直獲取資料,或者是伺服器端一直向客戶端推送資料。基本的長連線方式 輪詢表示客服端利用定時器原理 setinterval 間隔時間內向伺服器請求最新資料。心跳原理跟輪詢類似,但是心跳在一段時間內沒有向到伺服器請求,就會認為客戶端狀態異常。socke...
長連線 心跳保活機制
而在實現長連線方式時,存在很多效能問題,如 長連線保活 今天,我將 手把手教大家實現自適應的心跳保活機制,從而能高效維持長連線 確保實時性 避免短時間內重複連線所造成的通道資源 網路資源的浪費 可是,長連線會存在斷開的情況,而 斷開原因 主要是 長連線所在程序被殺死 nat超時 網路狀態發生變化 其...