私たちのサーバー環境のネットワーク大惨事のシミュレーションでは、a TCPソケットを意図的にタイムアウトする方法を探しています。既存のソケットに簡単な方法はありますか?また、小さなCテストケースプログラムはプラス。
TCPバッファの読み取り、および切断されたマウントされたリソース(samba)からの読み取り中に、ネットワークインターフェイスをダウンさせることはすでに試みました。
テストサーバーはUbuntu 12.04.4です。
既存の接続をタイムアウトさせるには、iptables
を使用できます。無効にするポートでDROP
ルールを有効にするだけです。したがって、アクティブな接続が確立しているときにSamabaサーバーのタイムアウトをシミュレートするには、サーバーで次のコマンドを実行します。
Sudo iptables -A INPUT -p tcp --dport 445 -j DROP
DROP
ターゲットは、パケットの送信者にRST
パケットまたはICMP
エラーで応答しません。クライアントはサーバーからのパケットの受信を停止し、最終的にタイムアウトします。
iptables
を構成しているかどうか/方法によっては、ルールをINPUT
ルールセットの上位に挿入することもできます。
最初の答えは正しいですが、私はこれらのタイムアウトがどのように機能するかを発見したので、それらを観察してテストできます(ポートをブロックすることを忘れないでください!)。
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つのシナリオがあります。
ソケットが開かれ、送信が試行されます-(反対側からの応答がない場合)、システムはtcp_retries2
回再試行します。デフォルト値のretiresでは、2分以上かかり、ソケットがタイムアウトします。
ソケットが開いていてアイドル状態です-キープアライブの制限は興味深いものです。アイドルソケットシステムではtcp_keepalive_time
秒待機し、その後tcp_keepalive_probes
回試行してTCP KEEPALIVEをtcp_keepalive_intvl
秒間隔で送信します。その後、すべてが失敗すると、ソケットがタイムアウトします。