在Java中创建Socket时:
new Socket(host, port);
Socket构造函数将在返回之前尝试连接到 host:port 。在Windows上,对于无法访问的主机,这几乎立即失败,但对于Linux,Socket最多可能需要5分钟才能超时。
我知道如果我可以控制创建套接字,我可以这样做:
Socket s = new Socket();
s.bind(..);
s.connect(.., timeout);
但我宁愿让操作系统使用合理的默认值。有没有办法在Linux上更改此设置?
由于
答案 0 :(得分:9)
我想你想要/proc/sys/net/ipv4/tcp_syn_retries
。默认值通常为5或6,大约3分钟。
请注意,这些是系统范围的。
答案 1 :(得分:4)
我建议不要更改操作系统设置,因为它可能会意外地影响其他应用程序。 Socket.setSoTimeout()
方法也可能对您有所帮助。
答案 2 :(得分:2)
BTW并不完全正确,Linux和Windows的行为方式不同。除了初始SYN重试(可以在Linux和Windows上配置)之外,邻居状态以及发送RST数据包的其他路由器也起作用。
如果Windows上的连接尝试立即失败,则可能是路由器对其进行了RST,或者在ARP级别上将邻居识别为无法访问。在Windows上尝试使用arp -a -v
命令查看无法访问的主机 - 这些主机会很快被拒绝。
对于Linux,您可以使用ip neigh
列出本地网络中站点的可达性状态。
答案 3 :(得分:0)
我的理解是,这取决于系统的TCP / IP默认超时(默认为240秒?)...一个选项是尝试调整那些,但这可能会影响同一台机器上依赖于超时值。在这种情况下,简单地降低Java connect()调用中的“超时”值可能更安全。