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


20

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

TCPバッファーの読み取り中にネットワークインターフェイスを停止し、マウントされていないリソース(samba)から読み取りを試みました。

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

回答:


19

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

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

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

iptables設定したかどうか/方法に応じて、INPUTルールセットの上位にルールを挿入できます。


netcatを使用して(データをリッスン/送信するために)これを試行し、永遠に待機しました...タイムアウトなし:/そして、データがドロップされたことを確認できます。私も/proc/sys/net/ipv4/tcp_keepalive_time本当に小さな数に変更しました
er453r 14年

@ er453rは、詳細出力を有効にしncat -vて、正確に何ncatが行われているかを確認します。それは私がタイムアウトにインストールバニラのUbuntu 12.04に2m7.291sました
クリーク

正しい-その最初のテストでは、ソケットを介して何も送信しませんでした。私は最終的にタイムアウトをマスターし、それらを以下で詳細に説明しました:)
er453r 14年

16

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

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ます。デフォルト値のリタイアでは、2分以上かかり、ソケットがタイムアウトします。

  2. ソケットが開かれてアイドル状態になっている-キープアライブの制限は興味深いものです。アイドル状態のソケットシステムではtcp_keepalive_time、数秒間待機し、その後tcp_keepalive_probestcp_keepalive_intvl秒単位の間隔でTCP KEEPALIVEを送信しようとします。そして、その後すべてが失敗すると、ソケットはタイムアウトします。


1
また、次を使用してこのタイムアウトを監視できますnetstat -o
er453r 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.