HTTP 1.1キープアライブ接続を閉じる時期を知るにはどうすればよいですか?
-
02-07-2019 - |
質問
私はJavaでWebサーバーを書いていますが、HTTP 1.1キープアライブ接続をサポートしたいです。しかし、クライアントが特定の接続に対するリクエストの送信を完了したことをどのように確認できますか? (二重の行末など)。
stackoverflowがどのようにこの非常にあいまいな質問を処理するのかを見てみましょう。Googleでの回答は、技術仕様とあいまいな言語に埋もれています。 C以外のプログラマー向けにわかりやすい英語の回答が必要です:)
なるほど。これは、SocketTimeoutExceptionに依存する必要があるという私の疑念を裏付けています。しかし、タイムアウトを待つのではなく、接続が完了したことを示すクライアントから信頼できるものがあるかどうかはわかりませんでした-これにより、ほとんどの場合、接続をより早く閉じることができます。ありがとう
解決
標準を満たすためにサーバーを構築している場合、ここであなたをガイドする多くの情報をすでに持っています。
簡単に言えば、接続が使用されてからの時間に基づいている必要があり、リクエストデータのレベルではありません。
長めの方法で、実用的な考慮事項セクション< HTTP / 1.1ドキュメントの/ a>にはいくつかのガイダンスがあります:
&quot;サーバーには通常、 タイムアウト値 非アクティブを維持しなくなりました 接続。プロキシサーバーは 可能性が高いため、これはより高い値です クライアントがより多くを作ること 同じサーバーを介した接続。 持続的接続の使用 長さに要件はありません このタイムアウトの(または存在) クライアントまたはサーバーのいずれか。&quot;
または
&quot;クライアントまたはサーバーが希望する場合 タイムアウトは優雅に発行する必要があります トランスポート接続を閉じます。 クライアントとサーバーは両方とも 常に反対側を監視する トランスポートを閉じて、それに応答します 適切に。クライアントまたはサーバー 反対側の接近を検出しません すぐにそれは不必要になる可能性があります ネットワーク上のリソース消費。&quot;
他のヒント
stackoverflowがどのようにこの非常にあいまいな質問を処理するかを確認します。Googleでの答えは、技術仕様とあいまいな言語に埋もれています。
HTTP 1.1接続をいつGoogleに閉じる必要がありますか、3番目のヒットはHTTP Made Really Easyでした。目次には、永続的な接続と&quotというタイトルのセクションへのリンクがあります。 ;接続:閉じる&quot;ヘッダー。このセクションは3段落の長さで、非常に単純な言語を使用し、知りたいことを正確に示します。
C以外のプログラマ向けのわかりやすい英語の回答が必要です:)
すべての敬意を払って、プログラミングは技術的な取り組みであり、細部が非常に重要です。技術文書を読むことは、絶対に不可欠なスキルです。 「平易な英語」に頼るサードパーティの仕様の解釈は、あなたが悪い仕事をすることになるだけです。
いつでも好きなときに閉じます。ヘッダーは、クライアントが接続を開いたままにしておくことを好むことを示しますが、それはサーバーが準拠することを必要としません。ほとんどのサーバーは約5〜10秒間開いたままにしますが、一部のサーバーはまったく注意を払っていません。
キープアライブ機能を扱うRFCを読んでください。そうしないと、期待どおりに動作しないサーバーになってしまう可能性があります。
@ [Stephen]がすでに指摘したように、サーバーはいつでも接続を自由に閉じることができます(ただし、要求/応答のペアの途中ではありません)。クライアントにも同じ。他のソリューションでは、サーバーまたはクライアントが相手に対してDoSを実行できます。
編集:接続ヘッダーをご覧ください。クライアント(およびサーバー)は、ヘッダーを使用して適切な接続の終了を要求できます。たとえば、リクエスト内の Connection:close
は、サーバーがレスポンスを送信した後に接続を閉じるリクエストです。