HTTPS 传输优化详解之动态 TLS Record Size

Posted 又拍云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPS 传输优化详解之动态 TLS Record Size相关的知识,希望对你有一定的参考价值。

笔者在过去分析了诸多可以减少 HTTPS 传输延迟的方法,如分布式 Session 的复用;

启用 HSTS,客户端默认开启 HTTPS 跳转;采用 HTTP/2 传输协议;使用 ChaCha20-Poly1305 算法减少移动端 CPU 运算时间等。

通过这些方法,可以在很大程度上优化 HTTPS 在传输上的延迟,给网站用户带来较好的访问体验。

最近笔者又在考虑通过动态调节 TLS Record Size 来减少 HTTPS 传输延迟。

TLS 与 TCP

TLS 协议是由记录层(TLS Record Layer)和握手层(TLS Handshake Layer)组成的,记录层处于协议的最底层,为 TLS 协议提供安全可靠的连接,为高层协议提供数据封装、压缩、加密等基本功能的支持。握手层协议处于记录层协议之上,握手层协议的作用在真正的应用数据传输之前,可以使客户端和服务器互相进行身份认证,协商加密算法以及生成加密密钥。一般来说,最大的 TLS Record 的大小为 16KB,而每个 TLS Record 包含一个 5Byte 的头部。

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、 基于 IP 的传输层协议。

TLS 是建立在可靠的数据传输的基础之上,运行在 TCP 层之上,一个 TLS Record Size 由多个 TCP 包组成,通过 WireShark 抓包可以看出,一个 TLS Record 大小为 16408 Byte ,被分为了 12 个 TCP 包。

△  WireShark 抓包


动态 TLS Record Size 调整原理

nginx 默认的 ssl_buffer_size 大小为 16KB(不支持动态调整),这就是一个 TLS Record Size 的大小。举例说明, 假如资源文件的大小为 1600KB,那么就会被拆分为 100 个 TLS Record 传送到客户端。

在传输过程中此时会出现这样的问题:

  1. TLS Record Size 越大,被拆分的 TCP 包会过多,在传输过程中,如果 TCP 出现丢包情况,那么 TLS Record 到达客户端的时间就会变长,而客户端必须等到收到完整的 TLS Record 才能够进行解密;TLS Record 及 TCP 包的关系如下图所示:

    HTTPS 传输优化详解之动态 TLS Record Size

    △ 图片来源:igvita.com


  2. 如果 TLS Record Size 较小,则 TCP 丢包对 TLS Record 的影响就较小了,但是于此同时,TLS Record 头部就变多了,可能还会降低连接的吞吐量。

综上所述,可以知道切割过小的 Record Size 会产生额外的消耗;而切割过大的 Record Size 会导致延迟。笔者认为可以根据 TCP 窗口大小来合理调整 TLS Record 大小可以有效降低 HTTPS 传输时造成的延迟。

如何进行 Record Size 大小调整

根据以上的论点,我们可以得出这样的结论:在 TCP 慢启动的过程中,可以将 TLS Record Size 调整小点;因为这个过程中 TCP 链接的拥塞窗口(cwnd )较小,TCP 链接的吞吐量也较小;在 TCP 连接结束慢启动之后,TLS Record 的大小可以增大一些,随着时间的推移,最终将 TLS Record 的大小调整到最大(也即 16KB)。

大致的算法规则为:

  1. 在新连接以及 TCP 慢启动阶段,将 TLS Record 大小调整为大约 1 个 TCP 包的大小;

  2. 在一定的阶段,也即发送一定数量的 Record Size 之后,采用较大的 TLS Record Size ;

  3. 随着时间的推移,采用最大的TLS Record Size 大小,也即 16KB。

WireShark 抓包验证

通过 WireShark 抓包,对这个过程进行验证:

阶段一:在刚开始,TLS Record Size 为 1393 Byte。

HTTPS 传输优化详解之动态 TLS Record Size

阶段二:一段时间之后,TLS Record Size 为 4253 Byte。

HTTPS 传输优化详解之动态 TLS Record Size

阶段三:最后,TLS Record Size 动态变为 16408 Byte。


上图三个阶段的抓包结果验证了动态 TLS Record Size 的算法规则,通过对动态调节 TLS Record Size 可以有效降低 HTTPS 传输时的延迟,为客户带来更好的体验。

目前,又拍云 CDN 平台已经完全支持动态调整 TLS Record Size ,对网站速度有更高要求的朋友可以通过开启又拍云 CDN,来使用动态 TLS Record Size,让网站传输速度更快,给用户更好的体验。

关于又拍云

又拍云是国内知名企业级云服务商、国家高新技术企业,持有工信部颁发的CDN牌照;致力于为客户提供一站式的在线业务加速服务,以场景化CDN为核心,打造了安全高可靠的短视频、直播云、点播云、云安全、融合云存储等解决方案,为客户提供静态加速、动态加速、一站式部署HTTPS、WebP自适应、H.265自适应等服务。

目前又拍云拥有6个数据处理中心、300多个国内CDN节点、15个海外CDN节点、5000台服务器、5TB保有带宽,日均请求超过1000亿次。发展至今,又拍云为超过25万企业用户提供了稳定、可靠的云服务,涵盖了包括星巴克、唯品会、魅族、豆瓣、华数传媒、江苏广电等多个领域的知名企业。



以上是关于HTTPS 传输优化详解之动态 TLS Record Size的主要内容,如果未能解决你的问题,请参考以下文章

SSL/TLS 握手优化详解

HTTPS协议之SSL/TLS详解(下)

真正“搞”懂HTTPS协议19之HTTPS优化

HTTPS协议详解

HTTPS安全之SSL证书的好处详解

SSL/TLS 握手过程详解***