2016-11-26 1 views
0

キープアライブ接続をサポートするマルチスレッドプロキシサーバーで現在作業中です。私はいくつかの奇妙な問題は、Firefoxブラウザからの要求を処理中に参照してください。 localhost:10001/http://urlを使用してローカルプロキシに接続し、このホスト上のすべてのリンクにアクセスできます。プロセスは以下の通りです。 1.ポート10001にバインドするソケットを作成します。 2.接続を受け入れ、クライアントが接続している場合は、fork() 3.クライアント要求を固定接続として処理し続けます。HTTPプロキシサーバーキープアライブ接続のサポート

ここで問題は、localhost:10001/http://url2を使用して別のホストで2番目のURLにアクセスするためにfirefoxで新しいタブを開くと、最初の接続時に作成されたクライアントソケット接続に要求が送られるということです。私は当初は自分のコードに起因するかもしれないと思っていましたが、私はtelnetを使って同じことをしようとしましたが、すべての新しい接続は別のプロセスを作成します。 Firefoxのブラウザでこれを行うようにする特定の設定はありますか?

答えて

1

HTTPキープアライブは、常に新しいTCP接続を作成するオーバーヘッドをスキップできるように、複数の要求に対して基本となるTCP接続を再利用する方法です。あなたのケースでは、接続のターゲットが常に同じであるため、ブラウザが同じTCP接続を再利用することは理にかなっています。 telnetとの比較には欠陥があります。なぜなら、telnetを使うと常に新しいTCP接続を行うからです。

HTTPキープアライブが使用される場合、HTTPヘッダーとサーバーとクライアントの両方の動作にHTTPバージョンで指定されます。要求が行われた後はいつでも、サーバとクライアントの両方がアイドル接続を閉じることを決定することができます。つまり、要求の完了後にサーバとクライアントを開いたままにする必要はありません。さらに、Connection: keep-alive HTTPヘッダーを使用して接続を開いたり、要求後に閉じるためにConnection: closeを使用して接続を希望することを知らせることもできます。これらのヘッダーは、HTTPバージョンに応じてデフォルト値を持ちます。つまり、明示的に指定されていない限り、HTTP/1.0でオフのままキープアライブがHTTP/1.1でオンです。

http://proxy/real-urlのようなURLを使用して実装している「プロキシ」は、実際のHTTPプロキシではありません。実際のHTTPプロキシはブラウザ内でプロキシとして構成され、使用するURLはそのままで、プロキシでURL書き換えを行う必要がないということも意味します。さらに、プロキシの考え方は、同じオリジン内のすべてのホスト(つまり、オリジンはプロキシ)を効果的にマージし、ブラウザの主要なセキュリティコンセプトであるsame-origin policyを効果的に無効にします。これは、いくつかの不正な広告サーバがeBayであなたの実装に起源を共有するので、感謝をeBayのクッキーへのアクセスを取得し、セッションをハイジャックし、個人情報の盗難

+0

のためにそれを誤用できることを例えば意味します。しかし、私のプロキシは同時に複数の接続を提供する必要があります。 1つのリクエストに対してHTTP/1.1キープアライブを使用していますが、まだ処理されていますが、今でも永続的な新しいリクエストをサポートしたいと考えています。ブラウザが既存のTCP接続を使用して新しいTCP接続を作成するのを防ぐ方法がありますか? –

+0

@Embed_Programmer:ブラウザは通常、既存の接続がアイドル状態の場合にのみ再利用します。完了しました。それ以外の場合は、新しい接続を開くか、既存の接続がアイドルになるのを待ちます。既存のリクエストが実行されていないと思われるときにブラウザが新しいリクエストを送信していると思われる場合は、リクエストの終了を判断するためのコードが間違っている可能性があります。また、ブラウザがHTTPパイプライニングを使用しているため、同じ接続上の複数の要求を同時に開くことができます。これを回避するには、HTTP/1.0の応答のみを送信します。 –

+0

ありがとうございました。あなたは正しく私のURLを使用してプロキシの使用は間違っていた。私は今ブラウザの中でプロキシを設定し、私を悩ましていたいくつかのエラーは修正されました。ご協力いただきありがとうございます –

0

HTTP persistent connectionは、宛先だけでなく、プロキシでも使用されます。

firefoxの場合は、network.http.proxy.version1.0に設定して、プロキシの動作を変更できます。しかし、これらの再利用された接続を処理できるようにするには、プロキシを強化する必要があります(おそらく内部動作を完全に再考する必要があります)。私はそれがFirefoxに限られていないと確信しています。

また、プロキシがHTTP/1.1で応答しないようにしてください。