8

JavaでWebサーバーを作成していますが、HTTP1.1キープアライブ接続をサポートしたいと考えています。しかし、クライアントが特定の接続に対する要求の送信を完了したことをどのように知ることができますか?(二重の行末など)。

stackoverflowがこの非常にあいまいな質問をどのように処理するかを見てみましょう。Googleでは、その答えは技術仕様とあいまいな言葉に紛れ込んでいます。私は非Cプログラマーのためのわかりやすい英語の答えが欲しいです:)


そうか。これは、SocketTimeoutExceptionに依存する必要があるという私の疑いを裏付けています。しかし、タイムアウトを待つのではなく、接続が完了したことを示すクライアントから信頼できるものがあるかどうかはわかりませんでした。これにより、ほとんどの場合、接続をより早く閉じることができます。ありがとう

4

4 に答える 4

8

基準を満たすようにサーバーを構築している場合は、ここですでにガイドとなる多くの情報があります。

簡単に言えば、接続が使用されてからの時間に基づく必要があり、要求データのレベルではそれほど多くありません。

長い意味で、HTTP / 1.1ドキュメントの実用的な考慮事項のセクションには、次のガイダンスがあります。

「通常、サーバーにはタイムアウト値があり、それを超えると非アクティブな接続が維持されなくなります。クライアントが同じサーバーを介してより多くの接続を確立する可能性があるため、プロキシサーバーはこれをより高い値にする可能性があります。永続的な使用接続では、クライアントまたはサーバーのいずれについても、このタイムアウトの長さ(または存在)に要件はありません。」

また

「クライアントまたはサーバーがタイムアウトを希望する場合は、トランスポート接続で正常なクローズを発行する必要があります。クライアントとサーバーの両方が、トランスポートのもう一方のクローズを常に監視し、必要に応じて応答する必要があります。クライアントまたはサーバーの場合相手側のクローズをすぐに検出しないため、ネットワーク上で不要なリソースの浪費が発生する可能性があります。」

于 2008-09-26T17:52:38.607 に答える
3

stackoverflow がこの非常にあいまいな質問をどのように処理するかを見てみましょう。その答えは、Google では、技術仕様とあいまいな言葉に埋もれています。

HTTP 1.1接続を閉じる必要があるのはいつですか? 3 番目のヒットは HTTP Made Really Easy でした。目次には、Persistent Connections というタイトルのセクションと「Connection: close」ヘッダーへのリンクがあります。このセクションは 3 段落の長さで、非常に単純な言葉を使用し、知りたいことを正確に伝えます。

非Cプログラマー向けのわかりやすい英語の回答が必要です:)

当然のことながら、プログラミングは細部が非常に重要な技術的な取り組みです。技術文書を読むことは、絶対に不可欠なスキルです。仕様の「平易な英語」のサードパーティの解釈に依存しても、うまくいかないだけです。

于 2008-09-26T18:13:17.077 に答える
1

いつでも閉じます。ヘッダーは、クライアントが接続を開いたままにすることを望んでいるが、サーバーが従う必要はないことを示しています。ほとんどのサーバーは約 5 ~ 10 秒間開いたままにしますが、まったく注意を払わないサーバーもあります。

于 2008-09-26T17:33:14.877 に答える
1

Keep-Alive 機能を扱う RFC を読む必要があります。そうしないと、期待どおりに機能しないサーバーになってしまう可能性があります。

@[Stephen] がすでに指摘しているように、サーバーはいつでも自由に接続を閉じることができます (ただし、要求/応答のペアの途中ではありません)。クライアントについても同様です。他のソリューションでは、サーバーまたはクライアントが相手に対して DoS を実行できます。

編集:接続ヘッダーを見てください。クライアント (およびサーバー) は、ヘッダーを使用して適切な接続閉鎖を要求できます。たとえばConnection: close、リクエスト内には、サーバーがレスポンスを送信した後に接続を閉じるようにというサーバーへのリクエストがあります。

于 2008-09-26T17:43:25.337 に答える