天天看點

阿裡雲 CDN HTTPS 最佳實踐——TLS record size

TLS 協定由兩層協定組成:TLS 握手協定和 TLS 記錄協定(TLS Record),TLS Record 協定在 TLS 握手協定之下。下面是 SSL/TLS 的分層結構:

阿裡雲 CDN HTTPS 最佳實踐——TLS record size

所有的 TLS 上層資料(包含 TLS 握手協定消息以及更上層的應用協定資料)都由 TLS Record 來封裝和傳輸。下面是 TLS Record 協定的消息封裝流程:

阿裡雲 CDN HTTPS 最佳實踐——TLS record size

一個消息會在 TLS Record 協定層被分段,然後對每個分段分别壓縮(已廢棄)和加密,最後加上 TLS Record 協定頭再通過網絡層發送出去,在 Wireshark 中可以看到:

阿裡雲 CDN HTTPS 最佳實踐——TLS record size

可以看出 TLS/SSL 資料加解密是基于分段的,接收方收到一個完整的分段就可以解密,如果分段過大,那接收方必須要等到接收完整個分段的資料才能解密,當網絡不好出現丢包、擁塞、重傳等等情況下會嚴重影響時延,如果分段過小,頭部負載比重就會較大,影響吞吐率。是以,怎麼分段就比較關鍵,也就是 TLS Record Size 大小多少合适。這就涉及到兩個重要的名額:時延和吞吐率。

如果 TLS Record Size 設定較大 假如超過了 MTU,一個分段會被 TCP 層再次分段,拆分成多個包發送,那麼時延也相應地增大,但由于記錄協定頭占比很小,吞吐率也增大。 如果 TLS Record Size 設定較小 一個分段在 TCP 層沒有被再次分段,由一個包發送出去,時延會比較小,但吞吐率也會下降。

是以,對時延敏感的域名,TLS Record Size 建議設定為略小于 MTU 的大小(粗算:MTU - TLS Record Header Length - TCP Header Length - IP Header Length)。對吞吐率敏感的域名,TLS Record Size 建議設定為 16k(上限)。如果同時兼顧時延和吞吐率的話,建議設定為 8k (經驗值)。

但是,TCP 有擁塞控制機制,在 TCP 連接配接剛開始的慢啟動階段,擁塞視窗會比較小,這時較大的 TLS Record Size 會導緻 TLS Record 片段被 TCP 分成多個包來發送,進而導緻時延較大,可能就會影響網頁的首屏時間。在整個 TCP 資料傳輸過程中,可能啟動擁塞避免算法,也可能遇到資料丢失和重傳的情況,然後又重新進入慢啟動階段。

是以,更好的做法是動态調整 TLS Record Size 的大小,而不是使用固定的值。在 TCP 連接配接初期使用較小的值,等傳輸速度上來之後再使用更大的值。

繼續閱讀