大型網站HTTPS實踐:HTTPS對效能的影響

作者 | 百度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) 時會有如下網路上的互動耗時:
HTTP 首個請求的網路耗時

可見,使用者只需要完成 TCP 三次握手建立 TCP 連線就能夠直接傳送 HTTP 請求獲取應用層資料,此外在整個訪問過程中也沒有需要消耗計算資源的地方。

接下來看 HTTPS 的訪問過程,相比 HTTP 要複雜很多,在部分場景下,使用 HTTPS 訪問有可能增加 7 個 RTT。如下圖:

HTTPS 首次請求對訪問速度的影響
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技術的發展!