推送:
服務器給客戶端發(fā)送消息
開發(fā)者通過第三方推送服務提供商將信息直接下發(fā)給需要的設備,第三方推送服務提供商與設備建立一條長連接通道苛白,并且將消息路由到APP中呐赡。
推送實現(xiàn)的方式
**(1)長連接: ** 客戶端主動和服務器建立TCP長連接之后, 客戶端定期向服務器發(fā)送心跳包, 有消息的時候, 服務器直接通過這個已經(jīng)建立好的TCP連接通知客戶端退客。
(2)輪詢: 客戶端定期詢問服務器有沒有新的消息, 這樣服務器不用管客戶端的地址是什么, 客戶端來問, 直接告訴它就行.輪詢間隔太長,實時性太差链嘀;輪詢間隔太短萌狂,資源消耗大。
(3)SMS: 服務器在有新消息時給用戶的手機號發(fā)一條特殊的短信, 客戶端攔截短信后發(fā)現(xiàn)是正常短信就放行, 如果是特殊短信就連接服務器取消息怀泊。
心跳包
作用:其實主要是為了防止NAT超時茫藏。其次是探測連接是否斷開。
心跳包和輪詢的區(qū)別
心跳包和輪詢看起來類似, 都是客戶端主動聯(lián)系服務器, 但是區(qū)別很大:
(1)輪詢是為了獲取數(shù)據(jù), 而心跳是為了迸恚活TCP連接务傲。
(2)輪詢得越頻繁, 獲取數(shù)據(jù)就越及時, 心跳的頻繁與否和數(shù)據(jù)是否及時沒有直接關系
(3)輪詢比心跳能耗更高, 因為一次輪詢需要經(jīng)過TCP三次握手, 四次揮手, 單次心跳不需要建立和拆除TCP連接。
NAT耗時
國內(nèi)移動無線網(wǎng)絡運營商在鏈路上一段時間內(nèi)沒有數(shù)據(jù)通訊后, 會淘汰NAT表中的對應項, 造成鏈路中斷枣申。
心跳笔燮希活
心跳一般是指某端(絕大多數(shù)情況下是客戶端)每隔一定時間向?qū)Χ税l(fā)送自定義指令,以判斷雙方是否存活忠藤,因其按照一定間隔發(fā)送挟伙,類似于心跳,故被稱為心跳指令模孩。
TCP的KeepAlive無法?替代應用層心跳奔饫活機制的原因
(1)TCP KeepAlive 的機制其實并不適用于此。Keep Alive 機制開啟后榨咐,TCP 層將在定時時間到后發(fā)送相應的 KeepAlive 探針以確定連接可用性诺祸。一般時間為 7200 s。失敗后重試 10 次祭芦,每次超時時間 75 s筷笨。
(2) TCP KeepAlive 是用于檢測連接的死活
心跳時間間隔選擇:長連接,慢心跳龟劲。
(1)發(fā)送心跳包勢必要先喚醒設備, 然后才能發(fā)送, 如果喚醒設備過于頻繁, 或者直接導致設備無法休眠, 會大量消耗電量
(2)中移動2/3G下, NAT超時時間為5分鐘, 中國電信3G則大于28分鐘, 理想的情況下, 客戶端應當以略小于NAT超時時間的間隔來發(fā)送心跳包胃夏。
影響長連接的壽命的因素
心跳維持長連接的弊端
1、高于正常頻率發(fā)送心跳包來維持長連接昌跌,這樣無疑會帶來信令風暴
2仰禀、這類心跳包頻率很短 造成信令資源的浪費
3、造成手機電量的耗費
信令風暴:網(wǎng)絡受到終端信令的請求超過了網(wǎng)絡各項信令處理的能力蚕愤,引發(fā)擁塞甚至雪崩效應答恶,導致網(wǎng)絡不可用饺蚊,我們稱之為“信令風暴”