2

トレント ダウンローダーを作成しようとしていますが、トラッカーに連絡する方法を考える必要がありました。Fiddler2 プログラムを使用して、Vuze からそのトラッカーに送信されたトラッカー リクエストをインターセプトしました。

送信されたメッセージ (以下を参照) では、Connection ヘッダーが異なる値で 2 回宣言されています。

これは Connection ヘッダーの正しい使い方ですか? Connection: keep-alive は何をしますか?

GET /announce?info_hash=0Z%22...&azver=3&azas=12576 HTTP/1.1
User-Agent: Azureus 4.7.0.2;Windows 7;Java 1.6.0_31
Connection: close
Accept-Encoding: gzip
Host: tracker.update.vuze.com:6969
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
4

4 に答える 4

3

RFC2616 セクション 4.2 から:

同じフィールド名を持つ複数のメッセージ ヘッダー フィールドは、そのヘッダー フィールドのフィールド値全体がコンマ区切りのリスト [つまり、#(値)] として定義されている場合にのみ、メッセージに存在する場合があります。メッセージのセマンティクスを変更せずに、複数のヘッダー フィールドを 1 つの「フィールド名: フィールド値」のペアに結合できなければなりません。これには、後続の各フィールド値を最初のフィールド値に追加し、それぞれをコンマで区切ります。したがって、同じフィールド名を持つヘッダー フィールドが受信される順序は、結合されたフィールド値の解釈にとって重要であり、したがって、プロキシは、メッセージが転送されるときにこれらのフィールド値の順序を変更してはなりません。

編集:

セクション 14.10 によると、接続はそのようなフィールド名であるため、複数の接続ヘッダーを持つことは技術的に正しいです。

14.10 以降、接続ヘッダーの文法生成はConnection = "Connection" ":" 1#(connection-token)であるため、1 つ以上のコンマ区切りのトークン有効です。

ただし、実際には、2 番目の Connection ヘッダーが無視される可能性があるため、Web サーバーは、応答が送信されると、基礎となる TCP 接続を閉じることを期待します。

HTTP 1.1 の場合、デフォルト モードでは、サーバーは基礎となる TCP 接続を後続のリクエストのために開いたままにしますが、多くのサーバーは接続を閉じる前に行われるリクエストの総数を制限します。

于 2012-07-13T19:43:12.423 に答える
2

HTTP 1.1 では、複数の Connection ヘッダーを使用できます。このような複数のヘッダーのセマンティクスは、すべての値がコンマで結合された単一のヘッダーと同じであると定義されています。

Connection: close
Connection: keep-alive

以下と同じです:

Connection: close,keep-alive

したがって、技術的には、これらのヘッダーは問題ありません。ただし、いくつかの実験を行うことなく、これらのヘッダーのいずれかを無視する多くのサーバー (特に、トレント トラッカーなどの十分にテストされていないサーバー) が存在することを予測します。

さて、より深刻な問題は、「keep-alive」が http 1.0 拡張機能であり、「close」と矛盾していることです。したがって、この組み合わせは単に torrent クライアントのバグだと思います。とにかく、ほとんどのトラッカーは永続的な接続を許可しないと思います。そのため、続行する方法としては、"Connection: close" ヘッダーを 1 つだけにすることをお勧めします。

于 2013-11-18T01:35:22.197 に答える
0

2つの接続ヘッダーフィールドがあるのは奇妙です。このケースの処理はWebサーバーの実装にのみ依存するため、非決定論的な動作しか期待できないと思います。フィールドを格納するハッシュマップの2つ(たとえば)のいずれかで終わる可能性があります。

基本的に、存続するということは、ブラウザがサーバーへの接続を維持し、サーバー上で画像やスクリプトを取得し続けることができることを意味します。通常、これは当てはまりません。通常、Webサーバーへの接続は、要求に応答があった後に閉じられます。

于 2012-07-13T19:36:08.310 に答える
0
Connection: Close

リクエストが完了した後、接続を閉じることを意味します。

Connection: keep-alive

将来の要求のために接続を開いたままにすることを意味します。

Connectionパラメータは1つだけにする必要があります。

したがって、HTTPヘッダーは正しくありません。

于 2012-07-13T19:37:30.193 に答える