TCPソケットタイムアウト方法

TCPソケットタイムアウト方法

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

TCPバッファを読み取って接続が切断されたインストールリソース(Samba)から読み取っている間にネットワークインターフェイスを閉じようとしました。

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

答え1

既存の接続がタイムアウトするようにするには、を使用できますiptablesDROP無効にするポートでルールを有効にするだけです。したがって、アクティブ接続が確立されたときに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つの状況があります。

  1. ソケットが開き、転送が試みられます。その後(相手が応答しない場合)、システムはtcp_retries2何度も再試行します。デフォルトの「retires」を使用すると、2分以上かかり、ソケットがタイムアウトします。

  2. ソケットが開いていてアイドル状態です。これにより、接続維持制限が興味深くなります。アイドルソケットの場合、システムは数秒間隔でTCP KEEPALIVEを送信するtcp_keepalive_time前に数秒待ちます。すべてのエラーが発生した後にのみソケットがタイムアウトします。tcp_keepalive_probestcp_keepalive_intvl

関連情報