作者 | 百度HTTPS技术支持团队

百度已经上线了全站 HTTPS 的安全搜索,默认会将 HTTP 请求跳转成 HTTPS。百度 HTTPS性能优化涉及到大量内容,从前端页面、后端架构、协议特性、加密算法、流量调度、架构和运维、安全等方面都做了大量工作。本系列的文章将对此一一进行介绍。关注 OpenWeb开发者公众号,回复“HTTPS”,即可查看相关文章。

HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。本文主要介绍 HTTPS 对用户体验的影响。

HTTPS 对访问速度的影响

在介绍速度优化策略之前,先来看下 HTTPS 对速度有什么影响。影响主要来自两方面:

1、协议交互所增加的网络 RTT(round trip time)。

2、加解密相关的计算耗时。

下面分别介绍一下。

网络耗时增加

由于 HTTP 和 HTTPS 都需要 DNS 解析,并且大部分情况下使用了 DNS 缓存,为了突出对比效果,忽略主域名的 DNS 解析时间。

用户使用 HTTP 协议访问 http://www.baidu.com(或者 www.baidu.com) 时会有如下网络上的交互耗时:

可见,用户只需要完成 TCP 三次握手建立 TCP 连接就能够直接发送 HTTP 请求获取应用层数据,此外在整个访问过程中也没有需要消耗计算资源的地方。

接下来看 HTTPS 的访问过程,相比 HTTP 要复杂很多,在部分场景下,使用 HTTPS 访问有可能增加 7 个 RTT。如下图:


HTTPS 首次请求需要的网络耗时解释如下:

1、三次握手建立 TCP 连接。耗时一个 RTT。

2、使用 HTTP 发起 GET 请求,服务端返回 302 跳转到 https://www.baidu.com 。需要一个 RTT 以及 302 跳转延时。

大部分情况下用户不会手动输入 https://www.baidu.com 来访问 HTTPS,服务端只能返回 302 强制浏览器跳转到 https。

浏览器处理 302 跳转也需要耗时。

3、三次握手重新建立 TCP 连接。耗时一个 RTT。

302 跳转到 HTTPS 服务器之后,由于端口和服务器不同,需要重新完成三次握手,建立 TCP 连接。

4、TLS 完全握手阶段一。耗时至少一个 RTT。

这个阶段主要是完成加密套件的协商和证书的身份认证。

服务端和浏览器会协商出相同的密钥交换算法、对称加密算法、内容一致性校验算法、证书签名算法、椭圆曲线(非 ECC 算法不需要)等。

浏览器获取到证书后需要校验证书的有效性,比如是否过期,是否撤销。

5、解析 CA 站点的 DNS。耗时一个 RTT。

浏览器获取到证书后,有可能需要发起 OCSP 或者 CRL 请求,查询证书状态。

浏览器首先获取证书里的 CA 域名。

如果没有命中缓存,浏览器需要解析 CA 域名的 DNS。

6、三次握手建立 CA 站点的 TCP 连接。耗时一个 RTT。

DNS 解析到 IP 后,需要完成三次握手建立 TCP 连接。

7、发起 OCSP 请求,获取响应。耗时一个 RTT。

8、完全握手阶段二,耗时一个 RTT 及计算时间。

完全握手阶段二主要是密钥协商。

9、完全握手结束后,浏览器和服务器之间进行应用层(也就是 HTTP)数据传输。

当然不是每个请求都需要增加 7 个 RTT 才能完成 HTTPS 首次请求交互。大概只有不到 0.01% 的请求才有可能需要经历上述步骤,它们需要满足如下条件:

1、必须是首次请求。即建立 TCP 连接后发起的第一个请求,该连接上的后续请求都不需要再发生上述行为。

2、必须要发生完全握手,而正常情况下 80% 的请求能实现简化握手。

3、浏览器需要开启 OCSP 或者 CRL 功能。Chrome 默认关闭了 ocsp 功能,firefox 和 IE 都默认开启。

