套接字连接超时:规范在哪里?

Aub*_*bin 5 java sockets networking tcp

我工作的背景是我的局域网.

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

我遇到了以下连接超时:

  • 建立连接时为2毫秒
  • 主机处于活动状态但未侦听指定的套接字端口时为1 005 ms
  • 主机关闭时21 000 ms

这个值来自我的网络观察,但我认为它存在一个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 );
   }
}
Run Code Online (Sandbox Code Playgroud)

use*_*421 13

连接超时没有RFC.任何RFC或其他文档都不可能事先知道任何网络中的主要条件.

一般来说,您可以期待成功的连接非常快; 一个ECONNREFUSED(ConnectException: connection refused)快得多; 和连接超时(ConnectException: connect timeout),只要它需要,取决于原因,两端的平台,以及介入网络的性质.在Windows中,我认为连接超时包括三次连接尝试的总时间,超时为6s,12s和24s,总共42s; 在各种Unix中我相信总数更像是70s,这可能是由于3次尝试超时10s,20s和40s.如您所见,这取决于平台.还有一个问题是,在Windows服务器上填充积压队列将导致RST被发送到传入的SYN,在Unix/Linux服务器上,它将不会对传入的SYN产生任何响应.

您还应该注意到在Java中,与Javadoc的多年相反:

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

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