心跳包是什么?有什么用?
心跳一般是指客户端(也可以是服务器端)向对方每隔一段时间发送一个应用层的自定义指令,以确保连接的有效性。因为是固定间隔,同时是检测存活,就像人的心跳一样,顾名思义,称为心跳包。一般是用于长连接,对消息实时性要求比较高的服务中,比如IM服务,推送服务。
长连接有什么用?
在即时通讯领域和推送服务中,对消息的实时性和可用性要求非常高,建立长连接,可以有效节省DNS解释时间,TCP/IP三次握手时间,同时为了保证连接是可用的,不至于经常发了消息对方无法收到,必须要有一种机制检测连接的有效性。TCP是一个基于连接的协议,连接是由一个状态机进行维护,当连接建立成功后,双方都处于established ,除非我们进行主动调用,否则状态一直不会变化,即使中间路由已经崩溃,网线已经被剪断。TCP有一种KeepAlive机制,TCP层在定时时间发送相应的KeepAlive探针以确保连接的可用性,默认每7200秒发送一次,超过75秒没有返回就超时,超时后重试10次,虽然可以修改默认值,但仍然无法满足要求。尤其是考虑到一种特殊情况,TCP连接存活,但是主机不处于存活状态,比如CPU负载到100%,无法响应任何请求。这时候,就需要客户端主动切断连接,主动切换到其他备用机。
移动端面临的挑战
通常,我们一个家庭里面只接入一根网线,所有设备通过路由器共用一个出口IP,路由器就是一个NAT设备,NAT设备在IP封包流过设备的时候,自动修改源和目标地址,家用路由器甚至基于NAPT修改端口号,路由器内部会维护一个NAT映射表
比如内网里面的172.1.1.2:7777 对应外网221.22.2.1:8888等。我们的手机接入的蜂窝网络后,运营商就会给我们分配一个内网IP(类似10.2.2.3),由运营商的网管维护一个NAT的映射表,确保手机能接入互联网。大部分运营商会在手机一段时间没有数据通讯的时候,会把设备从NAT表中剔除,造成了连接中断,但是对TCP连接的双方是不可感知的,服务端就无法给客户端发送消息。像中国移动和中国联通的NAT超时时间是5分钟,国际上运营商普遍都是大于28分钟。
实现方案
合理间隔
延伸阅读
- 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实现JSON转Model - HandyJSON使用讲解 2017-07-26
- 阿里移动安全 Android端恶意锁屏勒索应用分析 2017-07-26
- 集合结合数据结构来看看(二) 2017-07-26