心跳包是什么?有什么用?

心跳一般是指客戶端(也可以是服務(wù)器端)向?qū)Ψ矫扛粢欢螘r間發(fā)送一個應(yīng)用層的自定義指令,以確保連接的有效性。因為是固定間隔,同時是檢測存活,就像人的心跳一樣,顧名思義,稱為心跳包。一般是用于長連接,對消息實時性要求比較高的服務(wù)中,比如IM服務(wù),推送服務(wù)。

長連接有什么用?

在即時通訊領(lǐng)域和推送服務(wù)中,對消息的實時性和可用性要求非常高,建立長連接,可以有效節(jié)省DNS解釋時間,TCP/IP三次握手時間,同時為了保證連接是可用的,不至于經(jīng)常發(fā)了消息對方無法收到,必須要有一種機制檢測連接的有效性。TCP是一個基于連接的協(xié)議,連接是由一個狀態(tài)機進行維護,當(dāng)連接建立成功后,雙方都處于established ,除非我們進行主動調(diào)用,否則狀態(tài)一直不會變化,即使中間路由已經(jīng)崩潰,網(wǎng)線已經(jīng)被剪斷。TCP有一種KeepAlive機制,TCP層在定時時間發(fā)送相應(yīng)的KeepAlive探針以確保連接的可用性,默認每7200秒發(fā)送一次,超過75秒沒有返回就超時,超時后重試10次,雖然可以修改默認值,但仍然無法滿足要求。尤其是考慮到一種特殊情況,TCP連接存活,但是主機不處于存活狀態(tài),比如CPU負載到100%,無法響應(yīng)任何請求。這時候,就需要客戶端主動切斷連接,主動切換到其他備用機。

移動端面臨的挑戰(zhàn)

通常,我們一個家庭里面只接入一根網(wǎng)線,所有設(shè)備通過路由器共用一個出口IP,路由器就是一個NAT設(shè)備,NAT設(shè)備在IP封包流過設(shè)備的時候,自動修改源和目標地址,家用路由器甚至基于NAPT修改端口號,路由器內(nèi)部會維護一個NAT映射表
比如內(nèi)網(wǎng)里面的172.1.1.2:7777 對應(yīng)外網(wǎng)221.22.2.1:8888等。我們的手機接入的蜂窩網(wǎng)絡(luò)后,運營商就會給我們分配一個內(nèi)網(wǎng)IP(類似10.2.2.3),由運營商的網(wǎng)管維護一個NAT的映射表,確保手機能接入互聯(lián)網(wǎng)。大部分運營商會在手機一段時間沒有數(shù)據(jù)通訊的時候,會把設(shè)備從NAT表中剔除,造成了連接中斷,但是對TCP連接的雙方是不可感知的,服務(wù)端就無法給客戶端發(fā)送消息。像中國移動和中國聯(lián)通的NAT超時時間是5分鐘,國際上運營商普遍都是大于28分鐘。

實現(xiàn)方案

合理間隔

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負責(zé)任的教育,學(xué)習(xí)改變命運,軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式