5

我的工作环境是我的局域网。

下面的代码示例是用 Java 语言编写的,但我的问题是关于 TCP,而不是编程。

我经历了以下连接超时:

  •  2 ms when connection established
    
  • 1 005 毫秒,当主机处于活动状态但未侦听指定的套接字端口时
  • 主机关闭时 21 000 毫秒

这个值来自对我的网络的观察,但我认为它存在一个 RFC。

以下是有关超时的一些信息:

你能给我更多的指点吗?

@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 );
   }
}
4

2 回答 2

13

没有关于连接超时的 RFC。任何 RFC 或其他文档都不可能提前知道任何网络中的普遍情况。

通常,您可以期望成功连接非常快;ECONNREFUSED( )差不多ConnectException: connection refused一样快;连接超时 ( ConnectException: connect timeout) 取决于原因、两端的平台以及介入网络的性质。在 Windows 中,我相信连接超时包括三个连接尝试的总时间,超时时间分别为 6 秒、12 秒和 24 秒,总共 42 秒;在各种 Unix 中,我相信总数更像是 70 秒,这可能是由于 3 次尝试超时 10 秒、20 秒和 40 秒造成的。如您所见,这取决于平台。还有一个问题是,在 Windows 服务器上填充积压队列会导致向传入的 SYN 发出 RST,而在 Unix/Linux 服务器上,这将导致对传入的 SYN 完全没有响应。

您还应该注意,在 Java 中,与多年的 Javadoc 不同:

  1. 零连接超时并不意味着无限超时,它意味着平台默认超时,如上图所示不超过约 70 秒;

  2. 您不能指定增加平台默认值的连接超时;您只能使用它来降低平台默认值。

于 2012-11-07T09:29:49.880 回答
2

正如您所发现的,您可以在connect(...)方法调用中指定超时,如下所示:

connect( SocketAddress endpoint , int timeout )

请记住“......超时为零被解释为无限超时。” (其中“无限”通常真正意味着“使用操作系统默认值”)。

至于默认值,它们取决于操作系统,但通常还是相当一致的。如果您使用的是 linux 机器,请查看/proc/sys/net/ipv4/tcp_keepalive*(但除非您知道自己在做什么,否则不要更改它们 :-)

干杯,

于 2012-11-07T09:22:49.583 回答