心跳包是什么?有什么用?
心跳一般是指客戶(hù)端(也可以是服務(wù)器端)向?qū)Ψ矫扛粢欢螘r(shí)間發(fā)送一個(gè)應(yīng)用層的自定義指令,以確保連接的有效性。因?yàn)槭枪潭ㄩg隔,同時(shí)是檢測(cè)存活,就像人的心跳一樣,顧名思義,稱(chēng)為心跳包。一般是用于長(zhǎng)連接,對(duì)消息實(shí)時(shí)性要求比較高的服務(wù)中,比如IM服務(wù),推送服務(wù)。
長(zhǎng)連接有什么用?
在即時(shí)通訊領(lǐng)域和推送服務(wù)中,對(duì)消息的實(shí)時(shí)性和可用性要求非常高,建立長(zhǎng)連接,可以有效節(jié)省DNS解釋時(shí)間,TCP/IP三次握手時(shí)間,同時(shí)為了保證連接是可用的,不至于經(jīng)常發(fā)了消息對(duì)方無(wú)法收到,必須要有一種機(jī)制檢測(cè)連接的有效性。TCP是一個(gè)基于連接的協(xié)議,連接是由一個(gè)狀態(tài)機(jī)進(jìn)行維護(hù),當(dāng)連接建立成功后,雙方都處于established ,除非我們進(jìn)行主動(dòng)調(diào)用,否則狀態(tài)一直不會(huì)變化,即使中間路由已經(jīng)崩潰,網(wǎng)線已經(jīng)被剪斷。TCP有一種KeepAlive機(jī)制,TCP層在定時(shí)時(shí)間發(fā)送相應(yīng)的KeepAlive探針以確保連接的可用性,默認(rèn)每7200秒發(fā)送一次,超過(guò)75秒沒(méi)有返回就超時(shí),超時(shí)后重試10次,雖然可以修改默認(rèn)值,但仍然無(wú)法滿(mǎn)足要求。尤其是考慮到一種特殊情況,TCP連接存活,但是主機(jī)不處于存活狀態(tài),比如CPU負(fù)載到100%,無(wú)法響應(yīng)任何請(qǐng)求。這時(shí)候,就需要客戶(hù)端主動(dòng)切斷連接,主動(dòng)切換到其他備用機(jī)。
移動(dòng)端面臨的挑戰(zhàn)
通常,我們一個(gè)家庭里面只接入一根網(wǎng)線,所有設(shè)備通過(guò)路由器共用一個(gè)出口IP,路由器就是一個(gè)NAT設(shè)備,NAT設(shè)備在IP封包流過(guò)設(shè)備的時(shí)候,自動(dòng)修改源和目標(biāo)地址,家用路由器甚至基于NAPT修改端口號(hào),路由器內(nèi)部會(huì)維護(hù)一個(gè)NAT映射表
比如內(nèi)網(wǎng)里面的172.1.1.2:7777 對(duì)應(yīng)外網(wǎng)221.22.2.1:8888等。我們的手機(jī)接入的蜂窩網(wǎng)絡(luò)后,運(yùn)營(yíng)商就會(huì)給我們分配一個(gè)內(nèi)網(wǎng)IP(類(lèi)似10.2.2.3),由運(yùn)營(yíng)商的網(wǎng)管維護(hù)一個(gè)NAT的映射表,確保手機(jī)能接入互聯(lián)網(wǎng)。大部分運(yùn)營(yíng)商會(huì)在手機(jī)一段時(shí)間沒(méi)有數(shù)據(jù)通訊的時(shí)候,會(huì)把設(shè)備從NAT表中剔除,造成了連接中斷,但是對(duì)TCP連接的雙方是不可感知的,服務(wù)端就無(wú)法給客戶(hù)端發(fā)送消息。像中國(guó)移動(dòng)和中國(guó)聯(lián)通的NAT超時(shí)時(shí)間是5分鐘,國(guó)際上運(yùn)營(yíng)商普遍都是大于28分鐘。
實(shí)現(xiàn)方案
合理間隔
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26