web-dev-qa-db-ja.com

HTTPキープアライブ期間とTCPタイムアウト期間の関係

TCP/IPとHTTPタイムアウト値の関係を理解し​​ようとしています。これらの2つのタイムアウト値は異なるか、同じですか?ほとんどのWebサーバーでは、ユーザーはいくつかの構成を通じてHTTPキープアライブタイムアウト値を設定できます。この値はWebサーバーでどのように使用されますか?この値は、基になるTCP/IPソケットに設定されているだけですか?つまり、HTTPキープアライブタイムアウトとTCP/IPキープアライブタイムアウトは同じですか?またはそれらは異なって扱われますか?

私の理解は(多分正しくない)です:Webサーバーは、構成されたHTTPキープアライブタイムアウトに関係なく、基になるTCPソケット(つまり、無期限)のデフォルトタイムアウトを使用し、指定されたHTTPタイムアウト間隔。ワーカースレッドがゼロに達すると、接続が閉じられます。

編集: 2つのタイムアウト期間の関係または違いについての質問です。つまり、HTTPキープアライブタイムアウト期間とWebサーバーが使用するソケット(SO_TIMEOUT)のタイムアウトが異なるとどうなりますか?これら2つが同じかどうかについても心配する必要がありますか?

26
Suresh Kumar

これらは2つの別個のメカニズムです。名前は偶然です。

HTTPキープアライブ(永続的接続とも呼ばれます)はTCPソケットを開いたままにしているため、新しい接続をセットアップせずに別の要求を行うことができます。

TCPキープアライブは、接続がまだ稼働中で機能していることを確認するための定期的なチェックです。これは、NATボックス(DSLルーターなど))が内部と外部のIP /ポート間のマッピングを「忘れない」ことを保証するためによく使用されます。

30
Mark Nottingham

オープンTCPソケットは、実際のデータが送信されていない限り、2者間の通信を一切必要としません(AliceとBobと呼びます)。Aliceが送信したすべてのデータの確認応答を受け取った場合ボブ、以下のケースを区別する方法はありません。

  1. ボブが接続されていないか、そうでなければアリスにアクセスできません。
  2. ボブは再起動されたか、またはアリスと確立した開いているTCPソケットについて忘れられました。
  3. ボブはアリスに接続されており、彼はオープン接続を持っていることを知っていますが、言いたいことは何もありません。

しばらくの間ボブから連絡がなく、上記の状態を区別したい場合、彼女は最後のバイトのデータを再送信して、適切なTCPフレームに包んで再送信として認識されます。本質的には確認応答を聞いていないふりをします。ボブが接続されていない場合、何秒間も繰り返しパケットを送信しても、何も返答はありません。ボブが再起動するか接続を忘れた場合は、すぐに応答します。接続が無効です。ボブが接続に満足していて、何も言うことがない場合、ボブは再送信の確認応答を返します。

タイムアウトは、アリスが応答を要求するパケットを送信したときに、アリスが応答を待つ用意がある時間を示します。キープアライブ時間は、データの最後のビットを再送信して確認応答を要求する前に、彼女が経過する必要がある時間を示します。ボブが行方不明になった場合、キープアライブとタイムアウトの値の合計は、アリスがデータの最後のビットを受信して​​からボブが死んでいると判断するまでの最悪の時間を示します。

30
supercat

KeepAliveTimeoutディレクティブ

説明:サーバーが永続的な接続で後続のリクエストを待機する時間構文:KeepAliveTimeout secondsデフォルト:KeepAliveTimeout 15コンテキスト:サーバー構成、仮想ホストステータス:コアモジュール:コアApacheが次のリクエストを待機してから閉じるまでの秒数接続。リクエストが受信されると、Timeoutディレクティブで指定されたタイムアウト値が適用されます。

KeepAliveTimeoutを高い値に設定すると、負荷の高いサーバーでパフォーマンスの問題が発生する可能性があります。タイムアウトが大きいほど、アイドル状態のクライアントとの接続を待機しているサーバープロセスの数が多くなります。

名前ベースの仮想ホストのコンテキストでは、NameVirtualHostのセットで最初に定義された仮想ホスト(デフォルトのホスト)の値が使用されます。他の値は無視されます。

TimeOutディレクティブ

説明:サーバーが特定のイベントを待機してからリクエストが失敗するまでの時間構文:TimeOut秒デフォルト:TimeOut 300コンテキスト:サーバー構成、仮想ホストステータス:コアモジュール:コアTimeOutディレクティブは現在Apacheが待機する時間を定義しています三つの事:

GETリクエストの受信にかかる合計時間。 TCPまたはPUT要求でのPOSTパケットの受信間の時間。応答でのTCPパケットの送信のACK間の時間。今後は、これらを個別に構成可能にする予定です。タイマーは1.2の前はデフォルトで1200に設定されていましたが、300に引き下げられました。パケットが送信されたときにタイマーがリセットされないコードの奇妙な場所がまだある可能性があるため、デフォルトではこれより低く設定されていません。

4
byheart