1

Nettyフレームワークを使用してJavaで全二重接続をシミュレートするために、Webブラウザーで採用されているものと同様の手法を使用してHTTPトンネルを実装しようとしています。実世界のHTTPプロキシが存在する場合に機能するようにこれを実装したいと思います。ライブラリの依存関係に関する不要なオーバーヘッドを回避し、サーブレットAPIが全二重httpトンネルの使用パターンに適合しないため、サーブレットコンテナを使用せずにこれを実行しようとしています。

HTTPプロキシがHTTPプロトコルの潜在的な使用法を「破る」ことを課すいくつかの制限を知っています。

  1. HTTPパイプラインは、クライアントとプロキシ間の接続を超えて尊重されない場合があります。つまり、クライアントが複数のパイプライン要求をプロキシにディスパッチした場合でも、プロキシは単一の要求を送信し、応答を待ってから次の要求を送信する場合があります。
  2. チャンクされたエンコーディングは、同様の方法でプロキシ間の接続を超えて尊重されない場合があります。サーバーは応答をチャンクで送り返しますが、プロキシは終了チャンクを待ってから、完全なデチャンクされた応答をクライアントにディスパッチします。
  3. HTTP CONNECTは、SSL / TLSポート、通常はポート443でのみ許可されることが多いため、これを、外部への無制限のTCP接続を取得するための卑劣な方法として使用することはできません。

ただし、私が確信していないもう1つの可能性があります。実際のHTTPプロキシは、複数のクライアント間でサーバーへの永続的な接続も共有しますか?例えば:

  • クライアントAは、要求A1、A2、およびA3をサーバーXに送信します
  • クライアントBはリクエストB1とB2をサーバーXに送信します
  • クライアントCは、要求C1、C2、およびC3をサーバーXに送信します

次に、プロキシはサーバーXへの単一の接続を開き、次の順序でメッセージを送信する可能性がありますか。

A1、A2、B1、C1、B2、A3、C2、C3

または、個々のクライアントからの順序を保持するが、潜在的にインターリーブされる同様の順序?さらに悪いことに、プロキシがサーバーへの複数の接続を開き、接続間で各クライアントからのメッセージを分散させる可能性があります。

Connection 1: A1, C1, C2, C3
Connection 2: B1, B2, A2, A3

その場合、これらのメッセージをトンネルごとに異なるキューに逆多重化する必要があり、特定のクライアントに使用されている接続を識別することに単純に依存することはできないため、私のアプローチにはさらに検討が必要です。

一般的に使用されるHTTPプロキシとステートフルインスペクティングファイアウォールの癖を説明する優れたリソースを知っている人はいますか?

4

2 に答える 2

1

HTTP 1.1仕様には、この段落が8.1.4実用的な考慮事項として含まれています。

持続的接続を使用するクライアントは、特定のサーバーに対して維持する同時接続の数を制限する必要があります(SHOULD)。シングルユーザークライアントは、サーバーまたはプロキシとの接続を2つ以上維持するべきではありません(SHOULDNOT)。プロキシは、別のサーバーまたはプロキシへの最大2 * Nの接続を使用する必要があります。ここで、Nは同時にアクティブなユーザーの数です。これらのガイドラインは、HTTP応答時間を改善し、輻輳を回避することを目的としています。

ただし、実際のプロキシ実装がこの要件で何をするのかはわかりません。

有用なリンクだけであっても、キャッシングチュートリアルで何かを見つけるかもしれません。最終的なアクションは、Mark Nottingham(mnot@pobox.com)にメールを送信することかもしれません。彼が知らなければ、誰も知りません。

于 2009-08-10T14:53:52.000 に答える
0

クライアントのキープアライブ設定に関係なく、NetScalerがサーバーとの間でキープアライブを使用するように構成できることを私は知っています。

于 2009-08-11T02:28:56.373 に答える