多重化のメリットを話す前にHTTP/1.1の話を先にさせてください。 HTTP/1.1にはHead of Line Blocking という課題があります。
1つのコネクションにおいては、先行するリクエスト・レスポンスが完了しないと、次のリクエストを投げることができません。これはプロトコルの仕様です。
この課題をあらわしたものがこの図です。3つのファイルを1つのコネクションを使ってダウンロードする場合、リクエストとレスポンスを順番に処理してダウンロードを行います。
ここで、なんらかの要因で、先行するリクエストの処理完了が遅れると、それが後続リクエストの開始に響いてきます。
このような問題が HTTPのHead of Line Blockingです。
HTTP/2 では、この Head of line blocking の課題を解決してます。
多重化によって並行してストリームの通信ができるため、1つのリクエストの処理が遅れても、他のリクエストの開始に影響を与えません。
この図でも先ほどと同様に3つのファイルをダウンロードをしているときの状態ですが、1つ目のファイルのリクエストを出した後、後続のファイルに対してのリクエストも発行できることを表現しています。
仮に1つ目のファイルが何らかの要因で多少時間が掛かっても、他のファイルはスムーズに通信を完了することが出来ます。
通信エラーの関連して、今度はパケットロスの話題をあげています。
HTTP/2になってパケットロス率に注意しましょうという話題があります。
これがなぜ重要かというと、 HTTP/2 では1コネクションの中に複数ストリームを束ねて通信を行っています。
そして、 HTTP/2ではTCPを使って動作をしているため、パケットロスの影響が全てのストリームに影響してしまいます。
これは TCP の Head of line blocking という症状です。
この結果として、複数コネクションを使用した HTTP/1.1に速度が劣ってしまうという可能性があります。
残念ながら、HTTP/2 で TCP の Head of Line blocking を回避することはできません。
HTTP/3 が普及して使えるようになるとこれは解決できます。
HTTP/2 までしか使えない状況で、さて、どう対策するかというと、品質のわるい環境では HTTP/1.1にフォールバックする実装を対策としていれるのがよいと考えています。
どの程度のロス率でフォールバックすべきかという点については、各プロジェクト毎に指標が異なるため各プロジェクトで計測して決める必要があります。