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 件のコメント:
コメントを投稿