基于本文回答
0
评论

浏览器同一个域名下通常限制多少个并发请求?这对 HTML 资源加载有什么影响?

知识点图片

这是一个非常经典的前端性能优化问题。简单直接的回答是:

HTTP/1.1 协议下,现代浏览器(Chrome, Firefox, Safari, Edge)对同一个域名(Domain)的并发请求限制通常是 6 个

但在 HTTP/2HTTP/3 协议下,这个限制的含义发生了根本性的变化(不再受限于 TCP 连接数)。

下面详细分析具体的限制数值、产生的影响以及解决方案。


1. 具体限制数值

浏览器的并发限制是针对 同一域名(Origin) 的。这意味着 a.comsub.a.com 是不同的,但 a.com/page1a.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 张图片需要加载:

  1. 浏览器会立即发起前 6 张图片的请求。
  2. 第 7 张到第 20 张图片会被放入等待队列 (Stalled/Queued)
  3. 只有当前 6 个请求中的某一个完成并释放连接后,第 7 个请求才会开始发送。
  4. 结果: 在 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
右滑查看面试常问