どのようにLinux上で/変更ソケット接続のタイムアウトを表示するには?
質問
Javaでソケットを作成する場合:
new Socket(host, port);
返す前に、ポートのソケットのコンストラクタは、のホストに接続しようとします。 Windowsでは、これが到達不能なホストのためにほとんど即座に失敗したが、Linuxのために、それはタイムアウトにソケットのために5分かかることができます。
私はソケットを作成する上でコントロールを持っている場合は、私にできることを認識しています:
Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);
私はむしろOSは、合理的なデフォルト値を使用する必要があるだろう。 Linux上でこの設定を変更する方法はありますか?
おかげ
解決
私は/proc/sys/net/ipv4/tcp_syn_retries
したいと思います。デフォルトは通常約3分に出てくる5または6である。
これらは、システム全体であることに注意してください。
他のヒント
私は変化するOSの設定に対して助言します。 Socket.setSoTimeout()
方法はあまりにもあなたを助けるかもしれません。
これは、LinuxとWindowsが異なり、ここで動作すること、ところで全く正しくありません。 (LinuxおよびWindows上で設定することができます)最初のSYNの再試行ネイバー状態だけでなく、RSTパケットを送信し、他のルータのほかにも役割を果たしています。
Windows上での接続の試みが失敗した場合immediatelly eighterルータによってRSTedたか、隣人がARPレベルに到達不能として認識された可能性が高いです。到達不能なホストを参照するには、Windows上でarp -a -v
コマンドを試してみてください - 。すぐに拒否されます。
Linuxの場合、あなたのローカルネットワーク上の局の到達可能性状態を一覧表示するip neigh
使用することになります。
これはこれは、システムのTCP / IPのデフォルトのタイムアウトに依存していることを私の理解です(デフォルトでは240秒?)...一つの選択肢は、しかし、これはに依存している同じマシン上の他のプログラムに影響を与える可能性があり、それらを微調整しようとすることですタイムアウト値。その場合には、単に代わりに、あなたのJava Connect()の呼び出しで「タイムアウト」の値を下げるために、より安全かもしれません。