
私たちのサーバー環境のネットワーク災害シミュレーションのためにTCPソケットを意図的にタイムアウトする方法を探しています。既存のソケットを簡単に使用する方法はありますか?また、小さなCテストケースプログラムが利点になります。
TCPバッファを読み取って接続が切断されたインストールリソース(Samba)から読み取っている間にネットワークインターフェイスを閉じようとしました。
テストサーバーはUbuntu 12.04.4です。
答え1
既存の接続がタイムアウトするようにするには、を使用できますiptables
。DROP
無効にするポートでルールを有効にするだけです。したがって、アクティブ接続が確立されたときにSamabaサーバーのタイムアウトをシミュレートするには、サーバーで次のコマンドを実行します。
sudo iptables -A INPUT -p tcp --dport 445 -j DROP
宛先は、DROP
パケットの送信者にRST
パケットやエラーで応答しません。ICMP
クライアントはサーバーからのパケットの受信を中断し、最終的にタイムアウトします。
設定するかどうかによって、ルールセットの親にiptables
ルールを挿入できます。INPUT
答え2
最初の答えは正確ですが、これらのタイムアウトがどのように機能するかを調べたので、これを観察してテストできます(ポートをブロックするのを忘れないでください!)。
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を送信する
tcp_keepalive_time
前に数秒待ちます。すべてのエラーが発生した後にのみソケットがタイムアウトします。tcp_keepalive_probes
tcp_keepalive_intvl