HTTP/2 的核心改进有四点:一是二进制分帧,把请求响应拆成帧传输;二是多路复用,一个 TCP 连接上可并行跑多个请求,彻底解决 HTTP/1.1 的应用层队头堵塞;三是 HPACK 头部压缩,客户端与服务端共同维护索引表,重复的头部只传索引;四是服务端推送,可以在请求 HTML 时主动推送 CSS 和 JS。
面试追问一般是 HTTP/2 还有什么问题:所有流共用一条 TCP 连接,一旦丢包整个连接阻塞,这就是 TCP 层队头堵塞,HTTP/3 用基于 UDP 的 QUIC 解决。另外服务端推送在实践中收益有限,主流站点更多依赖连接复用与缓存策略。
// HTTP/2 多路复用示意:一个连接上的多个流交错传输 const frames = [ { stream: 1, type: 'HEADERS', data: 'GET /index.html 的前一部分' }, { stream: 3, type: 'DATA', data: 'GET /style.css 的前一部分' }, { stream: 1, type: 'DATA', data: 'GET /index.html 的剩余部分' }, { stream: 3, type: 'DATA', data: 'GET /style.css 的剩余部分' } ]; frames.forEach(f => console.log('流 ' + f.stream + ' ' + f.type + ': ' + f.data)); console.log('所有流共享同一条 TCP 连接,应用层不再有队头堵塞');