凌云的博客

行胜于言

什么是 Head-of-line blocking

分类:network| 发布时间:2025-01-01 15:44:00

概述

在计算机网络中,队头阻塞(Head-of-line blocking,简称 HOL 阻塞)是一种限制性能的现象,指的是数据包队列中的第一个数据包被阻塞,导致后续数据包无法被及时处理。 这种情况可能发生在 乱序传输的场景下,以及 HTTP 管道化(HTTP pipelining) 中处理多个请求时。

乱序传输

当按顺序排列的数据包以无序方式到达时,就会发生无序传送。 这可能是由于数据包采用不同的路径,或数据包被丢弃并重新发送而发生的。 HOL 阻塞会显著增加数据包重新排序。

TCP 下的队头阻塞

  • 在 TCP 连接中,数据以 数据包(Packet)或 段(Segment)的形式发送。每个数据包都有一个顺序号,以确保接收方能够按照正确的顺序重新组装这些数据。
  • 如果某个数据包在传输过程中丢失或延迟,TCP 协议要求接收方等待该丢失的包重新传输或恢复。 由于 TCP 是 面向连接的可靠协议,它会保证数据按顺序交付,因此,接收方必须按照顺序处理所有数据包。
  • 这种顺序要求导致的问题就是,如果队列中的第一个数据包丢失(或者延迟),即使后面的数据包没有问题,接收方也不能立即处理它们,必须等到丢失的那个数据包被恢复后,后续的数据才能继续被接收和处理。

HTTP 下的队头阻塞

HTTP/1.1 中的一种 队头阻塞形式是浏览器中允许的并行请求数已用完,后续请求需要等待前一个请求完成。

HTTP/2 通过请求多路复用解决了这个问题,它消除了应用层的 HOL 阻塞,但传输 (TCP) 层仍然存在 HOL。

HTTP/3 是基于 QUIC/UDP 实现的协议,具有更灵活的流控制机制,不会因为一个流的丢包而影响其他流的数据传输,从而避免了 TCP 中的队头阻塞问题。

参考

Head-of-line blocking