以下內(nèi)容整理自互聯(lián)網(wǎng),僅用于個(gè)人學(xué)習(xí)
原文http://huachao1001.github.io/article.html?6sO6QBBT
1. 心跳機(jī)制
心跳機(jī)制是定時(shí)發(fā)送一個(gè)自定義的結(jié)構(gòu)體(心跳包),讓對(duì)方知道自己還活著,以確保連接的有效性的機(jī)制。
當(dāng)一臺(tái)智能手機(jī)連上移動(dòng)網(wǎng)絡(luò)時(shí),其實(shí)并沒(méi)有真正連接上Internet,運(yùn)營(yíng)商分配給手機(jī)的IP其實(shí)是運(yùn)營(yíng)商的內(nèi)網(wǎng)IP,手機(jī)終端要連接上Internet還必須通過(guò)運(yùn)營(yíng)商的網(wǎng)關(guān)進(jìn)行IP地址的轉(zhuǎn)換,這個(gè)網(wǎng)關(guān)簡(jiǎn)稱為NAT(NetWork Address Translation),簡(jiǎn)單來(lái)說(shuō)就是手機(jī)終端連接Internet 其實(shí)就是移動(dòng)內(nèi)網(wǎng)IP,端口,外網(wǎng)IP之間相互映射。 由于大部分的移動(dòng)無(wú)線網(wǎng)絡(luò)運(yùn)營(yíng)商為了減少網(wǎng)關(guān)NAT映射表的負(fù)荷,如果一個(gè)鏈路有一段時(shí)間沒(méi)有通信時(shí)就會(huì)刪除其對(duì)應(yīng)表,造成鏈路中斷,正是這種刻意縮短空閑連接的釋放超時(shí),原本是想節(jié)省信道資源的作用,卻讓?xiě)?yīng)用不得以遠(yuǎn)高于正常頻率發(fā)送心跳來(lái)維護(hù)推送的長(zhǎng)連接。
另外,長(zhǎng)連接比較耗電。
2. android系統(tǒng)的推送和iOS的推送有什么區(qū)別
首先我們必須知道,所有的推送功能必須有一個(gè)客戶端和服務(wù)器的長(zhǎng)連接,因?yàn)橥扑褪怯煞?wù)器主動(dòng)向客戶端發(fā)送消息,如果客戶端和服務(wù)器之間不存在一個(gè)長(zhǎng)連接那么服務(wù)器是無(wú)法來(lái)主動(dòng)連接客戶端的。因而推送功能都是基于長(zhǎng)連接的基礎(chǔ)是上的。
IOS長(zhǎng)連接是由系統(tǒng)來(lái)維護(hù)的,也就是說(shuō)蘋(píng)果的IOS系統(tǒng)在系統(tǒng)級(jí)別維護(hù)了一個(gè)客戶端和蘋(píng)果服務(wù)器的長(zhǎng)鏈接,IOS上的所有應(yīng)用上的推送都是先將消息推送到蘋(píng)果的服務(wù)器然后將蘋(píng)果服務(wù)器通過(guò)這個(gè)系統(tǒng)級(jí)別的長(zhǎng)連接推送到手機(jī)終端上,這樣的的幾個(gè)好處為:
- 在手機(jī)終端始終只要維護(hù)一個(gè)長(zhǎng)連接即可,而且由于這個(gè)長(zhǎng)連接是系統(tǒng)級(jí)別的不會(huì)出現(xiàn)被殺死而無(wú)法推送的情況。
- 省電,不會(huì)出現(xiàn)每個(gè)應(yīng)用都各自維護(hù)一個(gè)自己的長(zhǎng)連接。
- 安全,只有在蘋(píng)果注冊(cè)的開(kāi)發(fā)者才能夠進(jìn)行推送,等等。
android的長(zhǎng)連接是由每個(gè)應(yīng)用各自維護(hù)的,但是google也推出了和蘋(píng)果技術(shù)架構(gòu)相似的推送框架,C2DM,云端推送功能,但是由于google的服務(wù)器不在中國(guó)境內(nèi),其他的原因你懂的。所以導(dǎo)致這個(gè)推送無(wú)法使用,android的開(kāi)發(fā)者不得不自己去維護(hù)一個(gè)長(zhǎng)鏈接,于是每個(gè)應(yīng)用如果都24小時(shí)在線,那么都得各自維護(hù)一個(gè)長(zhǎng)連接,這種電量和流量的消耗是可想而知的。雖然國(guó)內(nèi)也出現(xiàn)了各種推送平臺(tái),但是都無(wú)法達(dá)到只維護(hù)一個(gè)長(zhǎng)連接這種消耗的級(jí)別。
3. 推送的實(shí)現(xiàn)方式
- 客戶端不斷的查詢服務(wù)器,檢索新內(nèi)容,也就是所謂的pull 或者輪詢方式
- 客戶端和服務(wù)器之間維持一個(gè)TCP/IP長(zhǎng)連接,服務(wù)器向客戶端push
- 服務(wù)器有新內(nèi)容時(shí),發(fā)送一條類似短信的信令給客戶端,客戶端收到后從服務(wù)器中下載新內(nèi)容,也就是SMS的推送方式
蘋(píng)果的推送系統(tǒng)和googleC2DM推送系統(tǒng)其實(shí)都是在系統(tǒng)級(jí)別維護(hù)一個(gè)TCP/IP長(zhǎng)連接,都是基于第二種的方式進(jìn)行推送的。第三種方式由于運(yùn)營(yíng)商沒(méi)有免費(fèi)開(kāi)放這種信令導(dǎo)致了這種推送在成本上是無(wú)法接受的,雖然這種推送的方式非常的穩(wěn)定,高效和及時(shí)。
在TCP機(jī)制里面,本身是存在有心跳包機(jī)制的,也就是TCP選項(xiàng):SO_KEEPALIVE. 系統(tǒng)默認(rèn)是設(shè)置的2小時(shí)的心跳頻率。
心跳包的機(jī)制,其實(shí)就是傳統(tǒng)的長(zhǎng)連接。或許有的人知道消息推送的機(jī)制,消息推送也是一種長(zhǎng)連接 ,是將數(shù)據(jù)有服務(wù)器端推送到客戶端這邊從而改變傳統(tǒng)的“拉”的請(qǐng)求方式。下面介紹一下安卓和客戶端兩個(gè)數(shù)據(jù)請(qǐng)求的方式
- push 這個(gè)也就是有服務(wù)器推送到客戶端這邊 現(xiàn)在有第三方技術(shù) 比如極光推送。
- pull 這種方式就是客戶端向服務(wù)器發(fā)送請(qǐng)求數(shù)據(jù)(http請(qǐng)求)