元の質問
node.js TCP サーバー (ローカルホスト上) に telnet で接続しており、キープアライブ プローブを調査しようとしています。
最初のテストとして、telnet を使用してサーバーに接続し、FIN パケットを送信しない方法で telnet セッションを終了させたいと考えています。(サーバーに、TCP ソケットがまだ「正常」であると認識させます。) 残念ながら、これをテストする賢い方法を見つけることができないようです。
- telnet プロンプトから telnet を終了すると
end
、ノードでソケットのイベントが発生します。明らかに FIN パケットを受信しました。 - I
kill
telnet のプロセスは、プロセスが終了する前に、FIN パケットで接続をきれいに終了します。
FIN パケットを送信せずに telnet を終了する方法を知っていますか (できれば、ネットワーク ケーブルが切断されたり、物理的なネットワーク障害が発生したりする必要はありません)。
改善された質問
localhost / loopback だけを使用してネットワーク障害をシミュレートしたい (実際にインターフェイスやネットワーク ケーブルを切断する必要はありません)。どちらも localhost で、クライアントとサーバー間の TCP 接続を開きたいと考えています。次に、クライアントがなくなったことをサーバーに知らせずに、クライアントを「死ぬ」ようにします。(つまり、FIN パケットを送信しません。)これは、ルーターがダウンした場合など、実際のネットワークで発生する可能性があります。
以下のコメントのおかげで、上記のように、プロセスが終了した (または強制終了された) ときにプロセスが所有する開いているポート/ソケットをカーネルが収集しtelnet
、FIN を送信してプロセスのためにそれらを閉じることを学びました。パケット。そのため、カーネルをだまして既存の接続を閉じないようにする必要があります。
では、どうすればクライアント プロセスを作成し、それを維持しながら、完全にデッドな TCP 接続のように動作させることができるのでしょうか?
スポイラー
- (以下の回答 1: raw ソケット (scapy) を使用し、最初の接続といくつかのテスト データの後にサーバーから送信されたパケットを無視します。(たとえば、一定時間後。))
- (回答2、同僚からのアイデア:
iptables
クライアントとサーバー間のトラフィックを遮断するように構成します。実際のiptables
ルールは下のコメントにあります。)