4、浏览器没有命中 OCSP 缓存。Ocsp 一般的更新周期是 7 天,firefox 的查询周期也是 7 天,也就说是 7 天中才会发生一次 ocsp 的查询。

5、浏览器没有命中 CA 站点的 DNS 缓存。只有没命中 DNS 缓存的情况下才会解析 CA 的 DNS。

计算耗时增加。

上节还只是简单描述了 HTTPS 关键路径上必须消耗的纯网络耗时,没有包括非常消耗 CPU 资源的计算耗时,事实上计算耗时也不小(30ms 以上),从浏览器和服务器的角度分别介绍一下:

1、浏览器计算耗时

RSA 证书签名校验,浏览器需要解密签名,计算证书哈希值。如果有多个证书链,浏览器需要校验多个证书。

RSA 密钥交换时,需要使用证书公钥加密 premaster。耗时比较小,但如果手机性能比较差,可能也需要 1ms 的时间。

ECC 密钥交换时,需要计算椭圆曲线的公私钥。

ECC 密钥交换时,需要使用证书公钥解密获取服务端发过来的 ECC 公钥。

ECC 密钥交换时,需要根据服务端公钥计算 master key。

应用层数据对称加解密。

应用层数据一致性校验。

2、服务端计算耗时

RSA 密钥交换时需要使用证书私钥解密 premaster。这个过程非常消耗性能。

ECC 密钥交换时,需要计算椭圆曲线的公私钥。

ECC 密钥交换时,需要使用证书私钥加密 ECC 的公钥。

ECC 密钥交换时,需要根据浏览器公钥计算共享的 master key。

应用层数据对称加解密。

应用层数据一致性校验。

由于客户端的 CPU 和操作系统种类比较多,所以计算耗时不能一概而论。手机端的 HTTPS 计算会比较消耗性能,单纯计算增加的延迟至少在 50ms 以上。PC 端也会增加至少 10ms 以上的计算延迟。

服务器的性能一般比较强,但由于 RSA 证书私钥长度远大于客户端,所以服务端的计算延迟也会在 5ms 以上。

结束语

本系列的后续文章将进一步解释针对性的优化措施。关注OpenWeb微信公众号,回复“HTTPS”,即可查看本系列文章。

Brilliant Open Web

BOW(Brilliant Open Web)团队,是一个专门的Web技术建设小组,致力于推动 Open Web 技术的发展,让Web重新成为开发者的首选。

BOW 关注前端,关注Web;剖析技术、分享实践;谈谈学习,也聊聊管理。

关注 OpenWeb开发者,回复“加群”,让我们一起推动 OpenWeb技术的发展!

