队头阻塞
在计算机网络中,队头阻塞(HOL blocking)是指当数据包队列中的第一个数据包受阻时,即使队列中其他数据包可以被处理,也会导致性能瓶颈。
在 HTTP/1.1 中,单个 TCP 连接上的请求通常是按顺序发送的——当等待对上一个请求的响应时,不能在该连接上发出新请求。这可能会导致 HOL 阻塞问题,即使客户端和服务器之间有多个 TCP 连接也是如此。
HTTP/1.1 定义了一个可选功能,称为 HTTP 流水线,它试图通过允许在不等待早期响应的情况下发送请求来解决 HOL 阻塞,但未能成功。不幸的是,HTTP/1.1 的设计意味着响应必须以与收到请求相同的顺序返回,因此如果请求需要很长时间才能完成,仍然可能发生 HOL 阻塞。网络状况,如拥塞、数据包丢失(以及由此导致的 TCP 重传)或 TCP 慢启动,也可能延迟传输并导致后续响应被早期响应阻塞。
HTTP/2 通过引入请求和响应的多路复用来减少应用层面的 HOL 阻塞。通过此功能,多个请求和响应可以通过单个 TCP 连接交错进行,使用独立的编号流,并且流优先级有助于服务器决定首先发送哪些流。传输层的数据包丢失仍然可能导致跨流的 HOL 阻塞,因为 HTTP/2 运行在 TCP 之上——丢失的 TCP 段会阻塞该连接上承载的所有流,直到丢失的数据被重传。
HTTP/3 通过在 UDP 上使用 QUIC 消除了传输层队头阻塞,因此 HTTP 上的 HOL 问题不再存在。QUIC 提供了多个独立流,每个流都有自己的丢失恢复机制,因此数据包丢失只会影响发生丢失的流,而不是整个连接。这消除了 TCP 级别的 HOL 问题。
另见
- 相关词汇表术语
- 填充页面:浏览器如何工作
- 维基百科上的队头阻塞