HTTP/3 分离流的交付顺序,不隔离全部恢复机制
HTTP/3 把 HTTP 放在 QUIC 上传输,不再依赖 TCP。QUIC 提供逐流有序交付:一条流缺少某段内容时,另一条流已经完整收到的数据不一定必须跟着等待。它解除的是特定的传输顺序依赖,并没有给每个请求配备独立的拥塞控制器、丢包检测器或确定的完成期限。先区分交付顺序和恢复机制,才能准确理解收益。 交付顺序不等于丢包检测 HTTP/2 的帧共享 TCP 的一个有序字节流。中间缺少一段时,后续字节即使属于另一个响应,也要等缺口补齐才能交给 HTTP。已经交付的内容不会被收回,应用也不会因为出现一次丢包就全部停止。究竟影响哪些请求,要看它们的字节相对缺口处于什么位置,不能笼统说整条连接上的所有工作都同时冻结。 QUIC 在每条流内维护偏移量。当 A 流仍缺少前面的字节时,B 流完整收到的数据可以交付。不过,一个 QUIC 包可以携带多条流的帧,因此丢掉一个包也可能同时影响多条流。需要恢复的信息会装进新包再次发送;包编号与流偏移量承担不同职责,并不是每个流各自重新传送一份独立的旧包。 RFC 9002 按包编号空间区分丢包检测,而不是按 HTTP 请求或流划分。往返时间估计与拥塞控制面向网络路径。逐流流控之外还存在连接级额度,因此共享容量不足或连接额度耗尽,仍会同时拖慢多个流。不能把独立排序扩写成独立带宽,也不能说某条流发生问题时邻居在任何条件下都不受影响。 HTTP 语义与部署边界仍然存在 方法、状态码和表示语义仍属于 HTTP。HTTP/3 改变消息分帧,并使用 QPACK 压缩字段。QUIC 集成 TLS 1.3 认证与包保护;调度和优先级策略仍要决定先发送哪些已经可用的流数据,并不会凭空增加带宽。如果某个字段区段依赖尚未到达的 QPACK 动态表项,它仍然可能等待。因此,去掉 TCP 的跨流顺序约束,并没有消灭协议内部或应用内部的全部依赖,共享数据库锁和服务端工作队列也不会随之消失。 丢包路径可能受益,但应测量真实工作负载,而不是保证所有网页必然加速。处理器成本、握手成功率、调度、可用带宽和客户端实现都会影响结果。比较时要核对同一被测链路实际协商的协议及正文完成情况;边缘节点使用 HTTP/3,不能证明它连接源站时也采用同样协议,更不能凭协议名称推算生产收益。 ...