连载中 10/20

队头阻塞:从排队打饭到 HTTP/2 的死角

2026-10-05 · 13 阅读 · 0 评论 · 0 赞

什么是队头阻塞

食堂只有一个窗口,第一个人点了十斤米饭,后面所有人干等——哪怕他们只要一碗汤。HTTP/1.1 的 keepalive 连接就是这样:请求按序发送、响应按序返回,前面任何一个慢了(大图、慢接口),同连接上后面的小请求全部被堵。队头阻塞的要害不是平均速度,是尾延迟——关键接口被无关大响应连坐,P99 直接爆表。

第一代解法:多开窗口

既然一条队堵,就多排几条队——浏览器对同一域名并发开 6 条 TCP 连接。官方管道化(pipelining,一条连接上连发多个请求)因为响应必须严格按序,快的人必须等慢的人,从未被浏览器启用。6 条不够?行业发明了域名分片:把静态资源散到 img.example.com、static.example.com……骗浏览器开更多连接。这套魔改一时爽,代价是:每条连接重新握手慢启动、TLS 多份、缓存分家,后来 HTTP/2 时代成了反模式——连接越少越好。

HTTP/2:应用层的队头治好了

HTTP/2 把报文拆成二进制帧,一条连接上多个 stream(流)交错传输,每个 stream 独立:慢响应的帧晚点到,不影响别的 stream 的帧先到。应用层排队没了,六连接上限、域名分片一并扫进历史。细节下一篇展开。

但是:TCP 层还有一个

一条 HTTP/2 连接 = 一条 TCP 连接

TCP 只认字节流,不认 stream:
  第 5 号包丢了 → 第 6、7、8 号包即使先到也得在内核里干等
  ——它们可能分属 stream A、B、C
  三个 stream 一起被一个丢包拖累

所有请求挤一条 TCP 连接后,
丢包的影响面反而比 HTTP/1.1 的 6 条连接更大:
  丢包率 2%、RTT 100ms 时,HTTP/2 可能比 6 连接的 HTTP/1.1 更慢

这就是传输层队头阻塞:TCP 的可靠交付语义(按序、不丢)和应用的多路复用诉求天然打架。治本方案只有换掉 TCP——那是 QUIC 和 HTTP/3 的故事(第十九篇)。

各代方案对比

方案应用层队头传输层队头副作用
HTTP/1.1 串行有基本无(一条一请求)吞吐差
多连接/域名分片稀释稀释握手多、慢启动重复
HTTP/2消除存在且放大单连接丢包连坐
HTTP/3 (QUIC)消除消除UDP 部署门槛

下一篇正式进入 HTTP/2:二进制分帧、多路复用、头部压缩 HPACK——它解决了什么,又留下了什么。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#队头阻塞#HTTP1.1#域名分片#HTTP2#TCP队头

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10114 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9877 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9307 阅读 · 21 评论 · 287 赞