浏览器同一个域名下通常限制多少个并发请求?这对 HTML 资源加载有什么影响?
这是一个非常经典的前端性能优化问题。简单直接的回答是:
在 HTTP/1.1 协议下,现代浏览器(Chrome, Firefox, Safari, Edge)对同一个域名(Domain)的并发请求限制通常是 6 个。
但在 HTTP/2 和 HTTP/3 协议下,这个限制的含义发生了根本性的变化(不再受限于 TCP 连接数)。
下面详细分析具体的限制数值、产生的影响以及解决方案。
1. 具体限制数值
浏览器的并发限制是针对 同一域名(Origin) 的。这意味着 a.com 和 sub.a.com 是不同的,但 a.com/page1 和 a.com/page2 共享限制。
- HTTP/1.0 / 1.1:
- Chrome / Edge / Firefox / Safari / Opera: 均为 6 个 TCP 连接。
- IE (旧版本): IE6/7 是 2 个,IE8/9 是 6 个,IE10+ 是 8-13 个(但现在很少考虑 IE 了)。
- HTTP/2 & HTTP/3:
- 浏览器与服务器之间通常只建立 1 个 TCP 连接。
- 通过 多路复用 (Multiplexing) 技术,在这个单一连接中可以并行传输大量的数据流(Streams)。虽然有“最大并发流”的限制(通常服务器设置为 100 或 128),但实际上消除了 HTTP/1.1 那种“6 个请求”的瓶颈。
2. 对 HTML 资源加载的影响 (主要针对 HTTP/1.1)
当 HTML 解析过程中发现大量外部资源(CSS, JS, 图片, 字体)需要加载时,这个“6 个并发”的限制会产生显著的负面影响:
A. 队头阻塞 (Head-of-Line Blocking) - 浏览器端
这是最直接的影响。假设你的页面有 20 张图片需要加载:
- 浏览器会立即发起前 6 张图片的请求。
- 第 7 张到第 20 张图片会被放入等待队列 (Stalled/Queued)。
- 只有当前 6 个请求中的某一个完成并释放连接后,第 7 个请求才会开始发送。
- 结果: 在 Network 面板的瀑布流(Waterfall)中,你会看到资源加载呈现“阶梯状”,而不是所有资源同时开始加载,导致总加载时间变长。
B. 关键渲染路径延迟 (Critical Rendering Path Delay)
虽然现代浏览器有“预加载扫描器 (Preload Scanner)”来提高 CSS 和 JS 的优先级,但如果并发限制被占满,依然会有风险:
- 如果前 6 个请求是体积很大且非关键的资源(例如写在
<head>里的低优先级脚本或大图),那么关键的 CSS 或首屏 JS 可能被迫排队等待,导致页面出现 白屏时间延长 或 样式闪烁 (FOUC)。
C. TCP 慢启动 (Slow Start) 的重复损耗
在 HTTP/1.1 中,为了达到并发效果,浏览器必须建立 6 个独立的 TCP 连接。每一个新连接都要经历 TCP 三次握手和慢启动过程(速度从慢到快),这浪费了网络带宽潜力。
3. 应对策略与解决方案
为了突破这个限制,前端开发历史上演化出了多种方案:
方案一:域名分片 (Domain Sharding) - HTTP/1.1 时代的黑科技
既然限制是针对“同一个域名”的,那就把资源分散到不同域名下。
- 做法: 图片服务器设置为
img1.cdn.com,img2.cdn.com,img3.cdn.com。 - 效果: 如果有 3 个域名,并发数就变成了 6 * 3 = 18 个。
- 缺点: 需要额外的 DNS 解析时间;建立更多 TCP 连接会消耗客户端和服务器资源。
方案二:资源合并 (Bundling / Sprites)
既然请求数量受限,那就减少请求数量。
- CSS/JS: 使用 Webpack/Vite 将多个小文件打包成一个大文件(Bundle)。
- 图片: 使用雪碧图(CSS Sprites)将多张小图标合并成一张大图。
- 缺点: 修改一个小模块需要重新加载整个大文件;缓存失效粒度变大。
方案三:升级到 HTTP/2 (最佳方案)
这是目前的终极解决方案。
- 原理: HTTP/2 使用多路复用。所有请求都在同一个 TCP 连接上并行传输,互不干扰。
- 优势: 彻底解决了浏览器并发限制问题。
- 注意: 在 HTTP/2 下,不要再使用“域名分片”和过度的“资源合并”。因为 HTTP/2 下多域名意味着多 TCP 连接(反而慢),而小文件更有利于缓存。
总结
- 限制: HTTP/1.1 下通常为 6 个。
- 影响: 导致资源排队(阻塞),延长页面加载时间,瀑布流呈阶梯状。
- 解决: 过去靠域名分片和打包,现在主要靠升级 HTTP/2。
右滑查看面试常问