30

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

私の理解は (間違っているかもしれません): Web サーバーは、構成された HTTP Keep Alive タイムアウトに関係なく、基になる TCP ソケットで既定のタイムアウト (つまり、無期限) を使用し、指定された HTTP タイムアウト間隔をカウントダウンするワーカー スレッドを作成します。ワーカー スレッドがゼロになると、接続が閉じられます。

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

4

3 に答える 3

34

開いている TCP ソケットは、実際のデータが送信されていない限り、2 つの当事者 (アリスとボブと呼びましょう) 間の通信をまったく必要としません。Alice が Bob に送信したすべてのデータの受信確認を受け取った場合、次のケースを区別する方法はありません。

  1. Bob はプラグが抜かれているか、Alice からアクセスできません。
  2. Bob は再起動されたか、Alice との間で確立した開いている TCP ソケットを忘れています。
  3. Bob は Alice に接続されており、開いている接続があることを知っていますが、言いたいことは何もありません。

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

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

于 2011-01-21T23:50:40.097 に答える
32

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

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

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

于 2010-04-30T06:37:27.940 に答える
4

KeepAliveTimeoutディレクティブ

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

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

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

タイムアウトディレクティブ

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

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

于 2011-02-24T07:02:29.790 に答える