读书笔记丨解密 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 端口号并不影响连接的识别,因此可以实现无缝的连接迁移。但是负载均衡就麻烦了。
- 改进的流量控制。
- 协议行为作为负载。