浏览器为什么限制同源并发连接?域名分片在 HTTP/2 下还有用吗?
先理解原理和示例,再练习完整口述与追问。
回答要点
HTTP/1.1 下浏览器对同一主机的并发 TCP 连接有上限(Chrome 常见为 6),以保护服务器、让 TCP 拥塞控制公平运作并节约客户端资源。域名分片能在 HTTP/1.1 下绕过限制,但增加 DNS、TCP、TLS 开销;HTTP/2 多路复用单连接,分片反而破坏复用与优先级,一般应取消。
原理拆解
HTTP/1.1 一个连接同时只能处理一个请求(管线化基本未启用),资源多时只能开多个连接。每个连接都要握手,且各自独立做慢启动和拥塞控制,连接过多会在同一网络路径上相互竞争,对服务器也是负担,因此浏览器设置了每主机上限。
HTTP/2 在一个连接上用多个流并行传输,同源资源共享连接,还能设置优先级;服务器通过 SETTINGS_MAX_CONCURRENT_STREAMS 限制并发流数。把资源分散到多个域名会新增连接,丢失头部压缩上下文。证书和 IP 满足条件时,浏览器可以合并不同域名的连接(connection coalescing),但不应依赖它。
示例与推演
同一页面 60 张商品图走 HTTP/1.1 时,会排成 10 批以上;升级 HTTP/2 后单连接并行下载。仍保留独立静态域名的理由是“无 Cookie 域名”减少请求头,或者把用户上传内容放在隔离域名下以防 XSS 影响主站,而不是为了提升并发。
易错点
不要背固定的总连接数,各浏览器和版本不同;HTTP/2 仍有 TCP 层队头阻塞,丢包严重的网络可考虑 HTTP/3。
参考回答可直接练习口述
HTTP/1.1 一个连接同一时间只处理一个请求,浏览器为了保护服务器、让拥塞控制公平运作,对同一主机的连接数做了限制,Chrome 一般是 6 个。域名分片是 HTTP/1.1 时代绕过限制的办法,代价是多次 DNS 和握手。HTTP/2 单连接多路复用后,分片反而增加连接、破坏优先级和头部压缩,一般应该合并域名;保留独立域名更多是为了无 Cookie 或隔离用户上传内容。