大型网站HTTPS实践:HTTPS对性能的影响相关推荐

  1. 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡

    2019独角兽企业重金招聘Python工程师标准>>> 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部 ...

  2. 【大型网站技术实践】初级篇:海量图片的分布式存储设计与实现

    说明:本文是我阅读计算机工程期刊<海量图片的分布式存储及负载均衡研究>一文的学习笔记和具体实践,原文地址在本文底部. 一.研究背景:性能与资金,二者可兼得乎? 1.1 那么问题来了? 随着 ...

  3. 【大型网站技术实践】初级篇:搭建MySQL主从复制经典架构

    一.业务发展驱动数据发展 随着网站业务的不断发展,用户量的不断增加,数据量成倍地增长,数据库的访问量也呈线性地增长.特别是在用户访问高峰期间,并发访问量突然增大,数据库的负载压力也会增大,如果架构方案 ...

  4. 【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器

    一.反向代理:Web服务器的"经纪人" 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网 ...

  5. 大型网站技术架构02 网站的高性能架构、网站的可用性架构

    大型网站核心架构要素 1. 性能 2. 可用性 3. 伸缩性 4. 扩展性 5. 安全性 瞬时响应:网站的高性能架构 1. 网站性能测试: 1). 不同视角下的网站性能 a. 用户视角的网站性能:用户 ...

  6. 高并发高负载的大型网站系统架构

    2019独角兽企业重金招聘Python工程师标准>>> 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下 ...

  7. 大型网站的架构设计问题—-大型高并发高负载网站的系

    随着中国大型IT企业信息化速度的加快,大部分应用的数据量和访问量都急剧增加,大型企业网站正面临性能和高数据访问量的压力,而且对存储.安全以及信息检索等等方面都提出了更高的要求-- 本文中,我想通过几个 ...

  8. 大型网站架构演进的五大阶段盘点

    一个创业公司起步时很可能就两台机器,一台Web 服务器.一台数据库服务器,在一个应用系统中集成了所有功能模块,但随着业务的发展.流量的增长,单应用远远不能满足业务需求. 下面我们一同来聊聊网站架构发展 ...

  9. 高并发的大型网站架构设计

    最近在学习大型网站的架构设计,便想把学习过程中的一些东西总结记录下来,以便复习和巩固提高.先来看看大型网站架构图: 从左边开始,先是CDN服务器和反向代理服务器,都用于缓存一些用户需要请求的资源.两者 ...

  10. 基于Java技术的大型网站架构设计方案

    架构设计漫长路 最佳实践我来数 千万并发没问题 要点首推数据库 SQL语句要优化 索引创建有艺术 三大范式不可废 冗余字段难维护 查询过多怎么办 缓存使用是本固 频繁访问不用怕 每秒数千扛得住 更新插 ...

最新文章

  1. SpringBoot打包时提示:Perhaps you are running on a JRE rather than a JDK?
  2. linux centos7开启IP转发、路由转发解决docker 端口映射 及外部无法访问问题
  3. 二阶振荡环节的谐振频率_【干货分享】晶体谐振器振荡频差的原因及对策
  4. 【转】通用sqlserver分页存储过程
  5. pythonのdjango 缓存
  6. 微信小程序制作-随笔4
  7. 姓名的首字母组成的图案C语言怎么编,c语言编写一个程序,根据用户输入英文名和姓先显示姓氏,其后跟一个逗号,然后显示名的首字母:...
  8. 实习踩坑之路:Date、LocalDate和LocalDateTime的区别
  9. shell 获取时间
  10. JMeter之脚本录制
  11. 《计算传播学导论》读书笔记:第五章 网络传播与传播网络
  12. STM32 硬件IIC 锁死及复位问题
  13. 读后感__局外人_知其不可而为之
  14. 属性动画cancel
  15. 用Python求完美数
  16. 基于java springboot android安卓点餐外卖系统源码(毕设)
  17. openlayers4 入门开发系列之船讯篇
  18. win10关机后cpu风扇还在转_解决win10关机后风扇继续转方法
  19. 【Vscode】解决报错 An SSH installation couldn‘t be found
  20. 阿里云使用JavaMailSenderImpl发送邮件

热门文章

  1. python矩阵计算_PYTHON 矩阵运算
  2. qt中设置QCheckBox的文本与勾选框之间的距离
  3. 机器视觉技术及应用_工业机器人视觉技术的应用前景
  4. linux ftp下载函数函数,FTP下载的函数
  5. 四川中职计算机专业考的学校,四川中职学校哪家专业
  6. Android入门简书,android ndk开发入门随笔(一)
  7. 中小学计算机教学大纲,中小学信息技术教材教法教学大纲
  8. android获取操作系统版本号,Android 获取手机的厂商、型号、Android系统版本号、IMEI、当前系统语言等工具类...
  9. vm客户机隔离不能选_开汽车美容店,这些位置绝对不能选,会让你门可罗雀,生意惨淡...
  10. java.net.url 中文乱码,.Net获取URL中文参数值的乱码问题解决方法总结