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