2015年5月8日金曜日

Java でClose したPort にアクセスした場合について

閉じているポートにアクセスすると、以下のException がでる。
java.net.ConnectException: Connection refused: connect
 at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
 at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
 at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
 at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
 at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
 at java.net.Socket.connect(Socket.java:579)

では、これはなぜおこるのか、というと以下の記載がありました。
http://docs.oracle.com/cd/E19455-01/806-2720/msgs-175/index.html

[ 抜粋 ]
[ 原因 ]
対象のマシンが拒否したため、接続できません。
アクティブでないサービスに接続しようとした場合、または要求したアドレスにサービスプロセスが存在しなかった場合に起こります。

[ 対処方法 ]
対象のマシン上のサービスをアクティブにするか、またはサービスがなくなっていた場合は再度起動します。
セキュリティ上の理由からこのサービスを提供したくない場合は、ユーザーグループにそのことを伝え、できれば代替サービスを提供します。

では、なぜConnection refused になるのでしょうか?
その答えは以下に有りました。
http://www5d.biglobe.ne.jp/stssk/rfc/rfc793j.html

[ 抜粋 ]
1.  If the connection does not exist (CLOSED) then a reset is sent
    in response to any incoming segment except another reset.  In
    particular, SYNs addressed to a non-existent connection are rejected
    by this means.

つまり、CLOSED の状態のポートにアクセスすると、リセットがレスポンスとしてアクセス元に送られるそうです。

で、リセットって何?とググると、以下が出てきました。
http://e-words.jp/w/RST%E3%83%91%E3%82%B1%E3%83%83%E3%83%88.html

[ 抜粋 ]
TCPで接続を中断・拒否する際に送られるパケット。
TCPヘッダの制御フラグでRSTフィールドがセットされたパケットのこと。
接続要求を拒絶したり、確立された接続を一方的に切断する際に送られるもの。

最後に、ポートを閉じている、とはどういう状態か、という点に関しては、RFC793 ではCLOSED の状態である、ということでした。

0 件のコメント:

コメントを投稿