背景
得物App的图片、视频等资源有反馈加载较慢、有卡顿感。
得物App的图片、视频等资源使用阿里云CDN进行下发,客户端与CDN服务器之间的请求耗时较长对用户体验产生了极大影响。
数据分析
得物App核心的CDN域名共10个,其中流量最大的域名是cdn.poizon.com,占比92%,使用场景包括图片、视频、H5资源、小文件等,涉及得物App全域。
因此,本文主要以cdn.poizon.com为主讲解CDN网络性能优化过程。
使用网络监控平台-CDN性能大盘对CDN cdn.poizon.com域名线上性能指标数据进行分析。
查看2021.6.17到2021.6.24一周数据:iOS端总耗时(仅含建连过程)在600ms以上(2021.6.23号最高为779ms);Android端总耗时(仅含建连过程)在350ms以上(2021.6.23号最高为369ms)。
可以看出双端CDN cdn.poizon.com请求耗时都很大,且iOS比Android更严重。
iOS总耗时(建连)
Android总耗时(建连)
再依次分析CDN请求各阶段耗时详情数据:
iOS端SSL耗时(下文统称为TLS耗时)在177ms以上(2021.6.23号最高为249ms),占总耗时(仅含建连过程)的32%;
Android端TLS耗时在80ms以上(2021.6.23号最高为81ms),占总耗时(仅含建连过程)的22%。
显然双端CDN cdn.poizon.com TLS耗时较长是导致总耗时(建连)较长的主要原因。
iOS TLS耗时
Android TLS耗时
问题定位
由于阿里云CDN TLS版本配置过低:最高仅支持TLS1.2,客户端使用TLS1.2协议请求阿里云CDN,TLS1.2协议握手需要经过2RTT,导致TLS阶段耗时较长。
解决思路
为了发挥TLS1.3 0RTT的性能优势及安全强化优势,因此决定将TLS版本升级到1.3。
方案调研
TLS简介
TLS(Transport Layer Security)安全传输层协议,用于保证请求双端之间的保密性和数据完整性。
TLS 1.0版本从1999年发布,之后在2006年和2008年先后发布了TLS1.1和TLS1.2版本。
TLS协议发布后便正式成为互联网传输层加密的标准,目前使用最广泛的为TLS1.2版本。
然而,TLS1.2协议已经发布有13年之久,在这期间有许多新的漏洞和缺陷被发现,如:
性能较差:握手过程需要经过2RTT;
安全性较低:存在针对SHA1造成的碰撞攻击,存在针对CBC模式加密算法的攻击等。
因此,为解决TLS1.2版本存在的性能问题及安全问题,TLS1.3版本应运而生。
TLS1.2与TLS1.3区别与优劣对比
性能提升
TLS1.3版本的握手流程相比TLS1.2版本进行了优化,一般为1RTT,复用情况下可达到0RTT。
相比TLS1.2版本2RTT,TLS1.3可以降低一半以上的握手耗时。
TLS1.2协议的握手过程
Wireshark抓包如上图,可以看出,TLS1.2协议需要两次往返(2RTT)完成握手。
客户端发送Client Hello
服务端返回Server Hello,Certificate,Server Key Exchange,Server Hello Done
客户端发送Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message
服务端返回New Session Ticket,Change Cipher Spec,Encrypted Handshake Message
客户端发送Application Data
服务端返回Application Data
TLS1.3协议的握手过程
Wireshark抓包如上图,可以看出,TLS1.3协议仅需要一次往返(1RTT)就可以完成握手。
客户端发送Client Hello
Client Hello包括signature_algorithms,key_share,psk_key_exchange_modes,pre_shared_key
服务端返回Server Hello,Change Cipher Spec,Application Data
Server Hello包括key_share,pre_shared_key
客户端发送Change Cipher Spec,Application Data
服务端返回Application Data
安全提升
TLS1.3版本相比TLS1.2版本,在密钥交换,对称加解密,压缩等环节进行了优化。
密钥交换阶段
支持PFS(Prefect Forward Security)前向安全性,废弃DSA证书,RSA填充模式更改为PSS,禁用了自定义的DH组参数。
对称加解密阶段
TLS1.3仅支持5种高效的加密算法,其他不安全的算法(TLS1.2支持多达37个加密算法)在TLS1.3版本都被禁用。
禁用CBC模式加密算法,禁用较为陈旧的RC4流加密算法,禁用容易造成碰撞攻击的SHA1加密算法。
压缩阶段
禁用TLS压缩:TLS压缩存在安全漏洞,通过CRIME攻击(植入JS脚本一位一位保留破解Cookie)可以窃取启用TLS压缩的HTTPS/SPDY协议传输的Cookie信息,拿到Cookie信息后攻击者可以进行请求劫持及进一步攻击。
对ServerHello之后的握手消息进行加密:拓展信息被封装到EncryptedExtension消息中传输,避免数据明文传输,提高数据安全性。
预期收益
TLS 1.3与TLS 1.2线下性能测试对比(同源验证):
iOS端总耗时(建连)减少18.26%,TLS耗时减少30.83%;Android端总耗时(建连)减少28.7%,TLS耗时减少26.6%
双端线上实际平均耗时(包含TCP复用)预计减少10%左右
iOS线下100次请求(每次重新建连)测试数据:
Android线下300次请求(每次重新建连)测试数据:
竞品调研
抖音,淘宝等主流App CDN已全面升级到TLS1.3,验证了TLS1.3的可行性及性能优势。
App | TLS1.3 | TLS1.2 | http2.0 |
抖音 | 是 | 是 | 是 |
拼多多 | 是 | 是 | 是 |
淘宝 | 是 | 是 | 是 |
哈啰 | 是 | 是 | 是 |
bilibili | 是 | 是 | 是 |
兼容性调研
阿里云CDN调研
与阿里云方沟通确认阿里云CDN支持TLS版本自动降级,在客户端不支持TLS1.3的情况下自动降级使用TLS1.2与客户端建连。
客户端双端网络库调研
分析开发环境一周数据可知,双端主流机型及系统版本均已支持TLS1.3,且支持TLS1.3与TLS1.2自动降级。
iOS主流机型数据
注:771 = TLS1.2,772 = TLS1.3
Android主流机型数据
方案设计
执行计划
提前在七牛云CDN添加cdn.poizon.com镜像配置(TLS协议,TLS算法,http协议等配置与阿里云完全一致)作为备用资源(已配置,且七牛云流量权重占比40%)
2021.6.25 2:00 执行CDN cdn.poizon.com TLS1.3变更(影响全局图片、视频、H5资源、小文件等)
在阿里云CDN控制台操作开启TLS1.3
监控方案
CDN cdn.poizon.com监控点及异常判定方案。
1. 无线平台-网络监控
请求异常率:分钟级请求异常率大于5%持续10分钟以上
总耗时异常:分钟级总耗时降幅大于30%持续10分钟以上(10%左右的降幅符合预期收益);分钟级总耗时涨幅大于20%持续10分钟以上
TLS耗时异常:分钟级TLS耗时降幅大于70%持续10分钟以上(50%左右的降幅符合预期收益);分钟级TLS耗时涨幅大于20%持续10分钟以上
responseSIze:分钟级responseSIze上下波动大于20%持续10分钟以上
2. 阿里云CDN-实时监控
质量监控:分钟级2xx,4xx,5xx状态码占比上下波动大于5%持续10分钟以上
还原方案
CDN cdn.poizon.com调整七牛云权重为100%,将流量立即切到七牛云备用资源(TLS协议,TLS算法,http协议等配置和阿里云完全一致)
阿里云CDN控制台操作CDN cdn.poizon.com关闭TLS1.3(还原到变更前的状态)
验证CDN cdn.poizon.com对应源host(du-img.oss-cn-shanghai.aliyuncs.com)请求阿里云已降到TLS1.2
CDN cdn.poizon.com分批次扩大阿里云权重(10%,30%,60%)
CDN cdn.poizon.com阿里云权重10%,通过查CDN cdn.poizon.com阿里云/七牛云请求次数的实时监控数据,确认阿里云对比七牛云请求次数占比是否达到10%,同时验证CDN cdn.poizon.comTLS耗时整体变高。符合当前权重后,再进行下一步权重调整。
CDN cdn.poizon.com阿里云权重30%,通过查CDN cdn.poizon.com 阿里云/七牛云请求次数的实时监控数据,确认阿里云对比七牛云请求次数占比是否达到30%,同时验证CDN cdn.poizon.com TLS耗时整体变高。符合当前权重后,再进行下一步权重调整。
CDN cdn.poizon.com阿里云权重60%,通过查CDN cdn.poizon.com阿里云/七牛云请求次数的实时监控数据,确认阿里云对比七牛云请求次数占比是否达到60%,同时验证CDN cdn.poizon.com TLS耗时整体变高。符合当前权重后,则流量还原回阿里云完成。
检测各指标已还原到变更前的标准,则还原成功
说明:
cdn.poizon.com TTL 60s
cdn.poizon.com凌晨2:00流量较小,流量全切七牛云不会对七牛云95峰值造成影响,因此不会导致费用增加。
验证方案
2021.6.25 2:00 ~2.10
通过准备好的release包验证CDN请求是否已TLS1.3连接
2021.6.25 2:10 ~4:00
APP业务主链路按照以测试用例进行回归测试及兼容测试:
社区首页,交易首页,社区详情页,交易详情页,视频,视频详情页,视频/图片发布,直播,下单流程,H5页面等主链路图片,视频及资源是否加载正常。
关注线上监控数据:
Crash率,用户反馈等
CDN 网络监控点及异常判定方案
无线平台-网络监控
请求异常率:分钟级请求异常率大于5%持续10分钟以上
总耗时异常:分钟级总耗时降幅大于30%持续10分钟以上(10%左右的降幅符合预期收益);分钟级总耗时涨幅大于20%持续10分钟以上
TLS耗时异常:分钟级TLS耗时降幅大于70%持续10分钟以上(50%左右的降幅符合预期收益);分钟级TLS耗时涨幅大于20%持续10分钟以上
responseSIze:分钟级responseSIze上下波动大于20%持续10分钟以上
阿里云CDN-实时监控
质量监控:分钟级2xx,4xx,5xx状态码占比上下波动大于5%持续10分钟以上
2021.6.25 10:00 ~19:00
持续关注线上监控数据
优化成果
CDN cdn.poizon.com开启TLS1.3 优化数据:7月1号对比6月24号数据,双端总耗时(建连)、TLS耗时均有明显降低:
iOS
总耗时:281ms -> 237ms,降低15%+
总耗时(建连):704ms -> 574ms,降低18%+
TLS耗时:210ms -> 137ms,降低34%+
Android
总耗时:307ms -> 269ms,降低12%+
总耗时(建连):369ms -> 325ms,降低12%+
TLS耗时:83ms -> 71ms,降低14%+
相关文档
TLS 1.3科普——新特性与协议实现:https://blog.csdn.net/andylau00j/article/details/79269499
TLS协议分析 与 现代加密通信协议设计:https://blog.helong.info/blog/2015/09/07/tls-protocol-analysis-and-crypto-protocol-design/
有赞TCP网络编程最佳实践:https://tech.youzan.com/you-zan-tcpwang-luo-bian-cheng-zui-jia-shi-jian/
几幅图,拿下HTTPS:https://mp.weixin.qq.com/s/Drc6s72GoiKwj3FOoRG6Yw
*文:Aix
得物技术
关注我们,做最潮技术人!