まず、いくつかの修正。
トークンh2c
は、平文の HTTP/2 を参照します (したがって のc
) h2c
。2 番目の箇条書きでは、ほとんどの Web サイトで使用されていると述べていますが、実際にはほとんど使用されていません。ブラウザーが実装していないためです。Web サイトの大多数はh2
.
トークンh2
は、暗号化されたh2c
、または同等h2c
の TLS を参照します。
クライアントとサーバーが話すためにネゴシエートするとき、クライアントh2
が送信するバイトは暗号化され、サーバーまでずっと暗号化されて移動します。これは、仲介者がトラフィックを復号化する機会がないことを意味します (ありがとうございます)。
この場合、HTTP/2 仕様で参照される「ホップ」は、クライアントとサーバーの間のネットワーク セグメント全体です。
ただし、HTTP/2 仕様は汎用的である必要があり、HTTP/2 などのワイヤ プロトコルを定義するときにブラウザーと Web サーバーがどのように対話するかについて心配する必要はありません。
server1
クライアントが を使用して HTTP/2 リクエストを実行し、リクエストを満たすために を呼び出す必要がある状況を想像してくださいh2
。server1
今回server2
は を使用しh2c
ます。たとえば、server1
いくつかのロジックに応じて「正しい」バックエンド サーバーに要求を転送するフロントエンドの「プロキシ」である可能性があります。
この場合、client-server1 と server1-server2 の 2 つのホップがあります。
各ホップは独自のフロー制御を適用します。
たとえば、クライアントが大きなファイルをサーバーにアップロードするとします。通常、クライアント フロー制御の送信ウィンドウは小さく、たとえばデフォルトの 65535 オクテットです。クライアントは、アップロードを停止する前に最大 65535 オクテットしか送信できません。
これらの 65535 オクテットは によって受信されserver1
ます。server1
と通信するために、 がクライアントになりますserver2
。server1
のクライアントが と通信するときに、はるかに小さいフロー制御ウィンドウ、たとえば 16384 オクテットで構成されているとしますserver2
。
この例でserver1
は、アップロードを 16384 オクテット後に停止し、残りの 65535 ~ 16384 オクテットを維持して、アップロードされたデータが消費されたことを (WINDOW_UPDATE フレーム経由で) 通知するのをserver2
待つ必要があります。server2
server1
のクライアントが から WINDOW_UPDATE を受信するとserver2
、さらにデータを に送信できますserver2
。また、クライアントに WINDOW_UPDATE を送信するか (クライアントとのフロー制御ウィンドウに16384 オクテットを追加する余地があるため)、もう少し待つかどうかを決定する必要があります。たとえば、別の 16384 オクテットをに送信しserver2
、 から 2 番目の WINDOW_UPDATE を受信したときにのみserver2
、クライアントに WINDOW_UPDATE を送信することを決定できます (16384 + 16384 オクテットの更新を含む)。
上記の例からわかるように、クライアント と の間のフロー制御は、 と の間のフロー制御に関連server1
していますが、独立しています。server1
server2
フロー制御戦略の実装に関する議論については、この回答を読むこともできます。