处理(或)避免过多“TCP_CLOSE_WAIT”状态的最佳方法是什么?

时间:2018-01-24 06:54:31

标签: java sockets tcp httpurlconnection

我服务器中tcp关闭等待状态太多的原因是什么?我该如何解决这个问题?

这是我的java客户端调用以与服务器连接的示例代码段

    HttpURLConnection urlConnection = (HttpURLConnection) (new URL(serverUrl).openConnection());
    urlConnection.setDoOutput(true);
    urlConnection.setDoInput(true);
    urlConnection.setRequestMethod("POST"); 
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(60000);
    os = urlConnection.getOutputStream();

     //Write to output stream
    os.flush();
    os.close();

    urlConnection.connect();
    is = urlConnection.getInputStream();

    StringBuilder sb = new StringBuilder();
    br = new BufferedReader(new InputStreamReader(is));
    String eachLine = br.readLine();
    while (eachLine != null && "".equals(eachLine) == false) {
      sb.append(eachLine);
      eachLine = br.readLine();
    }
    br.close();
    is.close();
    return sb.toString();
    } catch (SocketTimeoutException se) {
             System.out.println("Socket time out exception ");
    } catch (Exception ioException) {
             System.out.println("IO Exception ");
    } finally {
       try {
        if (br != null) br.close();
       } catch (IOException ioe) {
        ioe.toString();
       }

      try {
        if (is != null) is.close();
      } catch (IOException ioe) {
        ioe.toString();
      }

      try {
       if (os != null) os.close(); 
      } catch (IOException ioe) {
       ioe.toString();
      }
    }

以下article建议保留活动时间,我可以将其与尝试将其与服务器连接的客户端代码相关联。

客户端可以在发生异常时完全读取错误流,以便可以重用底层tcp连接。

我什么时候可以获得太多的tcp close_wait状态?如何避免这种情况?

2 个答案:

答案 0 :(得分:0)

原因是您的服务器代码没有通过调用close()来主动关闭客户端连接,而是将套接字保持在一个称为"半关闭"的状态。

要解决此问题,您的服务器应检测远程主机何时关闭连接并正确关闭连接。如果您未能执行此操作,则连接将保持CLOSE_WAIT状态,直到进程本身终止并且操作系统关闭所有现有连接。

TCP连接实际上由两个半连接组成,这两个半连接可以彼此独立地关闭。一端(如下图中的A)可以在套接字上调用close(),表示它不会再发送任何数据,但另一端(如下图中的B)可能只是确认并继续向A发送数据。

(A calls close())
A -----FIN-----> B
FIN_WAIT_1       CLOSE_WAIT
A <----ACK------ B
FIN_WAIT_2

(B can send more data here, this is half-close state)

(B calls close())
A <----FIN------ B
TIME_WAIT        LAST_ACK
A -----ACK-----> B
|                CLOSED
2MSL Timer
|
CLOSED

答案 1 :(得分:0)

  

我服务器中tcp关闭等待状态太多的原因是什么?我该如何解决这个问题?

您的服务器正在泄漏套接字。它无法检测到客户端断开连接,或忽略它们,而没有关闭套接字。

您引用的链接无关紧要。