队头阻塞问题其实在 [[016.HTTP 各版本差异|HTTP 各版本差异]] 中已经写的很详细了,本文再单独拿出来说一下
队头阻塞是指在网络传输过程中,第一个数据包被阻塞导致后续所有数据包无法处理的性能瓶颈现象。这种问题发生在两个层面:
HTTP/1.1 中的具体表现:
在 HTTP/2 普及前,工程师们使用多种策略缓解队头阻塞:
// 通过多个子域名绕过连接限制
const assets = [
'https://static1.example.com/image1.jpg',
'https://static2.example.com/image2.jpg',
'https://static3.example.com/image3.jpg'
];
效果:将 6 连接限制扩展到 18 个(3 个子域名 × 6)
/* 合并多个 CSS 文件 */
@import url('reset.css');
@import url('header.css');
@import url('main.css');
精灵图 (Spriting):
.icon {
background-image: url('sprite.png');
}
.icon-home {
background-position: 0 0;
width: 32px;
height: 32px;
}
核心思想:减少 HTTP 请求数量
HTTP/2 协议从根本上解决了 HTTP 层的队头阻塞问题:多路复用 (Multiplexing) 机制
核心技术:
HTTP/3 基于 QUIC 协议解决 TCP 层队头阻塞问题
关键创新点:
WebTransport 可以理解为基于 HTTP/3 的 [[018.WebSocket|WebSocket]]
const transport = new WebTransport('https://example.com:443/');
const writer = transport.datagrams.writable.getWriter();
writer.write(new Uint8Array([...]));
Sec-CH-HTTP3-RTT: 150
Sec-CH-Network-Efficiency: fast-3g