web-dev-qa-db-ja.com

TCPソケットをタイムアウトにする方法

私たちのサーバー環境のネットワーク大惨事のシミュレーションでは、a TCPソケットを意図的にタイムアウトする方法を探しています。既存のソケットに簡単な方法はありますか?また、小さなCテストケースプログラムはプラス。

TCPバッファの読み取り、および切断されたマウントされたリソース(samba)からの読み取り中に、ネットワークインターフェイスをダウンさせることはすでに試みました。

テストサーバーはUbuntu 12.04.4です。

21
er453r

既存の接続をタイムアウトさせるには、iptablesを使用できます。無効にするポートでDROPルールを有効にするだけです。したがって、アクティブな接続が確立しているときにSamabaサーバーのタイムアウトをシミュレートするには、サーバーで次のコマンドを実行します。

Sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROPターゲットは、パケットの送信者にRSTパケットまたはICMPエラーで応答しません。クライアントはサーバーからのパケットの受信を停止し、最終的にタイムアウトします。

iptablesを構成しているかどうか/方法によっては、ルールをINPUTルールセットの上位に挿入することもできます。

20
Creek

最初の答えは正しいですが、私はこれらのタイムアウトがどのように機能するかを発見したので、それらを観察してテストできます(ポートをブロックすることを忘れないでください!)。

TCPタイムアウトを処理する最も興味深い4つのカーネルパラメータがあります。

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

現在、2つのシナリオがあります。

  1. ソケットが開かれ、送信が試行されます-(反対側からの応答がない場合)、システムはtcp_retries2回再試行します。デフォルト値のretiresでは、2分以上かかり、ソケットがタイムアウトします。

  2. ソケットが開いていてアイドル状態です-キープアライブの制限は興味深いものです。アイドルソケットシステムではtcp_keepalive_time秒待機し、その後tcp_keepalive_probes回試行してTCP KEEPALIVEをtcp_keepalive_intvl秒間隔で送信します。その後、すべてが失敗すると、ソケットがタイムアウトします。

18
er453r