我的工作环境是我的局域网。
下面的代码示例是用 Java 语言编写的,但我的问题是关于 TCP,而不是编程。
我遇到过以下连接超时的情况:
该值来自对我的网络的观察,但我认为它存在 RFC。
以下是有关超时的一些信息:
- RFC 1122 https://www.rfc-editor.org/rfc/rfc1122
- RFC 793 https://www.rfc-editor.org/rfc/rfc793
-
内格尔算法 http://en.wikipedia.org/wiki/Nagle%27s_algorithm和 TCP_NO_DELAY
你能给我更多指点吗?
@Override
public void run() {
for( int port = _portFirst; port < _portLast; ++port ) {
String host = "192.168.1." + _address;
boolean success = false;
long before = System.currentTimeMillis();
try {
Socket socket = new Socket();
SocketAddress endpoint = new InetSocketAddress( host, port );
socket.connect( endpoint, 0 );
success = true;
socket.close();
}// try
catch( ConnectException c ){/**/}
catch( Throwable t ){
t.printStackTrace();
}
long duration = System.currentTimeMillis() - before;
System.err.println( host + ":" + port + " = " + duration );
_listener.hostPinged( host, port, success, duration );
}
}
没有针对连接超时的 RFC。任何 RFC 或其他文档都不可能提前了解任何网络中的普遍情况。
一般来说,您可以期望很快就能成功连接;一个ECONNREFUSED
(ConnectException: connection refused
)差不多快;和连接超时(ConnectException: connect timeout
)需要多长时间,取决于原因、两端的平台以及干预网络的性质。在 Windows 中,我认为连接超时由 3 次连接尝试的总时间组成,超时分别为 6 秒、12 秒和 24 秒,总共 42 秒;在各种 Unix 中,我相信总数更像是 70 秒,这可能是由于超时 10 秒、20 秒和 40 秒的 3 次尝试造成的。如您所见,这取决于平台。还有一个问题是,在 Windows 服务器上填充积压队列将导致向传入的 SYN 发出 RST,而在 Unix/Linux 服务器上,它将导致对传入的 SYN 根本没有响应。
您还应该注意到,在 Java 中,与多年来的 Javadoc 相反:
零连接超时并不意味着无限超时,它意味着平台默认超时,如上所示,不超过约 70 秒;
您不能指定增加平台默认值的连接超时;您只能使用它来减少平台默认值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)