1、HTTP1.1 和 HTTP2 的主要区别?HTTP3 又带来了什么优化?
答:HTTP/1.1 的问题:HTTP/1.1相比HTTP/1.0做了一些优化(如长连接keep-alive、管道化),但仍有以下问题:
- 队头阻塞 (Head-of-Line Blocking):同一个 TCP 连接里,前一个请求没返回,后面的请求就被卡住。
- 并发受限:浏览器通常同域名只允许
6个TCP连接,想提高并发就得拆子域(雪碧图、CSS/JS 合并就是当年的产物)。 - 头部冗余:每次请求都会带上
Cookie、User-Agent等完整头部,浪费流量。 - 明文传输:
HTTP本身无加密(得依赖HTTPS)。
HTTP/2 的优化:HTTP/2 在 2015 年标准化,主要优化点:
- 二进制分帧:
HTTP/1.x基于文本解析,HTTP/2用二进制帧,解析更高效。 - 多路复用 (Multiplexing):一个 TCP 连接可以承载多个并发请求/响应;不会再因为一个请求慢卡住其他请求(解决了 HTTP/1.1 的队头阻塞)。
- 头部压缩 (HPACK):使用
动态表 + 静态表压缩请求头,减少重复头字段传输(比如 Cookie)。 - 服务器推送 (Server Push):服务端可以在客户端请求
HTML时,主动推送CSS/JS等资源,减少请求延迟。 - 存在问题:
TCP层面的队头阻塞依然存在,虽然HTTP/2在应用层解决了请求阻塞,但底层依赖单个TCP连接;如果TCP丢包,整个连接都得等重传,所有请求都会受影响。- 握手延迟:基于
TCP + TLS,建连开销仍然较高。
HTTP/3 的优化(基于 QUIC 协议):HTTP/3在 2022 年成为正式标准,底层不再基于TCP,而是基于UDP + QUIC:
- 彻底解决 TCP 队头阻塞:QUIC 在传输层就支持多路复用,丢包只影响单个数据流,不会阻塞其他流。
- 更快的连接建立:QUIC 内置 0-RTT / 1-RTT 握手(结合 TLS 1.3),建连速度比 TCP+TLS 快。
- 内置加密:QUIC 默认强制加密,安全性更高。
- 更优的拥塞控制 & 连接迁移:QUIC 在应用层实现拥塞控制,更新速度比 TCP 协议栈快;支持连接迁移(换 WiFi/4G 不会断开连接)。
2、什么是 Keep-Alive?如何提升连接复用效率?
答:Keep-Alive是长连接机制,允许多个HTTP请求复用同一个TCP连接,从而减少握手和关闭开销,提升性能。在现代前端,可结合HTTP/2/HTTP/3的多路复用、合理Keep-Alive配置、CDN和缓存策略来最大化连接复用效率。
- Keep-Alive(长连接) 是
HTTP/1.1的一个特性,它允许 同一个 TCP 连接上可以连续发送多个HTTP请求/响应,而不是每个请求都建立新的TCP连接。 Keep-Alive的流程- 浏览器发起第一个请求 → 建立
TCP连接 - 服务器响应并保持连接,不立即关闭
- 浏览器在同一连接上继续发第二个请求
- 可以重复多个请求,直到达到
Keep-Alive超时或最大请求数
GET /index.html HTTP/1.1 Host: example.com Connection: keep-alive Keep-Alive: timeout=5, max=100timeout=5→ 空闲连接保持 5 秒max=100→ 最多可以复用 100 个请求
- 浏览器发起第一个请求 → 建立
如何提升连接复用效率
- 减少
TCP握手次数- 长连接避免了每个请求都建立/关闭 TCP 连接
- 尤其在 HTTP/1.x 下,TCP 握手成本高,Keep-Alive 可以显著提升性能
- 使用 HTTP/2 或 HTTP/3
- HTTP/2 → 单 TCP 连接多路复用(Keep-Alive 变得更智能)
- HTTP/3 → 基于 QUIC 的 UDP,多路复用 + 快速握手
- 合理设置
Keep-Alive参数timeout→ 空闲时间不宜过短,过短会频繁建立连接max→ 每条连接的最大请求数,防止单条连接占用过久
- 静态资源域名拆分
- 如果同域名请求过多,浏览器并发受限 → 可考虑拆分静态资源到多个子域名
- 不过在
HTTP/2/HTTP/3下,多域名拆分反而可能增加握手开销
- 配合
CDN/ 缓存- 静态资源走
CDN → TCP连接可能复用多个资源请求 - 缓存命中 → 节省网络请求,提高连接利用率
- 静态资源走
3、浏览器如何处理并发请求的数量限制?
为什么要限制?
- 如果无限并发请求,会:
- 占用太多系统资源(
TCP连接开销很大) - 服务端压力过大
- 可能引发网络阻塞(拥塞控制困难)
- 占用太多系统资源(
所以浏览器 对同一个域名的并发请求数有限制
浏览器的并发请求数(不同协议差异)
- HTTP/1.0
- 每个请求一个
TCP连接(无Keep-Alive) - 没有严格限制,但性能极差(频繁握手)
- 每个请求一个
- HTTP/1.1
- 默认启用
Keep-Alive(连接复用) - 并发限制:同一域名通常 6 个连接(Chrome、Firefox、Edge 等主流浏览器大致都是 6 个,Safari 有些版本是 4 个)
- 超过的请求会 排队等待(队头阻塞)
- 默认启用
- HTTP/2
- 采用多路复用(Multiplexing)
- 一个
TCP连接内可以同时跑多个HTTP请求 - 并发数量主要由服务器的配置和浏览器实现决定(Chrome 默认一个连接可支持 100+ 并发流)
- 不再受限于 "6 个连接" 的规则
- HTTP/3(基于 QUIC)
UDP协议+ 多路复用- 没有 TCP 队头阻塞问题
- 理论上并发量更大,性能更好
浏览器是怎么处理超出限制的请求?
- 如果请求数超过限制:
- HTTP/1.1:额外请求进入等待队列,必须等前面的请求完成或连接释放
- HTTP/2/3:因为支持多路复用,不需要排队等待,直接在一个连接里发送
前端如何绕过并发限制?
在 HTTP/1.1 时代,很多优化手段就是为了解决 6 个并发的问题:
- 域名分片(Domain Sharding)
- 静态资源放到不同的子域名,比如
img1.xxx.com、img2.xxx.com,让浏览器对每个域名都能开 6 个连接
- 静态资源放到不同的子域名,比如
- 雪碧图 / 文件合并
- 把多个小图片合成一张大图,减少请求数
- 合并
JS/CSS文件,减少并发请求
- 升级
HTTP/2 / HTTP/3, 最彻底的解决方案。