![IPv6 が有効になっている場合、Eclipse が JUnitRunner プロセスに接続するのにはなぜ時間がかかるのでしょうか?](https://rvso.com/image/1314341/IPv6%20%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81Eclipse%20%E3%81%8C%20JUnitRunner%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E3%81%AF%E3%81%AA%E3%81%9C%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
私のコンピューターで IPv6 が有効になっている場合、新しい JUnit プロセスを開始してから JUnit ビューにテスト ツリーが表示されるまでに 30 秒かかりました。
IPv6 を無効にすると、テストがすぐに表示されます。
私が確認したところ、プロセスが作成され、その後 で約 30 秒ハングしますSocketImpl.connect()
。 ではnetstat
、次のような行が表示されます。
tcp6 0 1 fe80::xxxx:xxxx:x:51019 ::1:48469 SYN_SENT
なぜそうなるのでしょうか?
答え1
一つの可能性:
ランナー プロセスは127.0.0.1
IPv4 ループバック アドレス のみをリッスンしていますが、Eclipse は に接続しようとしています。これは またはのlocalhost
いずれかであり、後者は IPv6 ループバックです。ほとんどのオペレーティング システムでは IPv6 が有効になっており、これが優先されるため、Eclipse は最初に IPv6 を試します。127.0.0.1
::1
::1
JUnitRunnerはどのIPv6アドレスもリッスンしていないため、OSはTCP RST(またはたぶん適切にファイアウォールが設定されている場合は、ICMP の「ポートに到達できません」というメッセージが表示されます。ただし、このような試行を黙ってドロップするファイアウォール構成になっている可能性があり、クライアント (Eclipse) は送信されない応答を待機することになります。
まず、ファイアウォールの設定 ( ip6tables
) を確認してください。ループバック接続をブロックする理由はまったくありません。ファイアウォールを一時的に無効にしてテストしてください。それでも問題が解決しない場合は、Eclipse が を使用するように設定できるかどうか127.0.0.1
、または JUnit が IPv6 と IPv4 の両方でリッスンするように設定できるかどうかを確認してください。