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

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

長連接有什么用?

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

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

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

實(shí)現(xiàn)方案

合理間隔

網(wǎng)友評論