当我们在手机上打开一个应用或进入一场游戏时,一次网络请求的旅程就开始了。这条路径大致可以拆解为:APP -> 系统 -> 广域网 -> 数据中心 -> 服务端。每个环节都存在影响最终体验的变数,如何优化?这里分享一些从实践中总结的思路。
应用层首先需要根据自身业务特性选择合适的网络协议,无论是标准的 TCP、UDP,还是为了特定场景而自研的私有协议。
DNS 优化:稳定与速度的基石
DNS 解析的不稳定和不安全是出了名的。针对此,业界有几个常用方案:
- HTTPDNS:绕过传统的 UDP DNS 查询,通过 HTTP/HTTPS 协议向服务商获取 IP,避免劫持和污染。
- 多域名与备份域名:为主服务准备多个域名,一个解析失败,立即尝试另一个。
- 直连 IP 兜底:在本地内置关键服务的 IP 地址列表,作为 DNS 完全失效时的最后保障。
- 预解析与缓存:在用户可能发起请求前,提前完成 DNS 解析并缓存结果,缩短实际请求时的等待时间。
这里需要注意 DNS 缓存的时效性。你是用 APP 自己管理的缓存,还是依赖手机系统自带的缓存?两者的更新策略和生效范围不同,需要根据业务场景仔细权衡。
IP 建连与传输策略
拿到 IP 后,建立连接是关键一步。
- 协议选择:对于 HTTPS,应选择更安全、握手耗时更短的 TLS 高版本协议,逐步淘汰低版本。如果采用自定义协议,无论是基于普通 Socket 封装,还是直接传输加密的二进制数据流,都需要在安全和效率间找到平衡。Web 端则更多遵循常规的 HTTP/HTTPS 体系。
- 多连接并发:这是解决串行请求导致排队等待的经典思路。通过建立连接“梯队”,让多个请求并发进行,可以显著降低整体延迟。
- 超时设置:超时时间不宜设得过长或过短。需要根据网络环境精细化配置:是在公司内网、同一个运营商网络、同一个国家内部,还是跨国访问?不同场景下的超时阈值应有所不同。
说到跨国网络,延迟是必须重点关注的指标。如果业务对时延要求极高(如实时对战游戏),通常会考虑 P2P专线 等方案。我之前处理过台湾到广东的业务,最终没有选择将数据中心放在香港,而是选在新加坡作为服务端节点,让台湾通过专线直连新加坡。这个决策背后涉及到公有云节点质量、专线供应商以及海底光缆的实时状况等多种因素,需要综合评估。
对于大型应用,架构上可能设计为异地多活。这时,APP 在不同地理位置的用户,应该连接哪个数据中心,就很有讲究了。需要综合考虑网络时延和服务端负载。例如,天津的用户,在同一个运营商网络内,连接北京的数据中心,肯定比连接广东的数据中心要快得多。这块的流量调度策略是 后端与架构 设计中的重要组成部分。
系统层与通路优化
现在不少安卓手机厂商宣传的游戏网络优化,其核心思路之一是引入代理服务器(可能是自研,也可能是与第三方如迅游等合作),实现所谓的“游戏加速”。这主要解决的是公网路径质量差、绕路多的问题,但对于手机本身信号弱(如处于地下室)的情况,帮助有限。所以,游戏厂商如果只宣传加速而忽略信号问题,是有失偏颇的。
更进一步的优化思路是 多通路并发与监控切换。例如,在支持双卡双待和双频WiFi(2.4G + 5G)的设备上,系统可以同时评估多条通路的网络质量(如时延、丢包率),然后动态选择信号更好的一条进行数据传输。如果所有通路质量都不理想,还可以采用多通路并发策略:在不同链路上发送重复的数据包,或者将数据拆分后通过不同链路发送,在接收端进行重组,以此提升在恶劣网络下的连接成功率。
对于手机厂商而言,部署全局的代理服务器进行优化可行性较高。而对于像网易、腾讯这样的大型游戏公司,它们的服务端自身也研发了多路并发、智能选路等技术,可以不走手机厂商的代理,直接实现端到端的优化。
在手机系统内部,也会对特定 APP 或游戏的关键 Socket 连接进行优化,比如给予更高的发送优先级。同时,系统协议栈本身也会对高丢包等极端场景进行专项处理和算法优化。
请求与响应数据的“瘦身”艺术
除了连接层面,数据本身也是优化的重要对象。
请求时机优化:
- 对于耗时敏感的业务,可以尝试预加载,在用户点击前就提前触发请求。
- 对于多步骤的业务流程,可以在用户完成第一个动作(如点击)后,立即发起下一步所需的网络请求,同时进行本地其他处理,实现并行。
缓存策略:对结果进行合理缓存(内存、磁盘)。很多时候,“旧数据”也比“一直在加载”的体验要好。回想一下某些手机连接WiFi时的场景:点击后界面毫无反应,等好几秒扫描完成后才突然刷新,体验很差。这本质上也是数据(此处是网络列表)没有及时缓存和展示的问题。
数据压缩与格式优化:
- 头部压缩:HTTP/2 是一个优秀案例,它采用了 HPACK 算法压缩请求头。我们还可以自定义字典,或者选用比 gzip 压缩率更高的算法(如 Zstd),进一步节约带宽。
- 正文压缩:响应体压缩已是常规操作。但在 Web 端,HTTP 请求的 Body 默认是不压缩的,这一点常常被忽略,其实稍作配置即可支持,能带来立竿见影的优化效果。
- 数据格式:采用 Protobuf 等二进制序列化格式,相比 JSON 等文本格式,能大幅减少传输体积。
- 数据拆分与增量更新:如果请求或响应的 Body 过大,可以考虑拆分成多个小请求。APP 在收到数据后,可以优先解析和渲染关键部分,快速完成界面交互,其余内容后台慢慢加载,这也是提升用户体验的有效方法。
我曾负责过一个互联网业务,APP 的请求头非常臃肿,虽然 Body 不大,但巨大的头部导致单个网络包超过了 MTU,引发了 TCP 分片,增加了延迟和丢包风险。后来我们将请求头优化到 1300 字节以内,确保协议层能一次性发送出去,问题得到了显著改善。
对于大型互联网公司而言,网络带宽成本高得吓人。这类数据“瘦身”优化,带来的带宽成本下降是实打实、可量化的业务收益。相比之下,一些纯粹的性能速度优化,还需要通过复杂的数据埋点去看日活、留存等指标,验证链条更长,也更麻烦。
这些关于 TCP/IP 传输层和协议层的优化经验,在 云栈社区 的 移动端 开发讨论中也经常被提及。网络优化是一个系统性工程,需要我们在协议、连接、数据、架构等多个层面持续思考和探索。
|