TL;DR

Head-of-Line Blocking の略。列の先頭のデータが遅れたり失われたりすると、それに関係のない後ろのデータまで処理できずに待たされる現象。HTTP では、HTTP/1.1 のパイプライン化や、TCP 上の HTTP/2 で問題になった。

仕組み

HTTP/1.1 のパイプライン化

HTTP/1.1 のパイプライン化では、サーバはリクエストを受けた順にレスポンスを返す必要がある。そのため、1 つのレスポンスが遅れたり失われたりすると、それ以降のレスポンスも使えなくなる。HTTP/1.1 には多重化の仕組みがないので、並行してリクエストを送るには複数の TCP 接続を使うことが多い。

TCP 上の HTTP/2

HTTP/2 は 1 つの TCP 接続の上で複数のストリームを多重化する。しかし RFC 9114 によると、この多重化は TCP の損失回復の仕組みからは見えない。そのため、パケットが 1 つ失われたり順番が入れ替わったりすると、そのパケットに関係のないものも含め、すべての通信が止まる。

HTTP/3 と QUIC

HTTP/3 が使う QUIC は、ストリームの多重化とストリームごとのフロー制御を持つ。信頼性をストリームごとに、輻輳制御を接続全体で提供することで、HTTP の性能を改善している。

関連

出典