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 秒の 3 回の接続試行の合計時間で構成されると思います。さまざまな Unix では、タイムアウトが 10 秒、20 秒、および 40 秒の 3 回の試行の結果として、合計が 70 秒に近いと思います。ご覧のとおり、それはプラットフォーム次第です。また、Windows サーバーでバックログ キューがいっぱいになると、着信 SYN に対して RST が発行されるという問題もあります。一方、Unix/Linux サーバーでは、着信 SYN に対してまったく応答しません。

また、Java では、長年の Javadoc とは異なり、次の点にも注意してください。

  1. ゼロの接続タイムアウトは、タイムアウトが無限であることを意味するのではなく、上記のように約 70 秒を超えないプラットフォームのデフォルトのタイムアウトを意味します。

  2. プラットフォームのデフォルトを増加させる接続タイムアウトを指定することはできません。プラットフォームのデフォルトを減らすためにのみ使用できます。

于 2012-11-07T09:29:49.880 に答える
2

connect(...)お気づきのように、メソッド呼び出しでタイムアウトを次のように指定できます。

connect( SocketAddress endpoint , int timeout )

そして、 「...ゼロのタイムアウトは、無限のタイムアウトとして解釈される」ことを覚えておいてください。(「無限」とは、多くの場合、「OS のデフォルトを使用する」ことを意味します)。

デフォルトに関しては、OS に依存しますが、通常はかなり一貫しています。Linuxボックスを使用している場合は、見てください/proc/sys/net/ipv4/tcp_keepalive*(ただし、何をしているのかわからない限り、変更しないでください:-)

乾杯、

于 2012-11-07T09:22:49.583 に答える