- 締切済み
TCPのコネクションを切断する方法
FTPのように、制御と転送の2つのポートを利用し、送信元リモートホストごとにforkして対応するTCPサーバプログラムを利用しています。 ここで、OS側から、制御ポート(ログイン等)のコネクションは切断しないで、転送ポートのコネクションだけを切断したいと思うのですが、可能でしょうか。 1つのプロセスが、1つのホストとの制御、転送、両方のコネクションを担当するので、プロセスをkillするわけにはいきません。 Macでは、IPNetMonitorというGUIアプリケーションで、TCPコネクションごとの切断ができるので、Linuxでも可能ではないかと思うのですが... 環境は、redhat7.3です。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- osamuy
- ベストアンサー率42% (1231/2878)
iptableにルールを追加して、パケットを拒否するようにするとか。 切断するわけでないので、一生待ちという事態になるかもしれませんが。 カーネルレベルでの強制切断ってのは、危ないのではないかと。 下手にこれができると、迷子のパケットが到達した時に、通信に混乱が生じる恐れがありそうな。 やはりプログラムレベルで、ちゃんとshutdown/closeしてやるように、管理インタフェースを追加すべきですね。
- MovingWalk
- ベストアンサー率43% (2233/5098)
ごめんなさい。質問の意図がよくわかりません。 コネクションごとにソケットがオープンされているので、切断したいソケットを クローズすればいいと思うのですが。 ソケットプログラミングに関する参考サイトを3つ紹介しておきますのでご覧ください。 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html http://www.ueda.info.waseda.ac.jp/~toyama/network/ http://x68000.startshop.co.jp/~68user/net/
お礼
回答ありがとうございます。 すいません、補足でちょっと間違えを。 切断したいのは、192.168.0.1:2421と192.168.1.3:49174間のコネクションです。
補足
プログラミングの話ではなく、OSレベルの話です。 上記サーバによって、下記のコネクションがあった場合に、ソフトウェア外から、強制的に192.168.0.1:2421だけ切断したいのです。 ソフトウェア自身の機能としてではありません。 この例に限らず、プロセスのkillではなくて、コネクションだけを切断することができないでしょうか? [root@hostname]# netstat -tn Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 192.168.0.1:2420 192.168.1.3:49170 ESTABLISHED tcp 0 0 192.168.0.1:2421 192.168.1.3:49174 ESTABLISHED tcp 0 0 192.168.0.1:2420 192.168.1.24:52744 ESTABLISHED tcp 0 0 192.168.0.1:2421 192.168.1.24:52751 ESTABLISHED
補足
>iptableにルールを追加して、パケットを拒否するようにするとか。 現在はこれを行っているのですが、CLOSEまでの時間が、アプリケーション層の実装に依ってしまうのと、元々80ちかいルールを設定しているので、あとからリストをみてルール番号を確認するのが大変面倒なのです。 >カーネルレベルでの強制切断ってのは、危ないのではないかと。 下手にこれができると、迷子のパケットが到達した時に、通信に混乱が生じる恐れがありそうな。 言われている意味が分かりません。 現在のTCP/IPで、不測の切断や、迷子のパケットによって、他に影響があるとは思えないのですが? 特にTCPでは、アクティブクローズ側はTIME-WAITで2MSL間待機しますので、カーネルレベルの切断(FINの送信)によって、迷子のパケットや不測の切断という状況はまず起こりえないですし、上位層が対応できないこともないのでしょう(通信相手がフリーズしただけでバグってしまうことになる...) 上の方法の方が、TCPコネクションを正常に終了しないので、よくないのでは? >やはりプログラムレベルで、ちゃんとshutdown/closeしてやるように、管理インタフェースを追加すべきですね。 これでは、そういった操作がしたいアプリケーション全てのソースを修正する必要があります。 少なくとも、Macでは、簡単に実現できるので、なんとかならないかなお考えているのですが。 通信の両ホストのアドレスとポートを指定して、FINパケットを送出するだけなので、どこかにそんなツールはないでしょうか?