为什么我的 TLS 1.3 多了一个 RTT

为了向大家提供更快、更安全的服务,笔者在前段时间为某个服务升级支持了 TLS 1.3,然而在升级过程中发现 RTT 并没有按预期减少,所以进行了排查与记录,并分享给大家。

一. 前言

在正文开始之前,先简要介绍一下 TLS 1.3 与 TLS 1.2 有哪些主要差异:

1. 更快的响应速度:

a. TLS 完整握手时间从 2 RTT 减少为 1 RTT

图片

b. 增加 0 RTT 模式(以牺牲某些安全特性为代价)

2. 更安全:

a. 加密更多握手数据

b. 更简洁更安全的加密套件:TLS 1.3 极大地简化了加密套件的设计,移除了不安全的加密算法。目前标准定义了 5 种加密套件,而非 TLS 1.2 中上百种复杂的可选组合,大幅降低了复杂性。

为了向大家提供更快、更安全的服务,笔者在前段时间为某个服务升级支持了 TLS 1.3,然而在升级过程中发现 RTT 并没有按预期减少,所以进行了排查与记录,并分享给大家。

二. 问题排查

笔者到测试 Server 的 RTT 约 36 ms,就当笔者升完服务,准备开开心心验收时,天塌了。打开浏览器一看 TLS 握手时长是 2 RTT,说好的 1 RTT 呢?

图片

在反复确认了升级的软件版本没有异常,TLS1.3 相关配置没有异常之后,我们请出网络数据包分析利器 Wireshark。

图片

乍看之下没有什么异常,TLS1.3 握手正常,也到了 HTTP 请求阶段。那我们再对比其他站点的请求看看。

图片

仔细对比和分析后我们发现,多出来的 1 RTT 产生在第 12 个包,Server 端收到了 Client 的 Ack 后才发送了 Certificate Verify 和 Finished。所以我们判断可能和 TCP 层面的某些机制有关。

图片

这里就引出一个问题,TCP 一次可以批量发送的数据受到哪些因素的影响:

1. 接收方窗口大小(RWND): 看抓包显示 Win 足够大,不会阻塞 Server 端传输

2. 接收和发送方的 MSS:都是 1460,正常范围

3. 拥塞控制:

a. 慢启动:根据 rfc6928  标准,初始窗口为 10。经确认我们服务器上也确实为 10。所以最大可以发送的数据量为 10 * MSS(1460)= 14 KB,Server 发送的数据量尚未达到初始窗口限制

b. 拥塞避免:比如丢包、或者 RTT 变长,看数据包判断没有触发

4. tcp_wmem: 由最小、默认、最大三个值组成,最小 4KB,  默认 16KB。考虑到测试节点没有压力,不会触发此限制。其次笔者尝试调大最小值做验证,依然没有解决问题

5. 其他因素

既然没能直接从数据包中推测出原因,咱们就再上服务器找找原因,根据之前的推断笔者用 tcp 作为关键词搜了一下服务配置,发现了线索: 

