TCP KeepAlive(ソケットオプションSO_KEEPALIVE
)は、3つのオプション、つまりメカニズムをトリガーする時間、プローブ間隔、接続が中断された後に失敗したと宣言するプローブの数によって制御されます。
デフォルト値は次のとおりです。
- tcp_keepalive_time = 7200
- tcp_keepalive_intvl = 75
- tcp_keepalive_probes = 9
9回のプローブが失敗した後に失敗を宣言したように、1/4分後にプローブを送信するのは合理的に聞こえますが、最初の考えは何でしたか?2時間?
でもTCP(7)説明する
基本的な接続追跡メカニズムとアプリケーションのタイムアウトははるかに短い場合があります。
Keepaliveを有効にする主な目的は、ステートフルネットワーク要素がステータス情報を削除するのを防ぐことです。しかし、これらの要因は数回以内に切断される傾向があります。分。速度が制限された一部のサーバーでは、curl
短い時間が--keepalive-time
ダウンロードの信頼性を大幅に向上させるようです。
それでは、デフォルトがなぜこんなに長いのでしょうか?
答え1
TCP接続の維持は、ファイアウォール(状態保存ファイアウォールやNATはもちろん)の概念がまだ広く普及していないときに定義されました。 ~からRFC 1122(1989年10月):
4.2.3.6 TCP接続の維持
実装者はTCP実装に「接続の維持」を含めることができますが、
この方法が普遍的に許可されるわけではありません
。接続の維持が含まれている場合、アプリケーションは
各TCP接続に対して接続維持を開くか閉じることができ、デフォルトでは閉じるよう
に設定する必要があります。Keep-aliveパケットは、特定の時間間隔内に接続のデータまたは承認パケットが受信されていない場合にのみ
送信する必要があります。この間隔は設定可能で
なければなりません。
デフォルト値は2時間以上でなければなりません。。
[...]
当時の主な考えは、状態情報の損失に関するものではありませんでした。
説明:接続がアイドル状態
のときに送信するデータがない場合でも、「接続の維持」メカニズムは接続のもう一方の端を定期的に調べます。 TCP仕様には、次の理由で
接続保持メカニズムは含まれていません。
(1)短いインターネット中断中に良好な接続を妨げます
。 (2)
不要な帯域幅を消費します(「誰も
接続を使用しないと接続状態が良いか誰が気になりますか?」)
。インターネットアクセスには費用がかかる。
[...]
TCP接続保持メカニズムは、
サーバーアプリケーション内でのみ呼び出す必要があります。そうしないと、ネットワーク障害中にクライアントがクラッシュしたり接続を中断したりすると、サーバーアプリケーションが無期限に中断され、
不要なリソースを消費する可能性があります。
更新されたRFCを見ましたが、接続を維持するための良い言及はありません。