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)。
大致的算法规则为:
- 在新连接以及 TCP 慢启动阶段,将 TLS Record 大小调整为大约 1 个 TCP 包的大小;
- 在一定的阶段,也即发送一定数量的 Record Size 之后,采用较大的 TLS Record Size ;
- 随着时间的推移,采用最大的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,让网站传输速度更快,给用户更好的体验。
推荐阅读:
HTTPS 传输优化详解之动态 TLS Record Size的更多相关文章
- SEO方式之HTTPS 访问优化详解
SEO到底要不要做HTTPS?HTTPS对SEO的重要性 正方观点 1.HTTPS具有更好的加密性能,避免用户信息泄露: 2.HTTPS复杂的传输方式,降低网站被劫持的风险: 3.搜索引擎已经全面支持 ...
- Nginx配置项优化详解【转】
(1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...
- MySQL-5.5.32 配置文件优化详解
目录 MySQL-5.5.32 配置文件优化详解 一.配置文件说明 2.my-medium.cnf 3.my-large.cnf 4.my-huge.cnf 5.my-innodb-heavy-4G. ...
- SqlServer数据库性能优化详解
数据库性能优化详解 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据 ...
- linux中高并发socket最大连接数的优化详解
linux中高并发socket最大连接数的优化详解 https://m.jb51.net/article/106546.htm?from=singlemessage
- 详解java动态代理机制以及使用场景
详解java动态代理机制以及使用场景 https://blog.csdn.net/u011784767/article/details/78281384 深入理解java动态代理的实现机制 https ...
- [推荐]T- SQL性能优化详解
[推荐]T- SQL性能优化详解 博客园上一篇好文,T-sql性能优化的 http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html
- lucene、lucene.NET详细使用与优化详解
lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应 ...
- MySQL数据库优化详解(收藏)
MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * ...
随机推荐
- wpf中内置资源文件
wpf中包含三种文件类型 资源文件:编译到可执行或库 WPF 程序集中的数据文件. 内容文件:与可执行 WPF 程序集具有显式关联的独立数据文件. 源站点文件:与可执行 WPF 程序集没有关联的独立数 ...
- Activiti 用户任务关联自定义表单
问题阐述 通常每一个"用户任务"都会对应一个表单,以供用户录入信息.尤其是在"流程定义"拥有多个版本的情形下,明确的指定表单显得极其重要. 一份新版本的&quo ...
- PHP开发要点与技巧总结(一)
Opcache:Opcache 来源于Zend Optimizer+改名,主要作用是通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是省去了每次加载 ...
- Logcat monkey命令
1. monkey命令 adb shell monkey -p com.autonavi.gxdtaojin --bugreport --ignore-crashes --ignore-timeout ...
- 前端笔记----jquery入门知识点总结
一.jquery的加载方法 $(document).ready(function(){js代码}); $(function(){js代码});(一般使用这个); 注意点1:使用jquery必须先导入函 ...
- ubuntu 13.04 64位安装32位兼容包
未安装32位兼容包,编译出现未找到指定目录下gcc命令,则安装兼容包:sudo apt-get install ia32-libs 若提示:不能安装,与相关软件冲突,则按如下安装: 在网上找到更新源, ...
- 【转】ARM vs X86 – Key differences explained!
原文:http://www.androidauthority.com/arm-vs-x86-key-differences-explained-568718/ Android supports 3 d ...
- canvas+gif.js打造自己的数字雨头像
前言 昨天 是1024程序员节,不知道各位看官过的怎么样.既然是过节,就要有个过节的样子,比方说,换个头像
- Django Web框架入门
一.Django介绍 Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很 ...
- MongoDB高级索引
1. 索引数组字段 创建和使用跟普通字段的索引一样. 2. 索引子文档字段: 创建索引: db.users.ensureIndex({"address.city":1," ...