• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

HTTPS对性能影响分析(三)

信息安全 彭东稳 9年前 (2015-12-17) 32466次浏览 已收录 0个评论

HTTPS对访问速度的影响

HTTPS在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。在介绍速度优化策略之前,先来看下HTTPS对速度有什么影响。影响主要来自两方面:一是协议交互所增加的网络RTT(round trip time)往返时延,二是加密相关的计算耗时。下面分别介绍一下。

1. 网络耗时增加

由于HTTPHTTPS都需要DNS解析,并且大部分情况下使用了DNS 缓存,为了突出对比效果,一下介绍忽略主域名的DNS解析时间。当用户使用HTTP协议访问http://www.baidu.com时会有如下网络上的交互耗时:

HTTPS对性能影响分析(三)

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

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

HTTPS对性能影响分析(三)

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

第一步,三次握手建立TCP 连接,耗时一个RTT

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

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

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

第三步,三次握手重新建立TCP 连接,耗时一个RTT

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

第四步,TLS完全握手阶段一,耗时至少一个RTT

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

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

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

第五步,解析CA站点的DNS。耗时一个RTT

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

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

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

第六步,三次握手建立CA站点的TCP连接,耗时一个 RTT

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

第七步,发起 OCSP 请求,获取响应,耗时一个RTT

第八步,完全握手阶段二,耗时一个RTT及计算时间。

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

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

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

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

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

C)浏览器需要开启OCSP 或者CRL 功能,Chrome 默认关闭了ocsp 功能,firefoxIE 都默认开启。

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

E)浏览器没有命中CA站点的DNS 缓存,只有没命中DNS缓存的情况下才会解析CADNS

2. 加密计算耗时

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

一、浏览器计算耗时

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

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

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

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

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

F)应用层数据对称加解密。

G)应用层数据一致性校验。

二、服务端计算耗时

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

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

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

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

E)应用层数据对称加解密。

F)应用层数据一致性校验。

由于客户端的CPU和操作系统种类比较多,所以计算耗时不能一概而论。手机端的HTTPS 计算会比较消耗性能,单纯计算增加的延迟至少在50ms以上。PC端也会增加至少10ms以上的计算延迟。服务器的性能一般比较强,但由于RSA 证书私钥长度远大于客户端,所以服务端的计算延迟也会在5ms 以上。

测试HTTPS延迟有多大?

上面介绍了HTTPS相对于HTTP,HTTPS对性能的影响主要来至于两个方面,网络耗时和计算耗时,也称之为SSL延时。下面就通过命令行工具curl有一个w参数,可以用来测量TCP握手和SSL握手的具体耗时,以访问支付宝为例。

上面命令中的w参数表示指定输出格式,time_connect变量表示TCP握手的耗时,time_appconnect变量表示SSL握手的耗时(更多变量请查看文档实例),s参数和o参数用来关闭标准输出。

从运行结果可以看到,SSL握手的耗时(157毫秒)大概是TCP握手(27毫秒)的7倍。也就是说,在建立连接的阶段,HTTPs链接比HTTP链接要长7倍的时间,具体数字取决于CPU的快慢和网络状况。

所以,如果是对安全性要求不高的场合,为了提高网页性能,建议不要采用保密强度很高的数字证书。一般场合下,1024位的证书已经足够了,2048位和4096位的证书将进一步延长SSL握手的耗时。

上面可以算是测试HTTPS的网络耗时,也可以进行网络耗时+计算耗时测试。

使用HTTP访问耗时如下:

使用HTTPS访问耗时如下:


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!