读书笔记丨解密 QUIC/HTTP3:未来互联网的基石

1. QUIC 产生背景

常见网络协议

  • UDP
  • TCP
  • SCTP(Stream Control Transmission Protocol):用于电话网络。
  • KCP:基于 UDP 在应用层实现可靠性传输,牺牲带宽换取效率。
  • RTP(Real-time Transport Protocol):与 RTCP 配合传输实时数据,如交互式音频和视频数据。
    • RTCP:传输控制信息
    • RTP:传输实时数据

TSL 版本演化

  • SSLv2:安全性低

  • SSLv3:分为握手阶段和数据传输阶段。

    • 握手阶段完成对端点的认证和确定保护数据传输的密钥。
    • 一旦确定了密钥,后面的数据传输和SSL协议过程都受到加密和完整性保护。
  • TSL1.0:基于 SSLv3,存在 CBC(Cipher Block Chaining,密文分组链接)加密和解密模式漏洞,使得主动攻击者可以观察到当前记录的 IV(Intiallization Vector,初始化向量),猜测一个数据库,进行数据注入。

  • TSL1.1:修复了 TSL1.0 的一些关键安全问题:

    • BC 加密使用每条记录一个的显式IV;
    • 为了防止 CBC 填充攻击,使用 bad_record_mac 错误码代替 decryption_failed 回复填充错误;
    • 支持传输参数的IANA(Internet Assigned Numbers Authority,互联网数字分配机构)注册,增加了传输参数的灵活性;
    • 改进了连接关闭过早情况下的连接恢复问题。

    有些加密算法还是存在安全漏洞,使用的 MD5 也不安全。

  • TSL1.2:主要关注了架构灵活性和安全问题。

    • 架构:
      • 客户端可以指定自己支持的签名和 hash 算法列表;
      • 支持非协议固定的算法;
    • 安全:
      • 增加了对 AEAD(Authenticated Encryption with Associated Data 关联数据认证加密)的支持,可以在加密中认证没有加密部分的关键数据,甚至是不在报文中的关键数据,可以保护更大的范围。
      • 规定必须实现密码套件 TLS_RSA_WITH_AES_128_CBC_SHA。
      • 增加了 HMAC-SHA256 密码套件。
      • 删除了包含已废弃算法的 IDEA 和 DES 密码套件。
      • 对 EncryptedPreMasterSecret 版本号进行了更严格的检查。
  • TSL1.3:除了增加安全性,重点改进了连接速度,首次连接发送数据最低可以 1-RTT,恢复连接发送数据最低可以 0-RTT。

    • 安全:
      • 删除了所有被证明有问题的对称加密算法,只保留了 AEAD 的加密套件。密码套件的概念也已经改变,将认证和密钥交换机制与加密算法和散列(用于密钥导出函数和握手消息认证码)分离。
      • 删除 RSA 和静态 DH 密码套件,因为静态 RSA 加密预主密钥的方式和使用静态 DH 私钥都不能保证前向安全性,很容易泄露密钥。只保留能保证前向安全的密钥交换算法,如使用临时私钥的 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral,椭圆曲线 DH 临时密钥交换算法)和 DHE(Diffie-Hellman Ephemeral, DH 临时密钥交换算法)。
      • ServerHello 之后的消息都加密传输。
      • 删除了压缩功能。之前版本的压缩功能由于存在被攻击的风险实际上很少使用,而且现代的压缩基本都在应用层实现,比如HTTP 就自己实现的压缩。

HTTP 版本演化

  • HTTP0.9:仅支持简单的请求响应,只能访问简单的文本文档。

  • HTTP1.0:HTTP1 中引入了请求头和响应头,请求时可以指定 HTTP 版本号、用户代理、接收类型等,响应可以指明响应状态、内容长度、内容类型等。

  • HTTP1.1:增加了重用 TCP 连接(keep-alive)的方法,默认保持连接,除非显式通知关闭连接[插图]。这样可以在一个 TCP 连接上完成多个请求-响应,消除了 TCP 建立的延迟,也避免了新建立的 TCP 连接的慢启动过程。

    • HTTP1.1 在 HTTP 请求首部中增加了 Host 字段,用来支持共享 IP 地址的虚拟主机服务器。
    • 同时支持了更多的方法,如 PUT、PATCH、DELETE、OPTIONS。
    • 引入分块传输支持动态内容。
    • 引入了更多的缓存控制策略。
    • 支持请求部分内容。
  • HTTP2:修改了 HTTP1.1 的封装格式,增加了一个二进制分帧层。基于二进制分层,HTTP2 实现了 HTTP 的多路复用。HTTP2 为每个请求分配了一个流标识,服务器响应时带上相同的流标识,客户端就可以方便地将响应与请求关联起来,而不用依赖顺序,从而可以降低延迟和提高吞吐量。

    • HTTP2 还增加了首部压缩 HPACK(Header Compression for HTTP2,HTTP2 首部压缩算法)。
    • 支持请求优先级。
    • 支持服务器主动推送。
    • 增加了 ALPN(Application-Layer Protocol Negotiation,应用层协议协商)。
    • 支持认证、加密和完整性保护,即 HTTPS

    但多个请求或响应在同一个 TCP 上发送时,仍然受制于 TCP 的队首阻塞问题。

  • HTTP3:基于 QUIC 协议,底层使用 UDP 实现,摆脱了 TCP 的队首阻塞问题。同时改进了 TCP 中存在的一些其他问题,比如拥塞控制、协议僵化、启动慢、重连慢、安全弱等。

    • 实现了没有队首阻塞的并发。如果 QUIC 丢了一个报文,仅仅影响对应流的交付,不会阻塞其他流。
    • 与 TLS1.3 紧密合作,尽可能的加密。还增加了 QUIC 报文的首部加密,除保证了报文安全性,提高了攻击门槛,还避免了协议僵化。
    • 选择 UDP 作为底层实现。一方面避免了 TCP 的首部阻塞,另一方面互联网中绝大部分的主机和中间件都是 TCP 和 UDP 的天下,所以天然支持。
    • 用户态实现。不依赖于内核,容易单独升级。
    • 低延迟的建立。实现了首次最低 1-RTT 发送应用数据,恢复连接时发送应用数据最低只需 0-RTT。
    • 无缝的连接迁移。QUIC 的连接基于连接标识,改变 IP 或者 UDP 端口号并不影响连接的识别,因此可以实现无缝的连接迁移。但是负载均衡就麻烦了。
    • 改进的流量控制。
    • 协议行为作为负载。

2. QUIC 报文


读书笔记丨解密 QUIC/HTTP3:未来互联网的基石
https://hedon.top/2025/01/15/book-quic-http3/
Author
Hedon Wang
Posted on
2025-01-15
Licensed under