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 包的关系如下图所示:

△ 图片来源: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。

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

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

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

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

推荐阅读:

从 HTTP 到 HTTPS 再到 HSTS

HTTPS系列干货(一):HTTPS 原理详解

时间: 2024-10-29 09:06:12

HTTPS 传输优化详解之动态 TLS Record Size的相关文章

MySQL-5.5.32 配置文件优化详解

MySQL-5.5.32 配置文件优化详解============================== [TOC] # 一.配置文件说明 > MySQL-5.5.32是Mysql5.5系列中最后一个版本,也是最后一个有配置文件的版本,为什么这么说呢,用过5.6的博友都知道,在mysql5.6中已经不提供配置文件选择,只有一个默认的配置文件,好了,我们今天说的是5.5.32这个版,就不和大家说5.6了,下面我们来具体说一下,mysql5.5.32中,提供可选的几个配置文件, * my-small.

MySQL之SQL优化详解(二)

目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析Explain MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 是什么: 排好序的快速查找数据结构 两个主要的索引结构: B+tree 索引和哈希索引. 如何建: 1. ALTER TABLE table

MySQL之SQL优化详解(三)

目录 MySQL 之SQL优化详解(三) 1. 索引优化 2. 剖析报告:Show Profile MySQL 之SQL优化详解(三) 1. 索引优化 一旦建立索引,select 查询语句的where条件要尽量符合最佳左前缀的原则,如若能做到全值匹配最好. 索引优化的第一个前提就是建好索引,第二个就是避免索引失效 索引失效的场景 如果索引了多列,要遵守最左前缀法则.指的是查询从索引的最左前列开始并且不跳过索引中的列 不在索引列上做任何操作(计算.函数.(自动or手动)类型转换),会导致索引失效而

lucene、lucene.NET详细使用与优化详解

lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质.实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜

MySQL数据库优化详解(收藏)

MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * from t1;mysql索引 ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引ALTER TABLE table_name ADD INDEX index_name (column_list)ALTER TABLE table_name ADD UNIQUE (colu

详解java动态代理

生活中的代理: 比如一个明星成名了以后,是需要有一个代理的,因为太多人想找他签名,应付不来,那么这个时候代理的作用是拦截你对真正明星的访问,他可以拦截下来收点费用,再叫真正的明星过来为你签名. 程序中的代理: 1,要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理.等等,你准备如何做? 2,编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码 下图显示了在程序中代理的调用原理(

Nginx配置文件优化详解

Nginx配置文件优化详解 对nginx进行优化是重点也是难点,这里给出一些常用的优化措施,以及相关参数的所代表的意思.有些参数需要结合公司服务器进行设置. 全局变量的优化: #定义Nginx运行的用户和用户组user  www  www: #启动进程,通常设置成和cpu的数量相等 worker_processes  8: #为每个进程分配cpu. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 

lucene、lucene.NET详细使用与优化详解[转]

1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质.实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你 你要搜索的关键词出现在哪里.知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了.你可以把站

(转)SqlServer索引及优化详解(1)

(一)深入浅出理解索引结构 ??????? 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: ??????? 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是&q