Qzone移动端页面去年在切换至HTTPS后,页面加载速度遇到了较大的挑战,出现了较大的上升趋势。为了解决这个问题,Qzone前端以及运维团队通过反复实验、分析,在实践中总结了一些方法,有效提升了HTTPS页面的访问速度。希望本文能够帮助提高用户在全站HTTPS环境上的体验,减少大家对全站启用HTTPS的顾虑。毕竟用户的体验同用户信息安全是一样重要的。
以iOS平台为例。Qzone页面在在切换至HTTPS之前,平均访问速度约为1795ms。切换至HTTPS之后,平均访问速度直接飙升至2630ms。我的天呐,上涨了900ms,幅度接近50%。为了保障用户的正常体验,吓得我赶紧把入口又切回了HTTP。
在这之后,为了兼顾体验和安全,我们便开始踏上了提升HTTPS访问速度的道路。先简单以图示总结下我们优化的结论:
文章里的数据以iOS为例,访问速度指的是页面html开始请求到页面js执行完毕的耗时
使用SPDY协议是我们优化的第一步。SPDY(speedy)是Google早年提出的网络通信协议。它通过多路复用、请求优先级以及HTTP报头压缩等方法,能够有效提升页面访问速度。SPDY在iOS系统上兼容性较好,iOS 8.0及以上版本的Safari浏览器以及WebView组件均支持,覆盖了Qzone 85%以上的用户。
基于以上统计结论,我们针对iOS平台上的用户启用了HTTPS+SPDY协议。数据显示,在开启SPDY之后页面访问速度提升了约370ms,是一个相当可观的数据。
在Android系统上,手机QQ以及微信中的WebView是使用了腾讯浏览服务(升TBS)内核,目前支持SPDY的版本正在灰度发布中,预期全面发布后能够覆盖80%的Qzone用户。
在iOS平台上完成了SPDY的改造后,HTTPS的访问速度虽然有了370ms的提升,但同HTTP相比仍有400ms的差距。经过进一步的分析, 这400ms的时间差主要集中在了SSL握手的阶段上。根据SPDY协议,每个域名需要单独同服务器建立TCP连接,各自要进行一次SSL握手,每次耗时约200ms。根据这个分析结果,我们也有了进一步的优化方向,那就是减少SSL的耗时。
要减少SSL握手的耗时,可以有三个方式:
-
提升TCP连接的复用率
-
提升SSL session的复用率
-
减少页面中请求域名的数量
对提升TCP连接的复用率,Qzone团队的解决方案是,在页面的入口处预建了一个连接,用户点击入口之前,先向h5.qzone.qq.com(Qzone移动端页面域名)发起一个https请求,请求的结果完全可是一个空内容,同时服务器端要启用keep alive。keep alive设定的时间并非越长越好,根据我们的反复实验,最终将这个数值确定为60s。这个预建的连接,不仅仅能起到减少了SSL握手耗时的作用,实际上也能减少TCP建立的时间。在实施了页面入口预请求之后,统计出用户访问页面平均速度又降低了400ms,其中预请求复用的命中率大约是75%。
对提升SSL session复用率,需要服务器端支持session ticket或者session cache,目前Qzone运维团队已经做到了能够支持分布式session cache和全局session ticket key。这里需要说明的是,如果我们按上文所说做了预建连接,复用了TCP连接的请求是不会再发生SSL握手的,那么这里也就不需要太多关注session复用的问题。不过这里还是分享一下Qzone在启用SSL session复用后的实践数据。SSL session复用对大部分Android用户的提升非常明显,可以将SSL握手耗时从400ms优化至100ms。但对于iOS的用户,由于iOS平台本身对于性能的优化,SSL握手时间耗时比Android用户低不少,耗时从200ms降至了100ms。SSL seesion的复用率大约是40%。
对减少页面上的域名,Qzone移动端的业务主要涉及两个关键域名,一个是nodejs服务器h5.qzone.qq.com,另一个是CDN域名qzonestyle.gtimg.cn,每个域名的SSL握手各自需要额外耗时200ms。因此我们需要做的就是将页面上的域名收归,尽量使用一个域名,以减少SSL握手次数。我们通过ndoejs服务器做HTTP代理,将qzonestyle.gtimg.cn域名上的静态文件收归到h5.qzone.qq.com,而上文已经提到,h5.qzone.qq.com在页面的入口处已经做了预建连接。因此域名收归后,页面整体的访问速度又提升了200ms。
通过服务器代理收归域名除了能够减少SSL握手次数,还有一个好处就是对于像Qzone这种业务复杂、域名繁多的产品,无论之前页面上用了多少域名,都可以通过服务器代理的方式,将域名收归至一个。这样在业务从HTTP切换至HTTPS的时候,原有各业务均可以保持HTTP不变,大大降低了全站切换HTTPS的开发成本。
除了上面三种减少SSL握手时间的方式,我们在SSL协议和算法上也做了一些统计对比。在HTTPS握手过程中记录协议类型、加密套件、握手时间,并且将上述内容返回给页面。页面在记录用户的访问速度之后,上报数据的同时,把上述的协议类型等数据也一同上报。
从上表可以看出来,TLS1.2协议的性能要明显优于1.1和1.0。Cipher suite 方面,ECDHE-RSA-AES128-GCM-SHA256和ECDHE-RSA-AES128-SHA256性能很好。ECDHE-RSA-CHACHA20-POLY1305理论上讲对性能提升有较大帮助,但是由于iOS平台暂时不支持该类算法,因此从数据样本上无法体现优势。后续Qzone团队会继续在协议和算法层面做更多的性能分析和优化,包括TCP参数调优,握手过程优化,SSL record size适配等。
经过以上几个小手术,HTTPS的页面合计访问速度提升超过了1000ms,同相比HTTP相比差距几乎可以忽略。同时由于TCP复用,在某些场景上甚至比HTTP的访问速度还快。
关于:中科研拓
深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供很好的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com