tcp_nodelay off

    这段代码开启了 Nagle 算法。翻阅 RFC896 我们可以发现 Nagle 算法是为了解决小数据包问题,比如下面这种情况:各种协议必要的头尾数据占 58 bytes,真正需要传输的数据只有 1 byte,有效载荷比不到 2%。

    图片

    图片

    于是 Nagle 算法通过一种自适应的方法来减少小数据包的数量,提升网络效率。其本质是通过增加时延来换取更高的有效载荷比

    Nagle 算法的核心内容可以概括为:不一下子把所有小分组都发出去,而是等到前一个小分组的 ACK 收到或者攒够一个 MSS 大小再一起发

    Nagle 算法的规则:

    1. 满载的数据包,允许发送
    2. 包含 FIN,允许发送
    3. TCP_NODELAY 被设置,允许发送
    4. 所有送的小数据包(长度小于 MSS)都被确认了,允许发送
    5. 上述条件都未满足,但发送了超时(一般为 200 ms),则立即发送

    根据上述规则,我们可以看到 Server 发送的序号为 9 和 12 的都是未满载的数据包,所以 12 号包是等 Server 收到了 Client 对 9 号包的 Ack 后才发送的。这就增加了 1 RTT。

    图片

    Nagle 算法提出于 1984 年,那时的带宽、数据包处理能力都远不如今天。而在当前环境下,对于时延敏感的应用,通常建议关闭 Nagle 算法。

    经确认 Nagle 算法并不适合我们现在的场景,所以关闭 Nagle 算法后再做验证,TLS 握手时间果然只有 1 RTT。看数据包 Serever 端的 Certificate Verify 和 Finished 包也不需要等 Client 的 Ack 就直接发送了。

    图片

    图片

    至此问题已圆满解决。我们已将上述优化上线,可将国内用户首次访问时延减少 10 ~ 40ms,海外最高减少上百毫秒。

    咱们再回过头来仔细看一下 TLS 1.3 的握手流程,会多一层理解:1 RTT 只是 TLS 交互逻辑上的,真正端到端的交互时间还受到底层协议比如 TCP 的影响。

    图片

    三. 结语

    这次问题的排查过程让笔者对网络协议的实际行为有了更深入的理解。同时笔者也从基础的网络知识中受益颇多,所以将整个过程整理分享出来,希望也会对你有所帮助。

    AI大模型学习福利

    作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

    一、全套AGI大模型学习路线

    AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

    二、640套AI大模型报告合集

    这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    三、AI大模型经典PDF籍

    随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    四、AI大模型商业化落地方案

    因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

    作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

    <think>好的,我现在需要帮助用户深入了解TLS 1.3协议中的1-RTT握手过程的详细参数和工作原理。用户之前已经询问过TLS 1.3握手过程的概述,现在想要更详细的参数和机制解释。首先,我需要回忆之前提供的回答,确保这次的内容更加深入,并且覆盖用户所需的技术细节。 首先,回顾之前的回答,我已经介绍了TLS 1.3的整体握手流程,包括Client Hello、Server Hello、密钥交换等步骤,以及安全性改进。现在用户需要更详细的参数,例如具体的消息结构、加密算法、密钥派生方法等。 接下来,我需要确定用户可能的深层需求。用户可能是在进行安全协议的研究,或者需要配置服务器时了解这些参数,以便优化或调试。因此,详细的技术参数和每一步骤的具体加密处理过程对他们来说非常重要。 然后,我需要整理TLS 1.3 1-RTT握手的关键参数,例如密钥交换算法、支持的密码套件、椭圆曲线参数、随机数的长度、HKDF的使用方式等。同时,要解释每个参数的作用和它们如何协同工作来确保安全性和效率。 还需要注意引用之前提到的前向安全性、HKDF算法等,确保内容的一致性。同时,用户提到的站内引用可能涉及负载均衡和代理,但当前问题集中在TLS握手,需要专注于协议本身的参数,避免偏离主题。 在组织内容时,应分步骤详细解释每个阶段的消息内容和参数,例如Client Hello中的扩展字段、密钥共享参数的具体格式,Server Hello中的选择过程,证书验证的细节,以及密钥派生的数学过程。可能还需要对比TLS 1.2和TLS 1.3的区别,以突出改进之处。 需要确保使用正确的LaTeX格式,例如椭圆曲线参数使用$符号包裹,数学公式正确。同时,生成的相关问题要针对技术细节,如密钥派生步骤、参数选择的影响、扩展字段的作用等,帮助用户进一步探索。 最后,检查内容是否准确,参考最新的RFC文档(如RFC 8446),确保信息正确无误,并且没有遗漏关键点。同时,保持语言的中文表达清晰,结构条理分明,便于用户理解。</think>### TLS 1.3 1-RTT 握手参数与流程详解 TLS 1.31-RTT 握手通过优化密钥交换和消息合并,显著降低了通信延迟。以下是其核心参数与工作原理的逐层解析: --- #### **1. 关键参数与数据结构** 1. **Client Hello** - **协议版本**:`0x0304`(表示 TLS 1.3) - **随机数(Client Random)**:32 字节的随机值,用于后续密钥生成。 - **密码套件**:仅支持前向安全的 AEAD 算法(如 `TLS_AES_128_GCM_SHA256`)[^5]。 - **密钥共享扩展(Key Share)**:客户端支持的椭圆曲线参数(如 `x25519` 或 `secp256r1`)及其公钥 $Y_c = g^{x} \bmod p$($x$ 为客户端临时私钥)。 - **预共享密钥扩展(PSK)**:可选,用于 0-RTT 模式[^1]。 2. **Server Hello** - **协议版本**:必须与 Client Hello 一致。 - **随机数(Server Random)**:32 字节,与 Client Random 共同生成主密钥。 - **密钥共享响应**:服务器选择客户端支持的椭圆曲线,返回公钥 $Y_s = g^{y} \bmod p$($y$ 为服务器临时私钥)。 - **密码套件确认**:从客户端列表中选择一个 AEAD 算法(如 `TLS_CHACHA20_POLY1305_SHA256`)[^5]。 --- #### **2. 密钥交换与主密钥生成** - **共享密钥计算**:客户端和服务器分别计算共享密钥: $$ shared\_secret = Y_s^x = Y_c^y = g^{xy} \bmod p $$ 此值通过椭圆曲线迪菲-赫尔曼(ECDHE)生成,确保前向安全性[^5]。 - **HKDF 密钥派生**:使用 HKDF 算法从以下输入生成主密钥: ```math HKDF-Extract(salt=0, IKM=shared_secret) → HKDF-Expand(PRK, info, L) → Master Secret ``` 其中 `info` 包含 Client/Server Random 和协议标签,`L` 为密钥长度[^5]。 --- #### **3. 详细握手流程** 1. **Client → Server: Client Hello** - 发送支持的密码套件、密钥共享参数、SNI(Server Name Indication)等扩展。 - 若支持 PSK,携带 `pre_shared_key` 扩展(包含 PSK 标识符)[^1]。 2. **Server → Client: Server Hello** - 返回选定的密码套件、密钥共享公钥、会话恢复参数(如 `NewSessionTicket`)。 - **合并证书与签名**:在 `Certificate` 消息中发送服务器证书链,并在 `CertificateVerify` 中用私钥对握手摘要签名(如 RSA-PSS 或 EdDSA)[^4]。 3. **密钥生成与验证** - 客户端验证服务器证书链(包括 CA 签名和有效期),并检查签名合法性。 - 双方基于共享密钥和随机数,通过 HKDF 派生出 4 组密钥: $$ \{client\_write\_key, server\_write\_key, client\_iv, server\_iv\} $$ 用于后续数据的加密与完整性校验[^5]。 4. **Finished 消息交换** - 客户端和服务器分别发送 `Finished` 消息,内容为握手消息的 HMAC 摘要,使用会话密钥加密。若校验失败,连接终止[^3]。 --- #### **4. 安全性关键设计** - **前向安全性强制启用**:所有密钥交换必须基于临时密钥(Ephemeral Key),禁用静态 RSA 密钥传输[^4]。 - **加密扩展(Encrypted Extensions)**:在 Server Hello 后立即启用加密,保护后续证书等敏感信息。 - **降级保护机制**:Client Hello 包含 `supported_versions` 扩展,防止中间人强制降级到 TLS 1.2[^5]。 --- #### **5. 性能优化对比 TLS 1.2** | 优化点 | TLS 1.2 | TLS 1.3 | |-----------------------|----------------------------------|----------------------------------| | 密钥交换与身份验证 | 分离的 ServerKeyExchange 消息 | 合并到 Server Hello 和 Certificate 消息 | | 主密钥生成 | 基于 PRF 的复杂过程 | HKDF 分层派生(更高效) | | 握手完成时间 | 2-RTT(含 ChangeCipherSpec) | 1-RTT(无冗余步骤) | --- ### 相关问题 1. TLS 1.3 中 HKDF 算法的具体步骤如何实现密钥分离? 2. 为什么椭圆曲线 x25519 成为 TLS 1.3 的推荐曲线? 3. 如何通过 Wireshark 抓包分析 TLS 1.3 握手过程中的密钥共享参数? 4. TLS 1.3 的证书签名算法与 TLS 1.2 有何区别? [^1]: PSK 模式通过预共享密钥实现 0-RTT,但需防范重放攻击。 [^3]: Finished 消息使用 HMAC 保证握手完整性。 [^4]: TLS 1.3 移除了 RSA 密钥传输,强制使用 ECDHE。 [^5]: 密钥派生过程详见 RFC 8446 第 7.1 节。
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值