3

概述

在即时通讯领域,要求消息到达必须保证及时性。而在当前的移动互联网环境下,移动端设备面临诸多问题,尤其是因基站随着设备的移动而不断切换,会导致信号不稳定,从而造成通信质量难以保证。所以,在不稳定的网络状况下,如何实现网络健康状态的探测,及时重连来保证链路的稳定性,最终做到网络抖动情况下用户无感知,是众多技术人员面临的难题。

复杂的网络状况

1、 DNS 问题

1)由于 DNS 劫持或故障造成的服务不可用;

2)由于 DNS 调度不准确导致的性能退化。

图片描述

DNS 劫持或者故障原理

2、弱网问题

1)在电梯、山区或者偏远地区,由于某些区域基站覆盖不到,导致的网络偏弱;

2)由于其他信号干扰导致的网络偏弱。

解决方法

1、链接策略

图片描述

链接策略架构

2、HTTPS

HTTPS 即 HTTP 协议添加了一层 SSL 协议加密的处理,SSL 证书则遵守 SSL 协议,由受信任的数字证书颁发机构 CA,在验证服务器身份后颁发,签发后的证书作为公钥一般放在服务器的根目录下,便于客户端请求返回给客户端,私钥在服务器的内部中心保存,用于解密公钥。

图片描述

HTTPS 架构图

安全性:

1)使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

2) HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比HTTP 协议安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性;

3) HTTPS 是现行架构下最安全的解决方案,虽无法保证绝对安全,但它大幅增加了中间人攻击的成本,可解决网络劫持相关问题。

3、HTTPDNS

传统的 DNS 解析:

图片描述

DNS 完整的解析流程很长,首先从本地系统缓存中获取 IP 地址,若无法获取需到最近的 DNS 服务器获取,仍无法获取的情况下则需要到主域名服务器获取,每一层都有缓存,但为了域名解析的实时性,每一层缓存都有过期时间,这种 DNS 解析机制有几个缺点:

1) 缓存时间设置的长,会导致域名更新不及时,若设置的短,大量 DNS 解析请求则会影响请求速度;

2) 域名劫持,容易被中间人攻击或被运营商劫持。据统计,把域名解析到第三方 IP 地址,劫持率将高达7%;

3) DNS 解析过程不受控制,无法保证解析到最快的IP;

4) 一次请求只能解析一个域名。

使用了 HTTPDNS 后:

图片描述

1) 域名解析与请求分离,所有请求都直接用IP地址,无需 DNS 解析,App 定时请求 HTTPDNS 服务器更新IP地址即可;

2)通过签名等方式,保证 HTTPDNS 请求的安全,避免被劫持;

3)DNS 解析由自己控制,可以确保返回用户所在地就近的 IP 地址,或根据客户端测速结果使用速度最快的 IP;

4)一次请求可以解析多个域名;

5)安全、精准的解析结果:使用 HTTP 协议访问服务端,获得域名解析结果,绕过运营商的 Local DNS ,避免域名劫持;HTTPDNS 能够直接得到客户端的出口网关 IP,从而更准确地判断客户端地区和运营商,得到更精准的解析结果。

4、复合链接

复合连接,即多条连接。它解决的是为了多个 IP 地址的连接选取问题,根据当前的地域、网络状况选取速度最快、最优的 IP 地址。

我们以域名查询返回两个 IP 为例介绍其过程:

1)这两个 IP 会按照顺序尝试建立连接,如果第一个 IP 返回失败,将立即开始连接第二个 IP;

2)如果第一个 IP 率先成功返回,那么第二个 IP 将被加入连接尝试列表并停止所有尝试连接;

3)如果第一个 IP 失败,会立刻开始第二个 IP 的连接;

4)如果第一个 IP 处于 pending 状态,那么会启动一个定时器,默认延迟 2s 会发起第二个 IP 的连接,如果是多个 IP 将会递归连接。

5、智能心跳

影响TCP 长连接寿命的因素:

1) NAT 超时

大部分移动无线网络运营商都在链路一段时间后无数据通讯的情况下,会淘汰 NAT 表中的对应项,造成链路中断。NAT 超时是影响 TCP 连接寿命的一个重要因素(尤其是国内),所以客户端自动测算NAT 超时时间,来动态调整心跳间隔,是一个重要的优化点。

2)DHCP 的租期(lease time)

目前测试发现安卓系统对DHCP的处理有Bug,DHCP租期到了不会主动续约并且会继续使用过期IP,这个问题会造成TCP长连接偶然断连。

3) 网络状态变化

手机网络和WIFI网络切换、网络断开和重连等情况会造成网络状态的变化,从而导致长连接变为无效连接,需要监听响应的网络状态变化事件,重新建立长连接。

心跳策略:

应根据不同的运营商、网络状态,选择不同的心跳策略。

1)前后台区分处理

为了保证接收消息的及时性体验,当应用处于前台活跃状态时,使用固定心跳。应用进入后台(或者前台关屏)时,先用几次最小心跳维持长链接;然后进入后台自适应心跳计算。前后台区分处理目的是尽量选择用户不活跃的时间段,以减少心跳计算可能产生的消息延时收取问题以及应用频繁心跳导致的耗电问题。

2)自适应不同的网络策略

通常为了保障安全,各个办公区域配置的网络策略不尽相同。为了适应这种情况,SDK 可智能探测出心跳的时间区间,保证链接的稳定性。

3)冗余心跳

当用户点亮屏幕的时候,做一次心跳;切换到前台时,做一次心跳;联网时重建信令TCP,做一次心跳。

点击了解更多技术干货!


融云RongCloud
82 声望1.2k 粉丝

因为专注,所以专业