赞
踩
作者:货拉拉技术 链接:https://juejin.cn/post/7194627379656917047
网络能力是互联网App的基本能力,一个app只有联网才具有生命力。为了提升货拉拉移动端的网络请求速度、安全性,节省流量,成立了网络专项,对货拉拉的移动端从业务层、协议层、SDK等多个技术层面进行了全方位优化。经过一年多的改造,货拉拉的多个客户端网络速度提升明显,优化前后耗时如下表格所示:
客户端 | 优化前耗时 | 优化后耗时 | 耗时下降幅度 |
---|---|---|---|
![]() | 970ms | 918.2ms | 5.3% |
![]() | 930ms | 541.7ms | 43% |
![]() | 1300ms | 872ms | 32.9% |
![]() | 925ms | 503.5ms | 45.6% |
除了网络速度,货拉拉移动端在网络成功率、安全性和流量方面也有优化,本文将分享货拉拉最近一年移动端网络优化的方法和经验,主要采取升级网络协议的方法。
国外大厂谷歌在网络方面具有深厚的技术积累,提出了很多优化方案,总结如下:
数据压缩 | 文本压缩算法brotli,图片压缩webp,视频格式VP9,增量升级courgette,二进制编码proto buffer和flat buffer |
---|---|
应用层 | 提出SPDY协议(HTTP2前身),QUIC(已标准化为HTTP3) |
传输层 | 提出TCP fast open,BBR拥塞算法 |
物理层 | 建设海底光缆,自建CDN |
谷歌将很多最新的网络技术应用于chrome,chrome成为了Android和windows平台最流行的浏览器,chrome浏览器的网络库cronet也被很多App使用,作为默认网络库。
国内互联网大厂也有很多移动端网络优化方案,收集的部分方案如下:
DNS优化 | TCP连接优化 | QUIC | TLS1.3 | 高压缩率图片格式 | brotli压缩 | |
---|---|---|---|---|---|---|
百度 | HTTPDNS | 基于cronet,使用了预连接、备用连接、复合连接技术 | cronet | 基于TLS1.3的百度安全协议bdtls | ||
腾讯 | HTTPDNS | 微信app、QQ音乐使用cronet | 基于TLS1.3的微信安全协议 mmtls | 腾讯云CDN支持 | ||
阿里 | HTTPDNS | 1.开源XQUIC2.向IETF提交MPQUIC草案 | 淘宝域名main.m.taobao.com使用 | ****HEIF格式(相关域名heic.alicdn.com) | 阿里云CDN支持 | |
字节 | HTTPDNS | 抖音、飞书使用cronet | 抖音域名api5-normal-c-hl.amemv.com使用 | 抖音域名api5-normal-c-hl.amemv.com使用 | ||
美团 | 1.HTTPDNS2.多域名合并+IP直接 | 自建长连接通道,客户端的HTTP请求转换为TCP通道上的二进制数据 | 自研QUIC库MQUIC | mrn-backup.meituan.net、img.meituan.net等域名使用 | img.meituan.net等域名使用webp格式 |
在做移动端网络优化之前,首先要建立网络指标监控,主要围绕下面四个目标进行监控指标建设:
1)稳定性。主要通过网络请求成功率指标衡量,同时结合网络错误码一起分析。
2)速度。目前货拉拉除了有HTTP请求速度监控,还有DNS解析时长、TLS建连时长、TCP建立时长、TCP连接复用率指标。
3)安全性。主要统计每天发生劫持和破解的数量,以及DNS或者服务器故障时,自动降级和故障恢复时间。
4)流量。主要通过移动端的流量监控和服务端的每日流入和流出带宽监控每日流量。
此外为了方便分析网络问题,货拉拉还上报了所有网络请求的IP地址类型、网络类型等数据,未来还会增加信道的时延、带宽、丢包率等指标数据。
移动端网络优化包含业务层、TCP/IP协议层、物理层多个维度的优化。物理层优化成本非常高,周期很长,比如5G和WIFI6部署,卫星通信、海底光缆、CDN节点建设,只有少数公司有实力进行。本文重点讲解TCP/IP层的优化方案和实践,同时介绍业务层的优化方法。
HTTP2相对HTTP1.1引入了多路复用功能,即客户端与服务器之间也只需要一个连接,就可以发送和接受多路数据,通过二进制分帧的方式区分,所以传输速度更快。此外HTTP2引入了头部压缩功能,更省流量。最后HTTP2还支持 server push功能,服务器可以对一个客户端请求发送多个响应,服务器向客户端推送资源无需客户端明确地请求。
目前所有的移动端和服务端都支持HTTP2,货拉拉于2021年11月对所有核心域名进行了HTTP2升级。升级后收益非常明显。
1)流量减少。部分域名开启HTTP2后,流量节省了一半。
2)网络速度提升。从下图可看出,开启HTTP2后,网络请求的平均耗时有所下降。
传统的运营商 Local DNS 安全性差,容易劫持,当出现DNS故障时,会导致用户无法访问网络,影响App使用。2022年10月31日,货拉拉部分域名出现抖动,北京,宁波两个城市有一个域名解析时间超过10s 。
为了解决local DNS的弊端,货拉拉采用腾讯云提供的HTTPDNS服务,基于谷歌开源网络库cronet实现了HTTPDNS SDK,并在多个业务方接入和使用。
接入后HTTPDNS SDK后,收益非常明显:
1)安全和可靠性提升
可以避免local DNS劫持和故障导致的解析失败问题。出现故障时,生效时间快。DNS生效时间可从15分钟缩短到 1分钟内。
2)网络速度提升
关闭 HTTPDNS | 1.30s |
---|---|
开启 HTTPDNS | 1.18s |
耗时优化 | 9.23% |
1)背景
HTTP的gzip压缩可节省网络流量,提升网络速度,但gzip压缩率还不够高,通过调研,有大量算法压缩率都比gzip高。
压缩率 | 速度 | 兼容性 | 应用现状 | |
---|---|---|---|---|
gzip | 高 | 快 | 全部兼容,HTTP标准压缩算法 | 广泛使用 |
Pigz(gzip并行实现) | 和gzip一致 | 比gzip块 | 需引入三方SDK | |
brotli | >gzip | 比gzip慢 | HTTP标准压缩算法nginx:支持iOS:>=11 支持Andoid:部分webview支持cronet:支持 | 谷歌,阿里云CND,又拍云,爱奇艺 |
zstd | >gzip | 比brotli快,比gzip慢 | IETF标准化进行中,短期内需引入三方SDK | facebook,linux内核 |
pzstd(zstd并行实现) | 和zstd一致 | 块 | 需引入三方SDK | |
lzma | >gzip | 比gzip慢 | 需引入三方SDK | 7z文件格式 |
综合压缩率和实现成本,brotli压缩算法落地成本最低,且业界字节app已有多个域名使用brotli算法。
2)brotli支持现状
终端类型 | 网络库 | 浏览器内核 |
---|---|---|
iOS | NSURLSession:支持 | WKWebview:支持 |
Android | OKHTTP:不支持 | Webview:部分支持 |
跨平台 | cronet:支持 |
目前货拉拉用户端,企业端,司机端均已接入了基于cronet二次开发的统一网络库,全面支持brotli压缩算法,解决了Android端的OKHTTP不支持brotli压缩算法的问题。
服务端通知开启gzip和brotli压缩算法支持。客户端通过请求头和服务端协商压缩算法:"Accept-Encoding":@"gzip, deflate, br"。如果客户端支持brotli压缩算法,优先选用brotli算法,不支持时降级使用gzip。
3)级别选择
brotli有11个级别, 在服务端进行压测结果如下:
中间压缩级别 | 最高压缩级别 | ||||
---|---|---|---|---|---|
压缩前body大小(Byte) | nginx进程占用 | gzip 6 | Brotli 7 | gzip 9 | Brotli 11 |
87,714 | CPU | 22.9% | 24% | 31% | 98% |
内存 | 1.3% | 1.3% | 0.3% | 0.8% | |
448,332 | CPU | 30%~26% | 33%~ 29% | 28%~26% | 98%~96% |
内存 | 1.3% | 17.8% | 1% | 17.7% |
通过测试发现选用中间级别7级别比较合适,brotli相对gzip消耗的CPU和内存资源更多,但在可接受范围内。
4)上线效果
目前已在货拉拉企业端的部分域名开启了brotli压缩算法,选用的级别为7,比之前的gzip(压缩级别为6)节省约10%流量,未来会继续扩大使用范围。
1)背景
HTTP3被称为基于QUIC的HTTP协议。QUIC 全称 quick UDP internet connection,即“快速 UDP 互联网连接”(和英文 quick 谐音,简称“快”),是由 google 提出的使用 UDP 进行多路并发传输的协议,是HTTP3的标准传输层协议。近几年随着QUIC协议在IETF的标准化发展,越来越多的国内外大厂开始在生产环境对QUIC进行落地,以此提升某些业务场景下的网络性能。
2022年6月6日,IETF QUIC(Internet Engineering Task Force,互联网工程任务组,简称 IETF)、比利时的 HTTP 工作组成员 Robin Mark 在 Twitter 上宣布“历时 5 年,HTTP/3 终于被标准化为 RFC 9114。将与 RFC 9204(QPACK header 压缩)和 RFC 9218 (可扩展的优先级)一起开启 Web 的新篇章!”,这意味着该协议已经进入了稳定的状态,而 HTTP/3 是 HTTP 超文本传输协议的第三个主要版本。
2)HTTP3应用现状
从app store下载部分国内外流行app,通过wireshark分析QUIC使用现状如下:
iOS客户端 | 部分域名 | 版本 | 客户端实现 | |
---|---|---|---|---|
国内 | 淘宝 | trade-acs.m.taobao.com | H3-draft29 | 自研XQUIC,已开源 |
微信 | marscdn.weixin.qq.comres.servicewechat.com | GQUIC Q43 | cronet精简版本tnet | |
QQ音乐 | us.l.qq.comtmead.quic.y.qq.com | GQUIC Q43 | ||
抖音 | api5-normal-c-hl.amemv.comapi5-core-c-hl.amemv.comwebcast5-core-c-lf.amemv.com | GQUIC Q43 | cronet | |
飞书 | api100-eeft-docs-quic-hl.feishu.cnapi100-eeft-approval-quic-hl.feishu.cnapi100-eeft-gateway-quic-hl.feishu.cn | GQUIC Q43 | cronet | |
国外 | graph.facebook.comlookaside.facebook.comcontent-hkt1-1.xx.fbcdn.netcontent-hkt1-2.xx.fbcdn.net | H3-v1 | 自研 mvfst,已开源 | |
youtube | redirector.googlevideo.comsn-i3b7kns6.googlevideo.comsn-i3belnl7.googlevideo.com | H3-v1 |
3)货拉拉方案
国内很多app使用的是Google QUIC Q43版本,只有谷歌chrome支持。货拉拉选用的QUIC版本为2021年标准化的IETF v1(RFC 9000)版本,兼容性更好,谷歌,苹果,微软,Facebook,cloudfare等公司均支持该版本。
服务端,货拉拉海外版采用的cloudfare的高防服务器,开发了专门支持QUIC的nginx分支,已支持IETF v1版本。
移动客户端目前只有iOS16全面支持QUIC,普及率不高,因此引入了谷歌cronet网络库,支持QUIC。
4)上线效果
目前HTTP3已经在货拉拉海外版(lalamove)上线,上线后取得了非常不错的收益,升级后网络请求速度大幅提升。
此外升级HTTP3后,失败率也有所降低。
1)背景
传输层安全性协议(英语:Transport Layer Security,缩写:TLS)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器-网景导航者时,推出HTTPS协议,以SSL进行加密。IETF将SSL进行标准化,1999年公布TLS 1.0,随后又公布TLS 1.1、TLS 1.2和TLS 1.3。
TLS1.3 既可用于最新的HTTP3,也可用于目前流行的HTTP2。TLS1.3相对之前的版本,有如下特点:
更安全:移除了旧协议中的不安全算法,禁用了CBC模式、RC4流加密算法、SHA1、TLS压缩算法,废弃了不具备前向安全的RSA算法。
更快:TLS1.3 首次握手1-RTT,非首次握手可实现0-RTT。而TLS1.2完整握手2-RTT,开启了 Session Resumption 或者false start功能,还需要1-RTT。TLS1.3至少比TLS1.2 减少1-RTT。
目前国内app,例如微信,抖音、淘宝,美团等app都有大量域名在使用TLS1.3。
2)改造方案
iOS端底层网络库基于系统NSURSession,iOS版本 >=12.2 才支持TLS1.3,该版本以上系统占比超96%(数据来源苹果官网,截至2022年6月)。 Android客户端大部分使用的是OKhttp,OKhttp对TLS1.3依赖操作系统支持,需要Android版本 >=10。
安卓端TLS1.3支持率低于iOS端,货拉拉基于google cronet开发了统一网络库Gnet替换OKHTTP和NSURLSession,TLS1.3支持率大大提高。对于不支持TLS1.3的少数客户端,客户端可以自动降级为TLS1.2。
服务端支持TLS1.3需要修改接入网关,目前货拉拉大部分接入网关已支持TLS1.3。
3)收益
货拉拉从TLS1.3升级TLS1.3后网络速度提升约20%。
1)项目背景
HTTPS协议使用了SSL 加密传输,但依然存在极大的安全隐患就是中间人攻击。mTLS(mutal TLS)技术是基于SSL基础上再添加一个本地证书,用来和服务端双向验证,提高中间人攻击的门槛和难度,进而提高安全性。SSLpininng即证书锁定,通过锁定证书的公钥,进一步提高安全性。
2)技术实现
目前的移动端(Android+iOS)已具备双向认证功能,需要服务端先开启mTLS功能,同时提前内置加密后的客户端证书到移动端本地,服务器和移动端请求需要双向认证后才建立通信。
本地证书文件加密解密使用c语言来实现,提高安全性, 并且对输出的so文件进行加固。
国际化上线效果
目前mTLS+SSL Pinging 功能稳定,在 LLM 对抗 LLH 等平台代理请求中发挥了作用,每日拦截 500+ 次恶意登录。
1)优化方案
TCP层的优化方案非常多,有TCP fast open,MPTCP,升级拥塞算法BBR等,这些优化方案的服务端改造成本相对高。目前货拉拉采取了替换移动端网络库为基于cronet二次开发的网络库,cronet对TCP做了大量优化,例如备用TCP连接。
2)TCP备用连接原理
当有请求来临时,连接池内无连接可用,会启动一个定时器开启备用连接,定时器的间隔时间大约是250ms,与主连接进行竞争,一般情况下网络请求采用的主TCP连接传输,如果主连接因为网络抖动或者网络状态不好,导致连接失败,那么备用连接就直接发送请求。TPC备用连接可以提高建连成功率和重连速度。
3)优化效果
HTTP耗时 | TCP建连耗时 | TCP连接复用率 | |
---|---|---|---|
NSURLSession | 660.55 | 333.67 | 96.40% |
cronet | 634.79 | 304.87 | 98.43% |
1)背景
“十四五”规划和2035年远景目标纲要强调全面推进IPv6规模部署。2021年7月,中央网信办、国家发展改革委、工业和信息化部联合印发了《关于加快推进互联网协议第六版(IPv6)规模部署和应用工作的通知》。通知指出,我国IPv6发展处于攻坚克难、跨越拐点的关键阶段,到2023年末基本建成先进自主的IPv6技术、产业、设施、应用和安全体系,形成市场驱动、协同互促的良性发展格局。
自 2020 年 4 月以来,IETF(The Internet Engineering Task Force)国际标准组织一共生成了 19 项 IPv6 相关标准。 IPv6相对IPv4,有如下优势:
地址空间大。每个设备都有IP,方便定位和追踪客户端。
更安全。具有IPSec功能,可对IP包进行加密。
速度快。包头简单、减少NAT转换,理论速度更快。
功能更强大。衍生出的SRv6技术,可实现分段路由、网络切片、确定性转发等技术。
三大运营商的骨干网设备已全部支持 IPv6,大部分云服务器均已支持IPv6,市面大部分流行App均已支持IPv6。
2)改造方案
从兼容性考虑,货拉拉采取的是双栈模式。即在接入网关层同时部署IPv6和IPv4双栈协议,然后在DNS同时登记A和AAAA地址。 移动终端默认也是双栈模式,同时支持IPv6还是IPv4。网络请求时优先IPv6,不通时自动降级IPv4,详情参考 happy eyeballs算法。zhuanlan.zhihu.com/p/109483871
为了方便分析耗时,安卓和iOS端会上报每次网络请求的IP类型。
3)改造数据
IP层属于比较底层的协议,由于IPv6比IPv4转发速度快,IPv6改造后,上层协议速度均有提升,具体表现为HTTP请求、TLS建立、TCP建连耗时均有下降。
业务 | 改造前HTTP(ms) | 改造后HTTP(ms) | 改造前TCP建连(ms) | 改造后TCP建连(ms) | 改造前TLS建连(ms) | 改造后TLS建连(ms) |
---|---|---|---|---|---|---|
用户 | 925.9 | 902.6 | 97.8 | 97.6 | 95.88 | 95.80 |
司机 | 1200 | 830 | 489.7 | 471.1 | 480.81 | 393.01 |
企业 | 989.6 | 950 | 296.6 | 272 | 129.5 | 111.63 |
专送 | 1700 | 1500 | 756 | 512 | 482 | 317 |
上线后统计的现网流量货拉拉司机端IPv6占比约65%,用户端IPv6占比约56%,IPv6与IPv4共存的情况将长期存在。
业务层主要是此外为了充分挖掘网络性能,货拉拉移动端在业务层也做了大量优化。业务层优化难度比协议改造小,方法和思路众多。
1)连接复用。为了充分利用HTTP2的多路复用特性,业务请求共享一个网络实例,当访问不同业务域名或者接口时,只要域名的IP相同,底层网络库可以自动复用一个TCP连接,充分利用HTTP2的多路复用机制,提高性能。
2)断点续传。为了利用HTTP的断点续传功能,开发了支持断点续传下载SDK,用于需要下载文件的业务,例如离线包、动态化框架资源等。
3)使用缓存。货拉拉开发了离线包SDK,提前将H5资源下载并缓存到本地,提升H5加载速度,参考文章货拉拉H5离线包原理与实践 - 掘金 (juejin.cn)。
主要采取更高压缩率的算法减少数据量,不同的场景有如下方法:
文本压缩 | 高压缩率算法:Brotli,目前在货拉拉企业端有应用。支持自定义字典压缩算法:Zstd |
---|---|
图片压缩 | JPEG压缩工具:guetzli mozjpegPng压缩工具:pngquant转成压缩更高格式:webp、heif、avif。 |
二进制编码 | Proto buffer:经典二进制编码即使,比json数据量少。目前在货拉拉的日志库Argus中有应用。Flat buffer:跟proto buffer类似,编解码速度更快。目前在货拉拉的地图模块中有应用。 |
增量压缩 | APK或者H5离线包增量升级:Bsdiff日志文件增量压缩 |
系统原生的网络库,例如OKHTTP,对网络协议不完善,例如HTTP3、brotli压缩算法均不支持,TLS1.3支持率不高,不利于网络优化项目的推进。货拉拉基于谷歌cronet二次开发的移动端统一网络库Gnet,功能强大,提供了对HTTP2、QUIC、TLS1.3、brotli压缩算法等协议支持,目前已在企业端、司机端、用户端多个业务落地和使用。
货拉拉移动端围绕TCP/IP各层协议做了大量升级,经过近一年的优化实践,货拉拉移动端网络的速度,安全性有很大提升,流量也有大幅减少。 未来货拉拉将密切关注业界现状,继续深入优化。当前移动端网络热门研究方向有:
1)多路径传输。例如华为的Link Turbo,已在华为手机中应用。阿里的MP-QUIC,已被IETF QUIC工作组接收,正在向IETF标准演进。
2)更先进的拥塞算法。参考文章BBR Congestion Control Work at Google,A Comprehensive Overview of TCP Congestion Control in 5G Networks: Research Challenges and Future Perspectives。https://link.juejin.cn/?target=https%3A%2F%2Fwww.mdpi.com%2F1424-8220%2F21%2F13%2F4510
3)压缩算法。比如facebook已提交IETF的zstd算法,基于AV1的开源免版税的图像格式AVIF。
4)基于5G网络优化,例如小米和清华大学联合发表的论文,A nationwide study on cellular reliability: measurement, analysis, and enhancements https://link.juejin.cn/?target=https%3A%2F%2Fdl.acm.org%2Fdoi%2F10.1145%2F3452296.3472908
5)IPv6+技术。例如SRv6、IFIT、IP网络切片、确定性IP网络、BIERv6等。https://support.huawei.com/enterprise/zh/doc/EDOC1100193023
货拉拉移动架构组Gnet团队,负责货拉拉用户、司机、企业、专送司机等移动客户端的整体网络优化、协议升级和统一网络库建设。
关注我获取更多知识或者投稿
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。