我服务器中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状态?如何避免这种情况?
答案 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关闭等待状态太多的原因是什么?我该如何解决这个问题?
您的服务器正在泄漏套接字。它无法检测到客户端断开连接,或忽略它们,而没有关闭套接字。
您引用的链接无关紧要。